2014-10-22 76 views
0

以下代碼塊應該檢查用戶輸入的座標是否爲船的座標。該船位於(1,1)和(1,2)的二維陣列上。使用Java創建戰艦時的麻煩

當我用while循環包圍了getUserGuess方法實現時,問題就開始了。循環檢查船是否仍然存在,並將繼續要求用戶輸入座標,直到船沉沒。但是,只要用戶輸入任意一對正確的座標,整艘船就會沉沒。

我不知道爲什麼這種情況持續發生。只要我註釋掉循環,問題就會停止,但循環是必要的。

這裏是方法:

public void checkResult(String userGuess) { 
    while (frigateIsAlive == true) { 
     if (userGuess.equalsIgnoreCase(board[1][1])){ 
      System.out.println("hit!"); 
      numOfHitsOnFrigate++; 
      board[1][1] = " *"; 
      createBoard(); 
     } 
     if (userGuess.equalsIgnoreCase(board[1][2])) { 
      System.out.println("hit!"); 
      numOfHitsOnFrigate++; 
      board[1][2] = " *"; 
      createBoard(); 
     } 
     else if (numOfHitsOnFrigate == 2) { 
      System.out.println("Enemy frigate has been sunk!"); 
      frigateIsAlive = false; 
      break; 
     } 
     else { 
      System.out.println("miss!"); 
      // try again 
     } 
    } 
} 

public String getUserGuess() 
{ // takes the users guess 

    System.out.println("Choose a coordinate on the board to fire at"); 
    int x = input.nextInt();               
    int y = input.nextInt(); 

    String userGuess = board[x][y]; 
    return userGuess; 
} 

讓我知道如果你需要看,以更好地幫助我的代碼的任何其他部分。

+0

使用,而(frigateIsAlive)來代替,而(frigateIsAlive ==真) – 2014-10-22 05:30:44

+0

我相信別的東西使它裏面去numOfHitsOnFrigate可以打印出numOfHitsonFrigate'的'的值,以確保它是正確遞增的 – KRUKUSA 2014-10-22 05:32:14

+0

邏輯是有缺陷的,你在這裏不需要'while',假設'userGuess'對board'[1] [1]有好處',如果你進入循環,你只在第一個'if'進行2次後離開它,很確定這不是你想要的。 – 2014-10-22 05:33:39

回答

3

這種方法是有缺陷的:

  • 如果userGuess匹配板[1] [1],循環會使你增加numOfHitsOnFrigate兩次,然後你會改變frigateIsAlive爲false,並退出。

  • 如果userGuess與board [1] [2]匹配,循環將使您增加無限次numOfHitsOnFrigate,並且您永遠不會退出。

  • 如果userGuess不匹配,則循環將永不終止,並且不會獲得新輸入而繼續打印miss!

你需要消除環路,因爲這個方法檢查單userGuess,並更改條件:根據你寫的

public void checkResult(String userGuess) { 
     if (userGuess.equalsIgnoreCase(board[1][1])){ 
      System.out.println("hit!"); 
      numOfHitsOnFrigate++; 
      board[1][1] = " *"; 
      createBoard(); 
     } else if (userGuess.equalsIgnoreCase(board[1][2])) { 
      System.out.println("hit!"); 
      numOfHitsOnFrigate++; 
      board[1][2] = " *"; 
      createBoard(); 
     } else { 
      System.out.println("miss!"); 
      // try again 
     } 
     if (numOfHitsOnFrigate == 2) { 
      System.out.println("Enemy frigate has been sunk!"); 
      frigateIsAlive = false; 
     } 
} 

- I surrounded the getUserGuess method implementation with a while loop. - 你有另一個環,其狀態越來越投入來自用戶。那個你沒有給我們看過的代碼是必須的,因爲沒有它,遊戲就不會進行。

+0

我沒有其他的循環...所以我採取了你的建議,並修復了方法。現在我想知道的是,如果整個方法必須被循環包圍?或者我應該圍繞getUserGuess方法實現與循環? – 2014-10-22 05:47:51

+0

@Cherry_Developer但你說過「用while循環包圍getUserGuess方法」。在你的問題中我沒有看到任何'getUserGuess'方法。我只看到'checkResult'。 – Eran 2014-10-22 05:49:40

+0

@Cherry_Developer好了,看起來你想要一些遊戲循環,你可以在這個循環中調用getUserGuess,然後檢查這個猜測是否是錯過,擊中或擊中某艘船的命中。您的checkResult方法執行單個船舶的檢查。如果你有多艘船,你需要調用多個類似的方法,或者一個方法來檢查所有的船。 – Eran 2014-10-22 06:12:46

1

你可能想什麼(僞代碼):

  • 開始(一環)
  • 詢問用戶猜測
  • 檢查結果的猜測
  • 沉沒=>停止/沒有沉沒=>繼續開始

(即你放錯地方的while環)