2015-10-07 2 views
1

Я создаю текстовую приключенческую игру и хотел бы создать некоторые «глобальные» команды & ответы, которые будут работать везде, где бы вы ни находились. Для глобальных ответов, если мы посмотрим на этот код:Visual Basic Console - глобальная команда и строка anwser

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.

ответ

3

Вы можете создать функцию интерпретатора, которая обрабатывает все команды, а затем выполняет то, что вы хотите там. Поэтому каждый раз, когда вы читаете ввод, просто передавайте его вместе с субстратом-интерпретатором.

interpreter("inventory") 

Внутри там вы можете сделать перерыв, чтобы команда (если у нее есть аргументы). Вы можете сделать базовый оператор if и выполнить свои подпрограммы, основанные на этом.

Вы можете пойти выше и дальше (это отвечает на ваш вопрос о том, что вам не нужно писать if) и создать класс команд, на котором есть все ваши командные методы (Inventory, North, South, East, West, Look) а затем, когда пользователь вводит команду, вы можете использовать отражение, чтобы проверить этот класс, чтобы увидеть, существует ли эта суб/функция (и затем вызывать ее). Преимущество этого заключается в том, что при добавлении методов в командный класс вам больше не придется обновлять логику if в вашем интерпретаторе.

E.g. Вы добавили бы «Public Sub Look()» или «Public Sub Look» (args as String) в класс команд. Ваш интерпретатор попытается вызвать команду look (и, возможно, передать остальные аргументы). он не был найден, вы говорите пользователю, что это не команда, если он был, он выполняет (поиск google для вызова). Это означает, что при добавлении Sub интерпретатор просто подбирает их.

Вот статья MSDN, которая должна заставить вас идти, вы можете использовать функцию CallByName VB, вы передаёте свой класс, то имя процесса вы хотите выполнить с аргументами:

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

Здесь простой пример (консольное приложение):

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 
+0

Обновлено командой VB для динамического вызова метода в классе. Это делает весь тяжелый подъем. –

+0

Эй вы могли бы предоставить мне пример кода, пожалуйста? Я не уверен, что я полностью понял все. EDIT: Woah пропустил это редактирование, дайте мне секунду! –

+0

Спасибо за пример. Я довольно новичок, когда дело доходит до программирования чего-либо, поэтому примеры действительно помогают тонну :) –

0

Я хотел бы подойти текстовое приключение со следующей общей структурой:

В вашем главном модуле, через цикл процесса каждого «поворот».

  1. Показать любой текст запроса, если необходимо.
  2. Прочитайте ввод пользователя.
  3. Проверить список глобальных команд и выполнить соответственно.
  4. Проверить список локальных команд и выполнить соответственно.
  5. Показать сообщение об ошибке.

Каждая команда, которую вы выполнить необходимо выполнить следующие действия:

  1. Расчет изменения любых переменных, затронутых командой
  2. Проверьте каждое возможное изменение статуса игры сверху вниз, и выполнить последующие команды соответственно. (E.G. Смерть игрока, успех/неудача миссии, побежденный враг и т. Д.)

  3. Продвиньте рассказ в нужное место.

+0

Я постараюсь сделать что-то подобное в своей игре. Я просто проверяю ситуацию на данный момент и предоставил код в своем сообщении в качестве примера. –