得到了这段代码:
private void runGame() {
boolean won = false;
while(won == false) {
System.out.println("DEBUG A");
Player p = this.nextPlayer();
System.out.println("DEBUG B");
Scanner s = new Scanner(System.in);
if(p.getPlayerType() == 0) {
System.out.println("DEBUG C");
// is Human
BoardPrinter.printBoard(this.b);
// Choose figure
BoardPrinter.printFigureChoose(this.b.getFiguresFromPlayer(p.getSymbol()),p);
int id = this.checkInput(1,this.b.getFiguresFromPlayer(p.getSymbol()).size(),s.nextInt());
Figure f = this.b.getFiguresFromPlayer(p.getSymbol()).get(id - 1);
// Choose move
ArrayList<Move> moves = b.checkMoves(f);
BoardPrinter.printMoveChoose(moves,p);
int moveID = this.checkInput(1,moves.size(),s.nextInt());
Move m = moves.get(moveID - 1);
// Execute the chosen move
this.b.getCellAt(f.getLocation().getX(), f.getLocation().getY()).setSymbol(Symbol.EMPTY);
f.setLocation(m.getTarget());
this.b.getCellAt(m.getTarget().getX(), m.getTarget().getY()).setSymbol(p.getSymbol());
// Check win conditions
won = this.checkVictory(p);
System.out.println("DEBUG D");
}
else {
// KI stuff
KI k = new KI(this.b,p,p.getPlayerType());
Move m = k.think();
// Execute chosen move
Figure f = this.b.getFigureAt(m.getStart());
this.b.getCellAt(m.getStart().getX(), m.getStart().getY()).setSymbol(Symbol.EMPTY);
f.setLocation(m.getTarget());
this.b.getCellAt(m.getTarget().getX(), m.getTarget().getY()).setSymbol(p.getSymbol());
}
// Decomment this to get debug info
//DebugPrinter.print(this.b);
s.close();
}
}
目前我收到了java.util.NoSuchElementException。是的,我知道我的意思,我google了很多。我还是不明白为什么会被抛出。此外,我只获得我的调试输出,直到&#34; C&#34;。
如果我将扫描仪初始化移到while循环之外,我就不会再获得该异常了。但是我确实感到困惑,代码停在Debug&#34; A&#34;没有别的。
我有两个人类玩家时遇到过这种情况。有趣的事实:第一个玩家将永远完美地工作。玩家可以看到董事会,选择一个图,选择一个移动并执行它。每当下一个while()运行开始并且第二个玩家考虑到它就会失败,因为我上面描述它取决于我的扫描仪初始化的位置。
有没有猜到问题是什么?非常感谢! :)
答案 0 :(得分:3)
在while循环结束时关闭扫描仪。这意味着下次您尝试从扫描仪中读取内容时,您将获得NoSuchElementException
。