我正在制作一个基于文本的RPG,我想实现一个通用命令“use”,它将激活一个项目的效果(装备武器/饮料药水/发射烟火)。所有这些都准备好了方法通知。但是我需要通过HashSet通过String选择特定项,而不使用.contains。
这是我的InputReader类
import java.util.HashSet;
import java.util.Scanner;
public class InputReader
{
private Scanner reader;
/**
* Create a new InputReader that reads text from the text terminal.
*/
public InputReader()
{
reader = new Scanner(System.in);
}
/**
* Read a line of text from standard input (the text terminal),
* and return it as a set of words.
*
* @return A set of Strings, where each String is one of the
* words typed by the user
*/
public HashSet<String> getInput()
{
System.out.print("> "); // print prompt
String inputLine = reader.nextLine().trim().toLowerCase();
String[] wordArray = inputLine.split(" "); // split at spaces
// add words from array into hashset
HashSet<String> words = new HashSet<String>();
for(String word : wordArray) {
words.add(word);
}
return words;
}
}
这是我开始制作RPG的方法。
public void startBattle() {
printWelcomeMessage();
boolean finished = false;
while(!finished && monsters.size() > 0) {
HashSet<String> commands = reader.getInput();
if(commands.contains("use"))
{
// Use an item by name after the word "use" else print "didn't specify item"
}
我已经尝试了很多方法作为不同格式的ArrayLists的流(我不知道如何使用)。我怎么能简单地把所有这些单词,把它们粘贴到一个ArrayList中,然后在我的Player类中使用这个方法迭代检查我可能拥有的项目(如果它找到一个项目也停止,我不想让它使用它一次在字符串中找到的每一个项目:
public Item findItem(String search) {
return this.items.get(search);
}
项目是HashMap格式的播放器库存
答案 0 :(得分:0)
如前所述:摆脱HashSet。它不会帮助你。正如shomsel已经指出的那样,Set没有被订购的事实使得它成为你的问题的不好选择。
您收到的每个输入都由一串字符组成。这些字符形成标记 - 例如,您使用空格作为分隔符,它只是流中的一个cartein标记。这些令牌是语言的词 - 你确实在这里处理一种语言 - 你想要建立。
首先,您需要一个标记器:一些软件可以将字符流转换为标记流。您已经实现了分隔符令牌的处理:
String[] wordArray = inputLine.split(" "); // split at spaces
现在你必须实现解析存储在String-Array中的标记。这是一个更难的部分。
如果在您的令牌流中的正确上下文中使用了此单词,您将迭代这些单词并决定。简单地说:您需要进行某种语法检查。
在确定您已经收到了必须构建的语法正确的令牌/单词流之后 - 例如 - 执行令牌流所描述的所需操作的决策树。我想这将是最困难的部分。
我建议你看一下Antlr:http://www.antlr.org/
它是构建词法分析器/解析器的工具,对于这个问题可能是很好用的。
祝你好运
亚历
答案 1 :(得分:0)
让我们首先看一下,在您的情况下使用HashSet是完全错误的,因为它不会保留顺序。
简单的例子:
Set<String> set = new HashSet<>();
set.add("use");
set.add("zebra");
System.out.println(set);
// [zebra, use]
这显然不是你想要的。
我建议使用队列:
Queue<String> words = new LinkedList<>();
words.add("some");
words.add("junk");
words.add("use");
words.add("zebra");
words.add("Run");
words.add("away");
while(!words.isEmpty()) {
String word = words.poll();
if ("use".equalsIgnoreCase(word)) {
String subject = words.poll();
System.out.println(String.format("Using %s", subject));
break; //This will leave your current loop
}
}
System.out.println("Left to do " + words.toString());