2015-10-14 127 views
0

我正在开发基本的tic tac toe玩家vs 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); 
+1

为什么不应该是一个无限循环? –

+0

我避风港;吨阅读(或理解)这个代码,但如果你的最后'否则,如果(evt.getSource()== B9 &&我== 1){'来检查我== 2 – DaveH

+0

要在@SotiriosDelimanolis扩大'评论,你这里实际上没有提出任何问题。你能解释它做了什么,你期望它做什么,你试图解决什么问题?谢谢。 – Ickster

回答

0

。因此,这些条件永远不会改变。每个循环迭代都考虑相同的ActionEvent对象,该对象由相同的值evt引用。在每个循环迭代中重复相同的ifelse-if子句,从而将相同的玩家永远放在同一个地方。

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

如果你想在方法中循环,你需要得到循环内的下一个事件。

如果你想在响应事件时要调用的方法,你不需要在方法内循环。另外,作为学习Java的人,在某些时候你会被引入数组。这个特殊的代码可以通过使用包含代表X,O或不是的值的3x3数组来简化。

0

此外,它看起来像你有一些复制和粘贴错误。我不认为你打算在一些应该检查Os的else-if中有

b1xon=true; 

。例如,

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

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

0

我不确定你如何设置GUI,但你的赢得变量永远不会被设置为true。当你点击一个按钮(第一次运行该方法)时,你的循环被执行,设置win = true的条件将不会发生。您需要删除该操作。除此之外,你需要在actionPerformed方法之外声明你的变量,否则你的变量将被重新初始化。