2015-09-21 57 views
0

對於我的代碼,它是一個猜數字遊戲。他們在失敗之前得到10次猜測,並告訴他們是否太低,太高等等。在我的輸出中,當我告訴他們他們是太高還是太低時,我還想顯示他們有多少猜測剩下。但目前它告訴他們他們每次都有9次猜測,我不知道爲什麼。使用遞減運算符

該程序的其餘部分工作。所以在經過10次猜測之後,它會告訴他們他們輸了,只是每一次猜測,直到它說他們有9次猜測。

namespace NumberGuessingGame 
{ 
public class GuessingGame 
{ 

    int myGuess = 0; 
    int guessesLeft = 10; 
    int gamesPlayed = 0; 
    int gamesWon = 0; 
    int gamesLost = 0; 

    Random rand; 
    int number = 0; 

    public GuessingGame() 
    { 
     rand = new Random(); 
     number = rand.Next(1, 100); 
    } 
    public void ResetGame() 
    { 
     number = rand.Next(1, 100); 
     guessesLeft = 10; 
    } 

    public int CheckGuess(int newGuess) 
    { 
     myGuess = newGuess; 

     if (guessesLeft < 1) 
     {     
      gamesLost++; 
      gamesPlayed++; 
      ResetGame(); 
      return 2; 
     } 
     else if (myGuess > number) 
     {     
      guessesLeft--; 
      return 1; 
     } 
     else if (myGuess < number) 
     {    
      guessesLeft--; 
      return -1; 
     } 
     else 
     {     
      gamesPlayed++; 
      gamesWon++; 
      ResetGame(); 
      return 0; 
     } 
    } 
} 

}

代碼形式類

namespace NumberGuessingGame 
{ 
public partial class frmMain : Form 
{ 
    public frmMain() 
    { 
     InitializeComponent();   
    }   

    GuessingGame myGuess = new GuessingGame(); 

    private void btnCheck_Click(object sender, EventArgs e) 
    { 
     int inputGuess = Convert.ToInt32(txtGuess.Text); 
     int result = myGuess.CheckGuess(inputGuess); 

     int guessesLeft = 10; 


     if(result == 2) 
     { 
      MessageBox.Show("You ran out of guesses and lost!"); 
     } 
     else if(result == 1) 
     { 
      guessesLeft--; 
      MessageBox.Show("Your guess was too high, try again!" + "\n You have " + guessesLeft + " guesses left"); 
     } 
     else if(result == -1) 
     { 
      guessesLeft--; 
      MessageBox.Show("Your guess was too low, try again!" + "\n You have " + guessesLeft + " guesses left"); 
     } 
     else if(result == 0) 
     { 
      MessageBox.Show("You won!"); 
     } 

    } 
} 

}

+0

你使用調試器嗎?按F11並查看逐行發生的情況。相信我。調試將解決您的問題的必要性,也可以幫助您稍後設計更好的算法,並且您將不會陷入問題。 –

回答

2

每次單擊該按鈕時,您將guessesLeft到10,這會導致問題。如果你猜測左邊是私人領域,它將被修復。

像這樣:

public partial class frmMain : Form 
{ 
    private int guessesLeft = 10; 

etc. 
+3

最好不要有兩個變量......而是在'GuessingGame'類中公開一個變量。 – DonBoitnott

1

你有2個獨立的guessesLeft變量 - 一個在你btnCheck_Click事件方法,並且一個在你GuessingGame類。每次單擊該按鈕時,它都會初始化一個新的guessesLeft並將其設置爲10,將其遞減,然後該變量超出範圍。您應該只有持有該信息的一個變量,最好的地方是在你的guessingGame類作爲公共財產:

public class GuessingGame 
{ 
    public int GuessesLeft { get; private set; } 
} 

和使用,在您的單擊事件:

​​
+1

從外部設置'GuessesLeft'不明智。 –

+0

@JonathonReinhart是的。謝謝。 –

1
private void btnCheck_Click(object sender, EventArgs e) 
{ 
    int guessesLeft = 10; 

guessesLeft是在btnCheck_Click()堆棧上的局部變量。它在函數返回時被銷燬,並且每次按下按鈕並調用該函數時都會重新創建並重新初始化爲10。

您需要公開您的GuessingGame類中的guessesLeft。最好的方法是通過只讀屬性:

public class GuessingGame 
{ 
    // ... 

    public int GuessesRemaining 
    { 
     get { return guessesRemaining; } 
    } 
0

您每次單擊按鈕時都會將guessesLeft變量重新初始化爲10。您反而想要從您創建的名爲myGuess的猜測遊戲對象查詢變量。