2016-12-26 126 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; 
} 

感謝您的幫助!