2011-06-08 63 views
3

我在学校为java创建扫雷程序,并且在清除没有任何地雷的广场时遇到麻烦,广场应该是禁用的,所有的周围正方形显示,如果有另一个触摸无炸弹的广场,它将执行相同的操作。我得到一个堆栈溢出错误,我知道这与一个无限循环有关,但我无法找到它在我的代码中卡住的位置。扫雷计划递归错误

我不知道发生了什么问题,所以任何建议都会有帮助。

这里是代码的相对件(的if语句是用于特殊情况下,如果点击了正方形是在板的边缘)

private void doClear(int y, int x, JButton[][] bArray2, int gridy,int gridx) 
{ 
    clicked--; 
    bArray2[y][x].setBackground(lighterGray); 
    bArray2[y][x].setEnabled(false); 

    if (x > 0 && x<gridx-1 && y> 0 && y<gridy-1) 
    { 
     clearSquare(y-1, x-1,gridy, gridx, bArray2); 
     clearSquare(y-1, x,gridy, gridx, bArray2); 
     clearSquare(y-1, x+1,gridy, gridx, bArray2); 
     clearSquare(y, x-1,gridy, gridx, bArray2); 
     clearSquare(y, x+1,gridy, gridx, bArray2); 
     clearSquare(y+1, x-1,gridy, gridx, bArray2); 
     clearSquare(y+1, x,gridy, gridx, bArray2); 
     clearSquare(y+1, x+1,gridy, gridx, bArray2); 
    } 
    if(y == 0 && x != 0 && x != gridx-1) // top row check 
         { 
          clearSquare(y, x-1,gridy, gridx, bArray2); 
          clearSquare(y, x+1,gridy, gridx, bArray2); 
          clearSquare(y+1, x-1,gridy, gridx, bArray2); 
          clearSquare(y+1, x,gridy, gridx, bArray2); 
          clearSquare(y+1, x+1,gridy, gridx, bArray2); 

         } // ends top row check 

         if (y == 0 && x == 0) // corner check top left 
         { 
          clearSquare(y, x+1,gridy, gridx, bArray2); 
          clearSquare(y+1, x,gridy, gridx, bArray2); 
          clearSquare(y+1, x+1,gridy, gridx, bArray2); 
         } // ends top left corner check 

         if (y == 0 && x == gridx-1) // corner check top right row 
         {  
          clearSquare(y, x-1,gridy, gridx, bArray2); 
          clearSquare(y+1, x-1,gridy, gridx, bArray2); 
          clearSquare(y+1, x,gridy, gridx, bArray2);        
         } // ends top right corner check 

         if (x == 0 && y != 0 && y != gridy-1) //left column check 
         { 
          clearSquare(y-1, x,gridy, gridx, bArray2); 
          clearSquare(y-1, x+1,gridy, gridx, bArray2); 
          clearSquare(y, x+1,gridy, gridx, bArray2); 
          clearSquare(y+1, x,gridy, gridx, bArray2); 
          clearSquare(y+1, x+1,gridy, gridx, bArray2); 
          } // ends left column check 

          if (x == gridx-1 && y != 0 && y != gridy-1) // right column check 
          { 
          clearSquare(y-1, x-1,gridy, gridx, bArray2); 
          clearSquare(y-1, x,gridy, gridx, bArray2); 
          clearSquare(y, x-1,gridy, gridx, bArray2); 
          clearSquare(y+1, x-1,gridy, gridx, bArray2); 
          clearSquare(y+1, x,gridy, gridx, bArray2); 
          }// ends right column check 

         if(y == gridy-1 && x != 0 && x != gridx-1) 
         { 
          clearSquare(y-1, x-1,gridy, gridx, bArray2); 
          clearSquare(y-1, x,gridy, gridx, bArray2); 
          clearSquare(y-1, x+1,gridy, gridx, bArray2); 
          clearSquare(y, x-1,gridy, gridx, bArray2); 
          clearSquare(y, x+1,gridy, gridx, bArray2); 
         } // ends bottom row check 

         if (y == gridy-1 && x == 0) // left bottom corner check 
         { 
          clearSquare(y-1, x,gridy, gridx, bArray2); 
          clearSquare(y-1, x+1,gridy, gridx, bArray2); 
          clearSquare(y, x+1,gridy, gridx, bArray2); 

         } // ends left bottom corner check 

         if (y == gridy-1 && x == gridx-1) // right bottom corner check 
         { 
          clearSquare(y-1, x-1,gridy, gridx, bArray2); 
          clearSquare(y-1, x,gridy, gridx, bArray2); 
          clearSquare(y, x-1,gridy, gridx, bArray2); 
         }//ends right bottom corner check 
} 

private void clearSquare(int y,int x, int gridy, int gridx, JButton[][] bArray2) 
{ 
     int value = array[y][x]; 
     System.out.println(value); 
     String text = bArray2[y][x].getText(); 
     if (text == "") 
     { 
     if (value == 0) 
     { 
      doClear(y, x, bArray2, gridy, gridx); 
     } 
     else{ 
      clicked--; 
      bArray2[y][x].setText(""+value); 
      } 
     } 

} 
+1

顺便说一句,如果你在顶部和底部有一个额外的行和在左侧和右侧有一个额外的列,你将需要少得多的代码。保持这些隐藏设置的初始状态清除。 – ikegami 2011-06-08 00:17:48

+0

我已添加到我的答案中。原来还有另一种简化代码的方法,不需要添加额外的行和列。 – ikegami 2011-06-08 00:41:26

回答

4
private void doClear(int y, int x, JButton[][] bArray2, int gridy,int gridx) 
{ 
    if (...already cleared...) { 
     return; 
    } 

    ... 
} 

没有这种检查,小区A将清除相邻小区B,它会清除相邻小区A,它会清除相邻小区B,这...

您发布的代码可以被替换为以下几点:

private void handleClick(JButton[][] bGrid, int gridy, int gridx, int y, int x, bool realClick) { 
    if (x < 0 || x >= gridx || y < 0 || y >= gridx) { 
     return; 
    } 

    JButton button = bGrid[y][x]; 
    if (!button.isEnabled()) { 
     return; 
    } 

    if (realClick) { 
     --clicked; 
    } 

    button.setBackground(lighterGray); 
    button.setEnabled(false); 

    if (...is a mine...) { 
     ... 
    } else { 
     button.setText(array[y][x]); 

     if (value == 0) { 
      handleClick(bGrid, gridy, gridx, y-1, x-1, false); 
      handleClick(bGrid, gridy, gridx, y-1, x, false); 
      handleClick(bGrid, gridy, gridx, y-1, x+1, false); 
      handleClick(bGrid, gridy, gridx, y, x-1, false); 
      handleClick(bGrid, gridy, gridx, y, x+1, false); 
      handleClick(bGrid, gridy, gridx, y+1, x-1, false); 
      handleClick(bGrid, gridy, gridx, y+1, x, false); 
      handleClick(bGrid, gridy, gridx, y+1, x+1, false); 
     } 
    } 
} 

array”需要重新命名为某种感觉!

更新:增加了简化代码。