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

问题描述 投票:0回答:2

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

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 评论中的相同。

vb.net console global basic
2个回答
3
投票

您可以创建一个解释器函数来处理所有命令,然后在其中执行您想要的操作。因此,每次读取输入时,只需将其传递给解释器子即可。

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

0
投票

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

在你的主模块中,循环遍历每个“回合”的过程。

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.