此代码导致无限循环
This code is resulting in an infinite loop
我正在 Java 开发一款基本的井字棋玩家对战游戏,但在 运行 上它会导致无限循环。没有语法错误。我是编程新手,所以代码有些乱。谢谢。
这里是代码(逻辑代码,不是图形)
class handler implements ActionListener{
public void actionPerformed (ActionEvent evt) {
int i = 1;
boolean b1xon=false;
boolean b2xon=false;
boolean b3xon=false;
boolean b4xon=false;
boolean b5xon=false;
boolean b6xon=false;
boolean b7xon=false;
boolean b8xon=false;
boolean b9xon=false;
boolean b1oon=false;
boolean b2oon=false;
boolean b3oon=false;
boolean b4oon=false;
boolean b5oon=false;
boolean b6oon=false;
boolean b7oon=false;
boolean b8oon=false;
boolean b9oon=false;
boolean win=false;
do {
if ((evt.getSource() == b1) && (i == 1)) {
b1.setText("X");
i++;
b1xon=true;
}
else if (evt.getSource() == b1 && i == 2) {
b1.setText("O");
i = 1;
b1oon=true;
}
else if (evt.getSource() == b2 && i == 1) {
b2.setText("X");
i++;
b2xon=true;
}
else if (evt.getSource() == b2 && i == 2) {
b2.setText("O");
i = 1;
b2oon=true;
}
else if (evt.getSource() == b3 && i == 1) {
b3.setText("X");
i++;
b3xon=true;
}
else if (evt.getSource() == b3 && i == 2) {
b3.setText("O");
i = 1;
b1xon=true;
}
else if (evt.getSource() == b4 && i == 1) {
b4.setText("X");
i++;
b4xon=true;
}
else if (evt.getSource() == b4 && i == 2) {
b4.setText("O");
i = 1;
b1xon=true;
}
else if (evt.getSource() == b5 && i == 1) {
b5.setText("X");
i++;
b5xon=true;
}
else if (evt.getSource() == b5 && i == 2) {
b5.setText("O");
i = 1;
b1xon=true;
}
else if (evt.getSource() == b6 && i == 1) {
b6.setText("X");
i++;
b6xon=true;
}
else if (evt.getSource() == b6 && i == 2) {
b6.setText("O");
i = 1;
b1xon=true;
}
else if (evt.getSource() == b7 && i == 1) {
b7.setText("X");
i++;
b7xon=true;
}
else if (evt.getSource() == b7 && i == 2) {
b7.setText("O");
i = 1;
b1xon=true;
}
else if (evt.getSource() == b8 && i == 1) {
b8.setText("X");
i++;
b8xon=true;
}
else if (evt.getSource() == b8 && i == 2) {
b8.setText("O");
i = 1;
b1xon=true;
}
else if (evt.getSource() == b9 && i == 1) {
b9.setText("X");
i++;
b9xon=true;
}
else if(evt.getSource() == b9 && i==1){
b9.setText("O");
i = 1;
b1xon=true;
}
if((b1xon&&b2xon&&b3xon)||(b4xon&&b5xon&&b6xon)||(b7xon&&b8xon&&b9xon)||(b1xon&&b4xon&&b7xon)||(b2xon&&b5xon&&b8xon)||(b3xon&&b6xon&&b9xon)||(b1xon&&b5xon&&b9xon)||(b3xon&&b5xon&&b7xon)){
win=true;
}
else if((b1oon&&b2oon&&b3oon)||(b4oon&&b5oon&&b6oon)||(b7oon&&b8oon&&b9oon)||(b1oon&&b4oon&&b7oon)||(b2oon&&b5oon&&b8oon)||(b3oon&&b6oon&&b9oon)||(b1oon&&b5oon&&b9oon)||(b3oon&&b5oon&&b7oon)){
win=true;
}
}while(!win);
您正在重复循环同一事件。因此,条件永远不会改变。每个循环迭代都考虑相同的 ActionEvent
对象,由 evt
的相同值引用。每次循环迭代都会重复相同的 if
或 else-if
子句,永远将相同的玩家棋子放在相同的位置。
无限循环从第一步开始。但是 win=true
语句只能在多次移动之后发生。所以那些永远不会发生,while (!win)
永远是真的。
如果要在方法内循环,则需要在循环内获取下一个事件。
如果您希望调用该方法来响应事件,则不需要在方法内使用循环。
顺便说一句,作为学习 Java 的人,您有时会接触到数组。可以使用包含表示 X、O 或两者都不表示的值的 3x3 数组来简化此特定代码。
此外,您似乎有一些复制和粘贴错误。我不认为你打算
b1xon=true;
在一些应该检查 Os 的 else-if 中。例如,
else if (evt.getSource() == b8 && i == 2) {
b8.setText("O");
i = 1;
b1xon=true;
}
正如 Andy 所说,事件处理程序中的循环是无限循环的主要原因。
我不确定您是如何设置 GUI 的,但是您的 win 变量永远不会设置为 true。当你点击一个按钮时(第一次方法是 运行),你的循环被执行并且设置 win = true 的条件永远不会发生。您需要删除 do while。除此之外,您需要在 actionPerformed 方法之外声明您的变量,否则您的变量将被重新初始化。
我正在 Java 开发一款基本的井字棋玩家对战游戏,但在 运行 上它会导致无限循环。没有语法错误。我是编程新手,所以代码有些乱。谢谢。
这里是代码(逻辑代码,不是图形)
class handler implements ActionListener{
public void actionPerformed (ActionEvent evt) {
int i = 1;
boolean b1xon=false;
boolean b2xon=false;
boolean b3xon=false;
boolean b4xon=false;
boolean b5xon=false;
boolean b6xon=false;
boolean b7xon=false;
boolean b8xon=false;
boolean b9xon=false;
boolean b1oon=false;
boolean b2oon=false;
boolean b3oon=false;
boolean b4oon=false;
boolean b5oon=false;
boolean b6oon=false;
boolean b7oon=false;
boolean b8oon=false;
boolean b9oon=false;
boolean win=false;
do {
if ((evt.getSource() == b1) && (i == 1)) {
b1.setText("X");
i++;
b1xon=true;
}
else if (evt.getSource() == b1 && i == 2) {
b1.setText("O");
i = 1;
b1oon=true;
}
else if (evt.getSource() == b2 && i == 1) {
b2.setText("X");
i++;
b2xon=true;
}
else if (evt.getSource() == b2 && i == 2) {
b2.setText("O");
i = 1;
b2oon=true;
}
else if (evt.getSource() == b3 && i == 1) {
b3.setText("X");
i++;
b3xon=true;
}
else if (evt.getSource() == b3 && i == 2) {
b3.setText("O");
i = 1;
b1xon=true;
}
else if (evt.getSource() == b4 && i == 1) {
b4.setText("X");
i++;
b4xon=true;
}
else if (evt.getSource() == b4 && i == 2) {
b4.setText("O");
i = 1;
b1xon=true;
}
else if (evt.getSource() == b5 && i == 1) {
b5.setText("X");
i++;
b5xon=true;
}
else if (evt.getSource() == b5 && i == 2) {
b5.setText("O");
i = 1;
b1xon=true;
}
else if (evt.getSource() == b6 && i == 1) {
b6.setText("X");
i++;
b6xon=true;
}
else if (evt.getSource() == b6 && i == 2) {
b6.setText("O");
i = 1;
b1xon=true;
}
else if (evt.getSource() == b7 && i == 1) {
b7.setText("X");
i++;
b7xon=true;
}
else if (evt.getSource() == b7 && i == 2) {
b7.setText("O");
i = 1;
b1xon=true;
}
else if (evt.getSource() == b8 && i == 1) {
b8.setText("X");
i++;
b8xon=true;
}
else if (evt.getSource() == b8 && i == 2) {
b8.setText("O");
i = 1;
b1xon=true;
}
else if (evt.getSource() == b9 && i == 1) {
b9.setText("X");
i++;
b9xon=true;
}
else if(evt.getSource() == b9 && i==1){
b9.setText("O");
i = 1;
b1xon=true;
}
if((b1xon&&b2xon&&b3xon)||(b4xon&&b5xon&&b6xon)||(b7xon&&b8xon&&b9xon)||(b1xon&&b4xon&&b7xon)||(b2xon&&b5xon&&b8xon)||(b3xon&&b6xon&&b9xon)||(b1xon&&b5xon&&b9xon)||(b3xon&&b5xon&&b7xon)){
win=true;
}
else if((b1oon&&b2oon&&b3oon)||(b4oon&&b5oon&&b6oon)||(b7oon&&b8oon&&b9oon)||(b1oon&&b4oon&&b7oon)||(b2oon&&b5oon&&b8oon)||(b3oon&&b6oon&&b9oon)||(b1oon&&b5oon&&b9oon)||(b3oon&&b5oon&&b7oon)){
win=true;
}
}while(!win);
您正在重复循环同一事件。因此,条件永远不会改变。每个循环迭代都考虑相同的 ActionEvent
对象,由 evt
的相同值引用。每次循环迭代都会重复相同的 if
或 else-if
子句,永远将相同的玩家棋子放在相同的位置。
无限循环从第一步开始。但是 win=true
语句只能在多次移动之后发生。所以那些永远不会发生,while (!win)
永远是真的。
如果要在方法内循环,则需要在循环内获取下一个事件。
如果您希望调用该方法来响应事件,则不需要在方法内使用循环。
顺便说一句,作为学习 Java 的人,您有时会接触到数组。可以使用包含表示 X、O 或两者都不表示的值的 3x3 数组来简化此特定代码。
此外,您似乎有一些复制和粘贴错误。我不认为你打算
b1xon=true;
在一些应该检查 Os 的 else-if 中。例如,
else if (evt.getSource() == b8 && i == 2) {
b8.setText("O");
i = 1;
b1xon=true;
}
正如 Andy 所说,事件处理程序中的循环是无限循环的主要原因。
我不确定您是如何设置 GUI 的,但是您的 win 变量永远不会设置为 true。当你点击一个按钮时(第一次方法是 运行),你的循环被执行并且设置 win = true 的条件永远不会发生。您需要删除 do while。除此之外,您需要在 actionPerformed 方法之外声明您的变量,否则您的变量将被重新初始化。