【问题标题】:why is my value not resetting after game ends为什么我的值在游戏结束后没有重置
【发布时间】:2015-12-18 20:47:33
【问题描述】:

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

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

我知道为什么会这样,但我尝试的一切似乎都无法解决它。我假设如果我只是在我做attemptsLeft = 10; 的同一个地方做类似guesses = 0; 的事情,那么它会起作用,因为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;    
            }                       
        }

【问题讨论】:

  • 使用调试器逐步检查您的代码 - 通过ResetGame() 方法关注guesses 的值。
  • 您还混淆了您的顾虑 - 从概念上讲,您有 GuessingGame 代表游戏会话和单轮游戏 - 考虑分散这些顾虑。

标签: c# class visual-studio-2012 operators


【解决方案1】:

我想我有点困惑,为什么要增加猜测次数和剩余尝试次数。难道你不能只使用两者中的逻辑来完成游戏流程,而不是跟踪本质上意味着同一件事的两件事吗?当你重新玩游戏时,看看每个变量也等同于什么,你是否正确地重置了每个变量并调用了该函数?祝你好运。

【讨论】:

  • 是的,谢谢。我摆脱了猜测增量,只是做了guesses = 10 - attemptsLeft;
【解决方案2】:

您永远不会重置 guesses 值,所以它当然会不断增加。您希望在任何一轮的最终猜测之后保留猜测计数,以便您可以显示它,然后在下一轮开始时将其重置。

目前,您的任何代码都没有跟踪回合的状态,因此需要解决此问题。此外,您正在使用两个不同的变量来跟踪做出和剩余的猜测数量,这是过多的。我们可以将其缩减为单个变量,以跟踪在一轮开始时重置的猜测。

所以,从游戏状态开始。我们可以把一些物品打包成这样的状态:

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

None 状态将用于第一轮,此后不再使用。玩一轮时,状态将为Playing,在一轮结束时,WonLoss 表示结果。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-04
    相关资源
    最近更新 更多