vb.netconsoleglobalbasic

Visual Basic Console - A global command & answer string


I'm creating a text based adventure game and would like to create some "global" commands & answers that would work anywhere no matter where your are. For the global answers if we look at this code:

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

Now as you can see I have to create a string for each new user input. I've tried doing a Public answer As String = Console.ReadLineand then having things react to "answer" but if I reused a keyword like number 1 in the code up top the program would not wait for user input and just go down the path of number 1. The first option seems like a bunch of spagettih code and the second option dose not seem to work or I myself am not getting it to work so any tips here would be nice.

I also want to know if its possible to create a global string or something of sorts. Say that No matter if I were at the point where I'm supposed to give input to answer 1 or 2, if I typed in "inventory" it would open another sub called inventory. Now if possible I want to do this without having to have an if answer = inventory then Inventory().

Thanks in advance everyone ^^

Following the advice given to my by b.pell I was able to create a "GameCommand" sub but I'm not facing a problem of how to implement these into the game itself/make them accessible without ruining the game flow. I am also not quite sure how to write a command that will modify something in GameCommand.vb (say if the player gets an item how would I add it to the inventory list?)

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

The GameCommand.vb file is the same as the one in p.bells comment.


Solution

  • You could create an interpreter function that processes all commands and then do what you want in there. So everytime you read input in, just pass it along to the interpreter sub.

    interpreter("inventory")
    

    Inside of there, you could do an break that command up (if it has arguments). You could do a basic if statement and execute your sub procedures based off of that.

    You could go above and beyond (this answers your question about not having to write the if's) and create a commands class that has all of your command methods on it (Inventory, North, South, East, West, Look) and then when a user enters a command you could use reflection to check that class to see if that sub/function exists (and then invoke it). The benefit of that is, as you add methods to the command class you never have to update the if logic in your interpreter again.

    E.g. You would add a "Public Sub Look()" or "Public Sub Look(args as String) to the command class.. your interpreter would then try to invoke the look command (and maybe pass it the rest of the arguments). If it wasn't found, you tell the user it wasn't a command, if it was, it executes (google search for invoking). This means as you add Sub's the interpreter just picks them up.

    Here is an MSDN article that should get you going, you can use VB's CallByName function, you pass it your class, then the proc name you want to execute with an args:

    https://msdn.microsoft.com/en-us/library/chsc1tx6(v=vs.80).aspx

    Here is a simple example (a console application):

    Module1:

    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