为什么我的价值在游戏结束后没有重置?

本文关键字:游戏结束 我的 为什么 | 更新日期: 2023-09-27 18:13:55

我的代码是一个猜谜游戏,用户猜测1-100之间的数字。他们有10次尝试,每次猜测后,它会告诉他们是太低还是太高,等等。

我似乎无法解决的问题是,在他们赢了之后,它告诉他们他们赢了,他们赢了多少次猜测(使用guesses变量)。我的问题是,如果他们赢了,他们再玩一次,猜测不会重置。所以如果他们在第一个游戏中尝试了5次,在第二个游戏中尝试了8次,在第二个游戏中它会告诉他们他们在13次猜测中获胜(第一次5次+第二次8次)。

我知道为什么会这样,但是我所做的一切似乎都无法解决它。我假设如果我在相同的位置做guesses = 0;attemptsLeft = 10;,它会工作,因为attemptsLeft工作得很好,但它总是说他们赢了,它花了他们0次猜测。我还尝试在if语句中设置guesses = 0;,以确定他们何时赢/输,但它做同样的事情,并说他们在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,在一轮游戏结束时,状态将是WonLoss来指示结果。

现在可以修改GuessingGame类以使用状态来确定如何对猜测做出反应,等等。如果游戏状态没有设置为Playing,那么你需要重新初始化圆形变量。