此代码导致无限循环

时间:2015-10-14 16:05:29

标签: java infinite-loop

我正在使用Java开发基本的tic tac toe player vs player游戏,但是在运行它时会导致无限循环。没有语法错误。我是编程新手,所以代码有些混乱。谢谢。

这是代码(逻辑代码,而不是图形)

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);

3 个答案:

答案 0 :(得分:0)

您反复循环同一事件。因此,条件永远不会改变。每个循环迭代都考虑相同的ActionEvent对象,由evt的相同值引用。每次循环迭代都会重复相同的ifelse-if子句,将相同的玩家片段永远放在同一个地方。

无限循环从第一步开始。但win=true语句只能在多次移动后发生。所以那些永远不会发生,而while (!win)总是如此。

如果要在方法中循环,则需要在循环内获取下一个事件。

如果您希望在响应事件时调用该方法,则不需要在该方法中使用循环。

顺便说一句,作为学习Java的人,在某些时候你会被引入数组。通过使用包含表示X,O或两者的值的3x3数组,可以简化此特定代码。

答案 1 :(得分:0)

此外,您看起来有一些复制和粘贴错误。我不认为你打算

b1xon=true;

在一些应该检查Os的else-ifs中。例如,

else if (evt.getSource() == b8 && i == 2) {
                b8.setText("O");
                i = 1;
                b1xon=true;
            }

正如Andy所说,事件处理程序中的循环是无限循环的主要原因。

答案 2 :(得分:0)

我不确定您如何设置GUI,但 win 变量永远不会设置为 true 。单击某个按钮时(第一次运行该方法),将执行循环,并且永远不会出现设置win = true的条件。你需要删除do while。除此之外,您还需要在actionPerformed方法之外声明变量,否则您的变量将被重新初始化。