【发布时间】:2019-04-19 20:38:21
【问题描述】:
我自己承担了学习 Java 的任务。我的想法是创建一个只有文本控制台的简单游戏。 “AI”(计时器)会定期发送一个字符串,玩家必须写一个正确的字符串作为响应,否则他/她会失去生命。
因此,我的第一个问题是:有没有一种简单的方法可以将计时器和扫描仪结合起来?我需要它不断地“监视”控制台行中的字符串。
经过一段时间的搜索和尝试,我在生成或生成字符串时最困难的地方是扫描文本,在扫描时我发现了以下代码,但它有一个问题:
if ((name =in.nextLine(2000)) ==null)
如果我将条件重写为,例如,与 !="a" 而不是 null 进行比较,代码将忽略该条件并始终写入“太慢了!”无论。如果是 =="a" 它总是说 Hello, a。我完全不明白为什么,它似乎忽略了逻辑。 所以第二个问题是,为什么当它不同时它会忽略逻辑?我该如何解决?
public class TimedScanner
{
public TimedScanner(InputStream input)
{
in = new Scanner(input);
}
private Scanner in;
private ExecutorService ex = Executors.newSingleThreadExecutor(new ThreadFactory()
{
@Override
public Thread newThread(Runnable r)
{
Thread t = new Thread(r);
t.setDaemon(true);
return t;
}
});
public static void main(String[] args) {
TimedScanner in = new TimedScanner(System.in);
int playerHealth = 5;
System.out.print("Enter your name: ");
try {
while (playerHealth > 0) {
String name = null;
if ((name = in.nextLine(3000)) ==null) {
System.out.println(name);
System.out.println("Too slow!");
playerHealth--;
} else {
System.out.println(name);
System.out.println("Hello, " + name);
}
}
} catch (InterruptedException | ExecutionException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
}
public String nextLine(int timeout) throws InterruptedException, ExecutionException
{
Future<String> result = ex.submit(new Worker());
try
{
return result.get(timeout, TimeUnit.MILLISECONDS);
}
catch (TimeoutException e)
{
return null;
}
}
private class Worker implements Callable<String>
{
@Override
public String call() throws Exception
{
return in.nextLine();
}
}
}
这是关于它应该做什么的非常简单的想法。在此期间,我计划放入一个随机选择的字符串,它将与控制台输入和错误输入进行比较 = playerHealth--;正确输入其他内容。
【问题讨论】:
-
数字是一个时间窗口,用户必须在其中编写他/她的答案,该方法在代码中定义为倒数第二个。
-
哦,我的错,我没有一直向下滚动(: