簡體   English   中英

為什么游戲結束后我的價值沒有重置

[英]why is my value not resetting after game ends

我的代碼用於猜謎游戲,用戶猜出1-100之間的數字。 他們進行了10次嘗試,每次猜測后都會告訴他們其值太低還是太高等等。

我遇到的一個我似乎無法解決的問題是,在他們贏得比賽后,它告訴他們他們贏得了勝利,以及贏得比賽需要花費多少猜測(使用guesses變量)。 我的問題是,如果他們贏了,然后又玩了一次,猜測就不會重置。 因此,如果他們在第一局中嘗試5次,在第二局中嘗試8次,那么在第二局中,它將告訴他們他們以13個猜測贏得了比賽(第1次贏5次,第2次贏8次)。

我知道為什么會這樣,但是我嘗試的所有事情似乎都無法解決。 我以為我是否只是做過guesses = 0; 我在同一地點進行attemptsLeft = 10; 自從attemptsLeft正常運行以來,它就可以正常工作,但是它總是總是說他們贏了,所以他們猜了0次。 我也嘗試設置guesses = 0; if語句中表示何時獲勝/失敗,但它做同樣的事情,並說他們以0的猜測獲勝。

GuessingGame類的代碼

namespace NumberGuessingGame
{
    public class GuessingGame
    {

        int myGuess = 0;
        int guessesLeft = 10;
        public int gamesPlayed = 0;
        public int gamesWon = 0;
        public int gamesLost = 0;
        public int attemptsLeft = 10;
        public int guesses = 0;

        Random rand;
        int number = 0;

        public GuessingGame()
        {           
            attemptsLeft = 10;
            rand = new Random();
            number = rand.Next(1, 100);            
        }
        public void ResetGame()
        {            
            attemptsLeft = 10;
            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)
            {
                attemptsLeft--;
                guesses++;
                guessesLeft--;
                return 1;
            }
            else if (myGuess < number)
            {                               
                attemptsLeft--;
                guesses++;
                guessesLeft--;
                return -1;
            }
            else
            {               
                guesses++;
                gamesWon++;
                gamesPlayed++;
                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);                                           

            if(result == 2)
            {
                lblLosses.Text = "Losses: " + myGuess.gamesLost;
                lblPlayed.Text = "Games Played: " + myGuess.gamesPlayed;
                lblWins.Text = "Wins: " + myGuess.gamesWon;                                       
                MessageBox.Show("You ran out of guesses and lost!");                
            }
            else if(result == 1)
            {               
                MessageBox.Show("Your guess was too high, try again!" + "\n You have " + myGuess.attemptsLeft + " guesses left");
            }
            else if(result == -1)
            {
                MessageBox.Show("Your guess was too low, try again!" + "\n You have " + myGuess.attemptsLeft + " guesses left");
            }
            else if(result == 0)
            {                
                MessageBox.Show("You won!" + "\n It took you " + myGuess.guesses + " guesses");                
                lblLosses.Text = "Losses: " + myGuess.gamesLost;
                lblPlayed.Text = "Games Played: " + myGuess.gamesPlayed;
                lblWins.Text = "Wins: " + myGuess.gamesWon;    
            }                       
        }

我想我有點困惑,為什么您要增加猜測和嘗試的次數。 您難道不能僅使用任一邏輯來完成游戲流程,而不是跟蹤本質上意味着同一件事的兩件事嗎? 當您重新玩游戲時,也可以看到每個變量的含義,是否正確地重置了每個變量並調用了該函數? 祝好運。

您永遠不會重置guesses值,因此它會不斷增加。 您希望在任何回合的最終猜測之后保留猜測計數,以便您可以顯示它,然后在下一輪開始時將其重置。

目前,您的代碼都無法跟蹤回合的狀態,因此需要解決。 另外,您還使用兩個不同的變量來跟蹤猜測和剩余猜測的數量,這是多余的。 我們可以將其切回單個變量以跟蹤所做的猜測,並在回合開始時將其重置。

因此,從游戲狀態開始。 我們可以將一些項目打包成這樣的狀態:

public enum EGameState
{
    None,
    Playing,
    Won,
    Lost
}

None狀態將用於第一輪,此后永遠不會。 在進行回合時,狀態將為“ Playing並且在回合結束時,無論是Won還是Loss ,都表明結果。

現在,可以將GuessingGame類修改為使用狀態來確定對猜測的反應方式,等等。如果游戲狀態未設置為“ Playing則需要重新初始化回合變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM