Java: 在基于文本的游戏中选择对象
Java: Selecting object in text based game
我一直在为 class 开发一款基于文本的游戏,并且已经能够通过一些尝试和错误来获得大部分内容。但是我 运行 遇到了用户输入解析的障碍,我已经不得不对其进行比我喜欢的更多的简化。这个想法是有一个方法将字符串作为输入,然后调用在另一个 class 中实例化的对象中的方法。这是代码,是的,我知道这是一团乱麻。
看来我这个问题措辞有点不好。除了不知道如何做我想做的事情之外,我实际上没有遇到任何问题。 Gilbert La Blanc 建议的方法非常好,并且解决了我的问题。也许我真的会通过这次决赛!谢谢大家的帮助。
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();
}
}
}
您已经有两组词(介词、词),正在添加第三组(宾语)。您可以看到 if / switch 语句如何变得异常。
管理此问题的一种方法是创建一个单词和动作列表。
您将从界面开始。
package com.ggl.text.game;
public interface WordAction {
public boolean isWord(String word);
public void execute();
}
接下来,您创建 classes 来执行与单词对应的操作。这是一个示例 class.
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 classes 列表。您将创建的所有操作 classes 添加到列表中。
List<WordAction> actions = new ArrayList<WordAction>();
actions.add(new NorthAction());
稍后,当您解析了输入字符串后,您将遍历 List 并像这样执行 execute 方法。
for (WordAction wordAction : actions) {
if (wordAction.isWord("north")) {
wordAction.execute();
}
}
我一直在为 class 开发一款基于文本的游戏,并且已经能够通过一些尝试和错误来获得大部分内容。但是我 运行 遇到了用户输入解析的障碍,我已经不得不对其进行比我喜欢的更多的简化。这个想法是有一个方法将字符串作为输入,然后调用在另一个 class 中实例化的对象中的方法。这是代码,是的,我知道这是一团乱麻。
看来我这个问题措辞有点不好。除了不知道如何做我想做的事情之外,我实际上没有遇到任何问题。 Gilbert La Blanc 建议的方法非常好,并且解决了我的问题。也许我真的会通过这次决赛!谢谢大家的帮助。
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();
}
}
}
您已经有两组词(介词、词),正在添加第三组(宾语)。您可以看到 if / switch 语句如何变得异常。
管理此问题的一种方法是创建一个单词和动作列表。
您将从界面开始。
package com.ggl.text.game;
public interface WordAction {
public boolean isWord(String word);
public void execute();
}
接下来,您创建 classes 来执行与单词对应的操作。这是一个示例 class.
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 classes 列表。您将创建的所有操作 classes 添加到列表中。
List<WordAction> actions = new ArrayList<WordAction>();
actions.add(new NorthAction());
稍后,当您解析了输入字符串后,您将遍历 List 并像这样执行 execute 方法。
for (WordAction wordAction : actions) {
if (wordAction.isWord("north")) {
wordAction.execute();
}
}