Java: выбор объекта в текстовой игре
Я работал над текстовой игрой для класса и смог получить большую часть ее работы с небольшими пробами и ошибками. Но я столкнулся с препятствиями при разборе пользовательского ввода, который мне уже пришлось упростить больше, чем мне нравится. Идея состоит в том, чтобы иметь метод, который принимает строку в качестве входных данных, а затем вызывает метод в объекте, который был создан в другом классе. Вот код, и да, я знаю, что это запутанный беспорядок.
Кажется, я поставил этот вопрос немного плохо. На самом деле я не столкнулся с какой-либо проблемой, кроме того, что понятия не имел, как делать то, что я хочу. Подход, предложенный Гилбертом Ла Бланком, был очень хорошим, и он решил мою проблему. Может быть, я на самом деле пройдет этот финал! Спасибо за вашу помощь.
import java.util.Scanner;
public class Parser{
static String[] Prepositions = {"on", "in", "under"};
static String Word;
public static void Parse(String Raw){
Raw.toLowerCase(); //Make input lower case
Scanner Splitter = new Scanner(Raw).useDelimiter(" "); //Split into seperate words
Word = Splitter.next(); //Get first word
Splitter.close();
CheckFirst(Word);
}
public static void CheckFirst(String Word){
switch(Word){
case "north":
case "n":
case "south":
case "s":
case "east":
case "e":
case "west":
case "w":
Player.Location.LeaveRoom(Word);
break;
case "take": TakeWhat(); break;
default: System.out.print("That was absolute gibberish!"); break;
}
}
public static void TakeWhat(){
System.out.println("Take what?");
System.out.print("> ");
String ToTake = Game.Input.next();
ToTake.toLowerCase();
switch(ToTake){
case "key": break;
default: TakeWhat();
}
}
}
1 ответ
У вас уже есть два набора слов (предлоги, слово) и вы добавляете третий набор (объект). Вы можете видеть, как операторы if / switch будут выглядеть непривлекательно.
Один из способов справиться с этим - создать список слов и действий.
Вы бы начали с интерфейса.
package com.ggl.text.game;
public interface WordAction {
public boolean isWord(String word);
public void execute();
}
Далее вы создаете классы для выполнения действий, соответствующих словам. Вот один пример класса.
package com.ggl.text.game;
public class NorthAction implements WordAction {
private static final String WORD = "north";
@Override
public boolean isWord(String word) {
word = word.toLowerCase();
if (WORD.equals(word) || (WORD.startsWith(word))) {
return true;
} else {
return false;
}
}
@Override
public void execute() {
// TODO Move player North
}
}
Наконец, вы создаете список классов WordAction. Вы добавляете все созданные вами классы действий в Список.
List<WordAction> actions = new ArrayList<WordAction>();
actions.add(new NorthAction());
Позже, когда вы проанализировали входную строку, вы выполните итерацию по списку и выполните метод execute следующим образом.
for (WordAction wordAction : actions) {
if (wordAction.isWord("north")) {
wordAction.execute();
}
}