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();
        }
    }
Другие вопросы по тегам