我正在创建一个基于文本的冒险游戏,并希望创建一些“全局”命令和答案,无论您身在何处,它们都可以在任何地方使用。 对于全局答案,如果我们看一下这段代码:
Module Module1
Private Property answer1 As String
Private Property answer2 As String
Sub Main()
Console.WriteLine("Welocome to the training grounds!")
Console.WriteLine("What would you like to do? 1. I would like to train on dummies")
answer1 = Console.ReadLine()
Console.WriteLine()
If answer1 = "1" Then
Console.WriteLine("Okay what now?")
answer2 = Console.ReadLine
If anwser2 = "1" Then Console.WriteLine("New option")
End If
End Sub
现在如您所见,我必须为每个新用户输入创建一个字符串。我尝试过执行
Public answer As String = Console.ReadLine
然后让事物对“答案”做出反应,但是如果我在顶部的代码中重复使用像数字 1 这样的关键字,程序将不会等待用户输入,而只会沿着数字 1 的路径走下去。第一个选项似乎是一堆意大利面条代码,第二个选项似乎不起作用,或者我自己无法让它工作,所以这里的任何提示都会很好。
我还想知道是否可以创建全局字符串或类似的东西。说无论我是否处于应该输入答案 1 或 2 的位置,如果我输入“库存”,它都会打开另一个名为库存的子项。现在,如果可能的话,我想做到这一点而无需必须拥有
if answer = inventory then Inventory()
。
先谢谢大家了^^
按照 b.pell 给我的建议,我能够创建一个“GameCommand”子项,但我没有面临如何将这些子项实现到游戏本身/使它们可访问而不破坏游戏流程的问题。我也不太确定如何编写一个命令来修改 GameCommand.vb 中的某些内容(比如说,如果玩家获得一个项目,我将如何将其添加到库存列表中?)
Module Module1
Sub Main()
Dim gc As New GameCommand
If Console.ReadLine = "Go to dummy" Then Dummy() Else
CallByName(gc, Console.ReadLine, CallType.Method, "")
End Sub
Sub Dummy()
Console.WriteLine("I am dummy hear me roar")
Return
End Sub
End Module
GameCommand.vb 文件与 p.bells 评论中的相同。
您可以创建一个解释器函数来处理所有命令,然后在其中执行您想要的操作。因此,每次读取输入时,只需将其传递给解释器子即可。
interpreter("inventory")
在其中,您可以中断该命令(如果它有参数)。您可以执行基本的 if 语句并据此执行您的子过程。
您可以超越(这回答了您关于不必编写 if 的问题)并创建一个命令类,其中包含所有命令方法(库存、北、南、东、西、外观),然后当用户输入命令,您可以使用反射来检查该类以查看该子/函数是否存在(然后调用它)。这样做的好处是,当您向命令类添加方法时,您不必再次更新解释器中的 if 逻辑。
例如您可以将“Public Sub Look()”或“Public Sub Look(args as String)”添加到命令类中。然后您的解释器将尝试调用look命令(并且可能将其余参数传递给它)。如果没有找到,你告诉用户这不是一个命令,如果是,它就会执行(谷歌搜索调用)。这意味着当你添加 Sub 时,解释器只会拾取它们。
这里有一篇 MSDN 文章应该可以帮助您,您可以使用 VB 的 CallByName 函数,将您的类传递给它,然后使用参数传递您想要执行的过程名称:
https://msdn.microsoft.com/en-us/library/chsc1tx6(v=vs.80).aspx
这是一个简单的示例(控制台应用程序):
模块1:
Module Module1
Sub Main()
Dim gc As New GameCommand
CallByName(gc, "Inventory", CallType.Method, "")
' Will look south
CallByName(gc, "Look", CallType.Method, "south")
' Will try to look southeast, but we don't accept that as a valid direction
CallByName(gc, "Look", CallType.Method, "southeast")
Console.ReadKey()
End Sub
End Module
GameCommand.vb:
Public Class GameCommand
Sub New()
End Sub
Public Shared Sub Inventory(arg As String)
Console.WriteLine("Execute code to show inventory")
End Sub
Public Shared Sub Look(direction As String)
If direction <> "north" And _
direction <> "south" And _
direction <> "east" And _
direction <> "west" Then
Console.WriteLine("Invalid direction")
Exit Sub
End If
Console.WriteLine("You look " & direction)
End Sub
End Class
我会采用以下一般结构来进行文本冒险:
在你的主模块中,循环遍历每个“回合”的过程。
您执行的每个命令都应执行以下操作:
自上而下检查每一个可能的游戏状态变化,并酌情执行后续命令。 (例如玩家死亡、任务成功/失败、敌人被击败等)
将故事推进到适当的地方。