我对Swing很新,但不是Java。无论如何,我有一个国际象棋程序。以下是游戏循环类的重要部分:
public class game {
static Board gameboard = new Board();
public static boolean waitstatus = true;
public static char currentfaction = 'w';
public static boolean done = false;
public static boolean resigned = false;
public static boolean wplayern = false;
public static boolean bplayern = false;
public static gui boardwindow = new gui();
public static void main(String[] args) {
gameboard.init(8, 8);
gui.startGUI(boardwindow);
runner();
while (true) {
//spin
}
}
public static void runner() {
done = false;
resigned = false;
wplayern = false;
bplayern = false;
boolean stalemate = false;
while (true) {
//The loop stuff
}
}
public static void resetGame() {
if (!done) {
System.out.println("Game's not finished yet!");
} else {
gameboard.restart();
waitstatus = true;
currentfaction = 'w';
done = false;
resigned = false;
wplayern = false;
bplayern = false;
boardwindow.redraw();
rerun();
}
}
public static void rerun() {
runner();
}
}
这就是有问题的代码。顺便说一下,boardwindow是一个gui对象,gameboard是我的内部逻辑游戏板数组,redraw()有gui重绘(更新片段的位置),而restart()重启内部逻辑板到原始的游戏状态。 gui类是一个非常简单的摇摆gui,效果很好。问题是,在游戏循环中,当它是将死时,循环中断并且runner()函数结束。然后,用户应该能够按下gui中的新游戏按钮,以便在将死后重新开始游戏。新游戏按钮调用resetGame()。问题是,当再次调用runner()时,gui窗口会冻结,我不知道为什么,它不需要多个线程,我想。我有其他按钮调用我没有给你显示的函数,这些函数调用其他函数,如restart()等,它们没有问题,只有在调用runner()时才有。
我知道我的其他代码在格式化和约定方面可能很糟糕,但请尽量将答案集中在主要问题上。
由于
答案 0 :(得分:3)
你应该设置一个条件来控制循环,而不是将其设置为 true 。在这里,即使在从resetGame()重置游戏后,循环也会继续运行;或使用休息;
public static void runner() {
done = false;
resigned = false;
wplayern = false;
bplayern = false;
boolean stalemate = false;
while (true) {
//The loop stuff
if(newGameClicked == true){//just to literally make meaning
break;
}
}
}
或者作为快速修复,您只需调用boardwindow.dispose();然后创建一个新的gui()实例并将其设置为visible()以在单击新游戏按钮时重新启动游戏