Visual Basic 控制台 - 全局命令和答案字符串

Visual Basic Console - A global command & anwser string

我正在创建一个基于文本的冒险游戏,我想创建一些 "global" 命令和答案,无论您身在何处都可以在任何地方使用。 如果我们看一下这段代码,对于全局答案:

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 然后让事情对 "answer" 做出反应但是如果我在顶部的代码中重复使用像数字 1 这样的关键字程序将不会等待用户输入并且只是沿着路径第 1 个选项。第一个选项似乎是一堆意大利面条代码,第二个选项似乎不起作用,或者我自己没有让它起作用,所以这里的任何提示都很好。

我还想知道是否可以创建全局字符串或类似的东西。假设无论我是在我应该输入答案 1 还是 2 的时候,如果我输入 "inventory",它都会打开另一个名为 inventory 的子项。现在,如果可能的话,我想这样做 不必 if answer = inventory then Inventory().

先谢谢大家^^

根据 b.pell 给我的建议,我能够创建一个 "GameCommand" 子程序,但我没有遇到如何将这些实现到游戏中的问题 itself/make在不破坏游戏流程的情况下访问它们。我也不太确定如何编写一个命令来修改 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's 的问题)并创建一个命令 class 上面有你所有的命令方法(库存,北,南,东, West, Look),然后当用户输入命令时,您可以使用反射来检查 class 以查看 sub/function 是否存在(然后调用它)。这样做的好处是,当您向命令添加方法时 class 您永远不必再次更新解释器中的 if 逻辑。

例如您可以将 "Public Sub Look()" 或 "Public Sub Look(args as String) 添加到命令 class.. 然后您的解释器将尝试调用 look 命令(并可能将其余的传递给它的参数)。如果没有找到,你告诉用户它不是命令,如果是,它会执行(google 搜索调用)。这意味着当你添加 Sub 时,解释器只是选择他们起来。

这是一篇 MSDN 文章,可以帮助您开始,您可以使用 VB 的 CallByName 函数,将您的 class 传递给它,然后将您要执行的 proc 名称与 args 一起传递:

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

我会采用以下一般结构来进行文本冒险:

在您的主模块中,遍历每个 "turn".

的过程
  1. 根据需要显示任何提示文本。
  2. 读取用户输入。
  3. 检查全局命令列表并适当执行。
  4. 检查本地命令列表并适当执行。
  5. 显示错误信息。

您执行的每个命令都应执行以下操作:

  1. 计算受命令影响的任何变量的变化
  2. 自上而下检查每一个可能的游戏状态变化,并酌情执行后续命令。 (例如,玩家死亡、任务 success/failure、敌人被击败等)

  3. 将故事推进到合适的地方。