2014-11-03 81 views
0
public static void assignCellTypes(char[][] tissue, int percentBlank, int percentX){ 


    //Your code goes here 
    Random rnd = new Random(); 
    int row = 0; 
    int col = 0; 
    int rndRow = rnd.nextInt(tissue.length); 
    int rndCol = rnd.nextInt(tissue.length); 

    int numOfCells = (tissue.length * tissue.length); 
    double numOfBlankCells = numOfCells * (percentBlank/100.0); 
    numOfBlankCells = Math.ceil(numOfBlankCells); 
    double numOfXCells = (numOfCells-numOfBlankCells) * (percentX/100.0); 
    numOfXCells = Math.ceil(numOfXCells); 
    double numOfOCells = numOfCells - (numOfBlankCells + numOfXCells); 

    if (numOfCells < numOfBlankCells + numOfXCells + numOfOCells) { 
     System.out.println("Percentages can't be over 100%"); 
     System.exit(0); 
    } 

    int counterBlank = 0; 
    while (counterBlank <= numOfBlankCells) { 
     rndRow = rnd.nextInt(tissue.length); 
     rndCol = rnd.nextInt(tissue.length); 
     if (tissue[rndRow][rndCol] == '\0') { 
      tissue[rndRow][rndCol] = ' '; 
      counterBlank++; 
     } 
    } 
    int counterX = 0; 
    while (counterX <= numOfXCells) { 
     rndRow = rnd.nextInt(tissue.length); 
     rndCol = rnd.nextInt(tissue.length); 
     if (tissue[rndRow][rndCol] == '\0') { 
      tissue[rndRow][rndCol] = 'X'; 
      counterX++; 
     } 
    } 
    int counterO = 0; 
    while (counterO <= numOfOCells) { 
     rndRow = rnd.nextInt(tissue.length); 
     rndCol = rnd.nextInt(tissue.length); 
     if (tissue[rndRow][rndCol] == '\0') { 
      tissue[rndRow][rndCol] = 'O'; 
      counterO++; 
     } 
    }  
} 

我假設問題出在一個循環,但我真的不知道什麼是錯的。我想循環做的是檢查數組上的隨機元素是否爲空。如果它是我想分配一個字符到該數組元素,然後將一個添加到計數器。一旦計數器達到我想要的數字,它就會轉到下一個while循環。有人可以幫我嗎?當我運行此方法,然後打印我的陣列,沒有打印

+0

您應該嘗試一些打印調試,以確保您正確輸入while while循環,並且值是您所期望的。 – 2014-11-03 19:11:39

+0

下一次真的做調試(http://ericlippert.com/2014/03/05/how-to-debug-small-programs/),並提出更好的情況。它不只是「不打印任何東西」,它在第三個「while」時陷入了無限循環。 – Deltharis 2014-11-03 19:34:13

+0

對不起,我一定會在下次調試。感謝您的幫助! – RogueWolf 2014-11-03 20:12:25

回答

0

因爲每個while循環想要填充1個單元格。 最後一個循環無法填充所需數量的單元,因爲沒有更多空單元可用。 將所有循環中的< =條件修改爲<,這樣就可以了。

public static void assignCellTypes(char[][] tissue, int percentBlank, int percentX){ 

    //Your code goes here 
    Random rnd = new Random(); 
    int row = 0; 
    int col = 0; 
    int rndRow = rnd.nextInt(tissue.length); 
    int rndCol = rnd.nextInt(tissue.length); 

    int numOfCells = (tissue.length * tissue.length); 
    double numOfBlankCells = numOfCells * (percentBlank/100.0); 
    numOfBlankCells = Math.ceil(numOfBlankCells); 
    double numOfXCells = (numOfCells-numOfBlankCells) * (percentX/100.0); 
    numOfXCells = Math.ceil(numOfXCells); 
    double numOfOCells = numOfCells - (numOfBlankCells + numOfXCells); 

    if (numOfCells < numOfBlankCells + numOfXCells + numOfOCells) { 
     System.out.println("Percentages can't be over 100%"); 
     System.exit(0); 
    } 

    int counterBlank = 0; 
    while (counterBlank < numOfBlankCells) { 
     rndRow = rnd.nextInt(tissue.length); 
     rndCol = rnd.nextInt(tissue.length); 
     if (tissue[rndRow][rndCol] == '\0') { 
      tissue[rndRow][rndCol] = ' '; 
      counterBlank++; 
     } 
    } 
    int counterX = 0; 
    while (counterX < numOfXCells) { 
     rndRow = rnd.nextInt(tissue.length); 
     rndCol = rnd.nextInt(tissue.length); 
     if (tissue[rndRow][rndCol] == '\0') { 
      tissue[rndRow][rndCol] = 'X'; 
      counterX++; 
     } 
    } 
    int counterO = 0; 
    while (counterO < numOfOCells) { 
     rndRow = rnd.nextInt(tissue.length); 
     rndCol = rnd.nextInt(tissue.length); 
     if (tissue[rndRow][rndCol] == '\0') { 
      tissue[rndRow][rndCol] = 'O'; 
      counterO++; 
     } 
    }  
} 

但是如何從另一側產生相同的結果 - 線性穿過細胞並立即用隨機值填充細胞? :)

+0

謝謝!在做一些打印調試之後(就像上面說的那樣),這是確切的問題。 – RogueWolf 2014-11-03 20:14:18

0

您的代碼運行到無限循環。只要完成空白單元格的循環,tissue中就不會再有\0的單元格,因爲只有當您點擊所有單元格時,循環纔會完成。然後進入下一個循環,並且由於沒有空白單元格,它將永遠不會觸及空白單元格,永遠不會增加counterX,也不會退出循環。

此外,您檢查百分比的條件是錯誤的。由於您根據numOfCells減去另外兩個來計算numOfOCells,所以numOfBlankCells + numOfXCells + numOfOCells將始終正好爲numOfCells

你需要重新思考你的整個策略。

+0

感謝您的幫助!我解決了兩個問題,代碼正在按照我的計劃進行。 – RogueWolf 2014-11-03 20:13:04