2015-10-14 129 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方法之外聲明你的變量,否則你的變量將被重新初始化。