2016-12-26 132 views
0

我制作了一个使用2D阵列的战列舰游戏,并且需要我的do-while循环才能工作,所以如果您将一艘船放置在已经存在的地方,那么您会被要求再次放置该船。以下是将数组值从0更改为1以类似于船舶位置的代码。如果你试图把一艘船,其中已经存在的1为什么这个do-while循环不起作用?

public int[][] changeMatrixValues(int i, int j, int k, int l) throws IllegalArgumentException { // for a ship with dimensions k*l and starting grid[i][j] 
    for (mRow = i; mRow < (i + k); mRow++) { 
     for (mCol = j; mCol < (j + l); mCol++) { 
        if (mMatrix[mRow][mCol] == 0 && mMatrix[mRow][mCol] != 1) 
         mMatrix[mRow][mCol] = 1; 
        else 
         throw new IllegalArgumentException("Ship already in area"); 
     } 
    } 
    return mMatrix; 
} 

值这是一个不同的类,提示他们想去的地方放置某种类型船舶的用户代码,则抛出一个IllegalArgumentException。它拾取IllegalArgumentException,但是,do-while循环不起作用,并且如果用户将一艘船放在另一艘船的顶部,他们就不会再有机会放置该特定的船,并且游戏继续询问你想要的地方放置下一艘船。如果任何人都可以强调为什么这样做,while循环不工作,那将是伟大的!

private boolean keepPlacing; 
    private void ship(String shipToPlace, Matrix matrix, int k, int l) { 
    keepPlacing = true; 
    do { 
     try { 
      System.out.println(shipToPlace); 
      chooseGrid();   // enter co-ords of where you want to place ship 
      matrix.changeMatrixValues(mRow, mCol, k, l); 
      keepPlacing = false; 
     } catch (IllegalArgumentException ie) { 
      System.out.println(ie.getMessage()); 
     } 
    } while (keepPlacing); 

    matrix.printLabeledMatrix(); 
} 
+0

好的。一开始似乎很好。你可以调试,看看'catch'子句中'keepPlacing'的价值吗? – MordechayS

+3

值得指出的是,'changeMatrixValues'没有失败的原子性:它在创建之前并不检查整个“更改”是否有效。这意味着它可以设置一个或多个单元格,然后失败,从而使事物处于损坏状态。 –

+2

另外:'mMatrix [mRow] [mCol] == 0 && mMatrix [mRow] [mCol]!= 1'是多余的,因为'0!= 1'。 –

回答

0

在方法changeMatrixValues您设置阵列值1,如果抛出:IllegalArgumentException - 你不回滚他们。

+0

虽然这可能是代码中的错误,但它似乎无法回答当抛出'IllegalArgumentException'时为什么'keepPlacing'循环会退出。如果您对所提出的问题没有答案,则应保留此声明以供评论。 – Guildencrantz

1

这种变化解决了这个问题:

private void ship(String shipToPlace, Matrix matrix, int k, int l) { 
    boolean keepPlacing = true; 
    do { 
     try { 
      System.out.println(shipToPlace); 
      chooseGrid(); 
      if(matrix.validate(mRow, mCol, k, l) == true) { 
       matrix.changeMatrixValues(mRow, mCol, k, l); 
       keepPlacing = false; 
      } 
     } catch (IllegalArgumentException ie) { 
      System.out.println(ie.getMessage()); 
     } 
    } while (keepPlacing); 

    matrix.printLabeledMatrix(); 
} 

其中的validate(MROW,MCOL,K,L)的方法是:

public boolean validate(int i, int j, int k, int l) { 
     for (mRow = i; mRow < (i + k); mRow++) { 
      for (mCol = j; mCol < (j + l); mCol++) { 
       if (mMatrix[mRow][mCol] == 1) { 
        System.out.println("Oops, try again"); 
        return false; 
       } 
      } 
     } 
     return true; 
} 

感谢您的帮助!