为什么游戏结束后我的数值没有重置
why is my value not resetting after game ends
我的代码用于猜谜游戏,用户猜测 1-100 之间的数字。他们有 10 次尝试,每次猜测后它都会告诉他们是太低还是太高,等等。
我遇到的一个似乎无法解决的问题是,在他们赢了之后,它会告诉他们他们赢了,以及他们猜了多少次才赢(使用 guesses
变量)。我的问题是,如果他们赢了,他们又玩了一次,猜测就不会重置。因此,如果他们在第一场比赛中尝试了 5 次,在第二场比赛中尝试了 8 次,那么在第二场比赛中,它会告诉他们他们在 13 次猜测中获胜(第一场 5 次 + 第二场 8 次)。
我知道为什么会这样,但我尝试的一切似乎都无法解决问题。我假设如果我只是在我做 attemptsLeft = 10;
的同一个地方做类似 guesses = 0;
的事情,它会起作用,因为 attemptsLeft
工作正常,但它总是说他们赢了,它花了他们0猜测。我还尝试在 if
语句中设置 guesses = 0;
来表示他们何时 win/lose 但它做了同样的事情并说他们在 0 次猜测中获胜。
猜谜游戏代码class
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;
}
}
}
}
表单代码 class
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
值,因此它当然会不断增加。您希望在任何一轮的最终猜测后保留猜测计数,以便您可以显示它,然后在下一轮开始时重置它。
目前 none 您的代码跟踪回合的状态,因此需要解决这个问题。此外,您还使用两个不同的变量来跟踪做出和剩余的猜测次数,这是过多的。我们可以将其缩减为单个变量,用于跟踪在一轮开始时重置的猜测。
所以,从游戏状态开始。我们可以把一些项目打包成这样的状态:
public enum EGameState
{
None,
Playing,
Won,
Lost
}
None
状态将用于第一轮,此后不再使用。在玩一轮时,状态将是 Playing
,在一轮结束时,状态将是 Won
或 Loss
以指示结果。
现在您的 GuessingGame
class 可以修改为使用状态来确定如何对猜测等做出反应。如果游戏状态未设置为 Playing
那么您需要重新初始化轮变量。
我的代码用于猜谜游戏,用户猜测 1-100 之间的数字。他们有 10 次尝试,每次猜测后它都会告诉他们是太低还是太高,等等。
我遇到的一个似乎无法解决的问题是,在他们赢了之后,它会告诉他们他们赢了,以及他们猜了多少次才赢(使用 guesses
变量)。我的问题是,如果他们赢了,他们又玩了一次,猜测就不会重置。因此,如果他们在第一场比赛中尝试了 5 次,在第二场比赛中尝试了 8 次,那么在第二场比赛中,它会告诉他们他们在 13 次猜测中获胜(第一场 5 次 + 第二场 8 次)。
我知道为什么会这样,但我尝试的一切似乎都无法解决问题。我假设如果我只是在我做 attemptsLeft = 10;
的同一个地方做类似 guesses = 0;
的事情,它会起作用,因为 attemptsLeft
工作正常,但它总是说他们赢了,它花了他们0猜测。我还尝试在 if
语句中设置 guesses = 0;
来表示他们何时 win/lose 但它做了同样的事情并说他们在 0 次猜测中获胜。
猜谜游戏代码class
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;
}
}
}
}
表单代码 class
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
值,因此它当然会不断增加。您希望在任何一轮的最终猜测后保留猜测计数,以便您可以显示它,然后在下一轮开始时重置它。
目前 none 您的代码跟踪回合的状态,因此需要解决这个问题。此外,您还使用两个不同的变量来跟踪做出和剩余的猜测次数,这是过多的。我们可以将其缩减为单个变量,用于跟踪在一轮开始时重置的猜测。
所以,从游戏状态开始。我们可以把一些项目打包成这样的状态:
public enum EGameState
{
None,
Playing,
Won,
Lost
}
None
状态将用于第一轮,此后不再使用。在玩一轮时,状态将是 Playing
,在一轮结束时,状态将是 Won
或 Loss
以指示结果。
现在您的 GuessingGame
class 可以修改为使用状态来确定如何对猜测等做出反应。如果游戏状态未设置为 Playing
那么您需要重新初始化轮变量。