基于玩家回合的骰子游戏(循环有问题)
Player-turn based Dice game (having trouble with loops)
背景;我正在尝试为多人游戏创建一个骰子游戏,您可以在其中选择游戏中想要的玩家数量、骰子面数和骰子本身。每个玩家轮流掷 n 个骰子,每次掷骰子的分数都会附加到玩家 classes playerScore 属性。一旦玩家达到 X 点,玩家将被宣布为获胜者。
问题;下面的代码是 "Game" class 的一部分。当我编译代码时,游戏大部分都符合我的预期;每个玩家每回合掷 5 个骰子并将点数附加到所述玩家,但是一旦玩家达到 100 分,玩家就被宣布为赢家,但骰子会再次为另一个玩家掷骰子,尽管 while 循环无效.在我看来,问题出在 for 循环上,但我不知道如何解决这个问题,我试过 "break" 但它只从 if 语句中断。
我的程序有 3 个 class;死,玩家,游戏。如果您需要更多信息或屏幕截图。我可以提供。
P.S。如果您认为此代码可以改进,请发表评论,我很乐意听到。
if 语句打乱了您的流程。为什么?
if (gameEnded || playerArray[i].PlayerScore >= maxPoints)
{
Console.WriteLine("Congratulations, Player '{0}' has won by reaching {1} points.",playerArray[i].PlayerName, playerArray[i].PlayerScore);
gameEnded = true;
break;
}
else if (!gameEnded )
{
playerArray[i].PlayerScore += rollAllDice();
Console.WriteLine("'{0}': {1}", playerArray[i].PlayerName, playerArray[i].PlayerScore);
}
在这里,您要检查当前玩家是否达到了最终分数。如果是这样,您将打破 for 循环并设置 gameEnded = true,同时打破 while 循环。但这会检查当前玩家的分数;它不会检查当前玩家是否达到分数。这样,您只会发现玩家 A 是否在下一轮比赛中获胜,而不是当前比赛。
这样一来,玩家一达到分数,游戏就结束了:
public void StartGame(int maxPoints)
{
playerArray[0].PlayerTurn = true; // Not sure why you're doing this, so I'm gonna leave this here
Player winner = null;
while (!gameEnded)
{
for (int i = 0; i < playerArray.Length; i++)
{
Player currentPlayer = playerArray[i];
currentPlayer.PlayerScore += rollAllDice();
Console.WriteLine("'{0}': {1}", currentPlayer.PlayerName, currentPlayer.PlayerScore);
if (currentPlayer.PlayerScore >= maxPoints)
{
winner = currentPlayer;
gameEnded = true;
break;
}
}
}
Console.WriteLine("Congratulations, Player '{0}' has won by reaching {1} points.", winner.PlayerName, winner.PlayerScore);
}
此代码中只有一个"problem":一旦玩家达到点数,游戏就会结束。不等回合结束..
我觉得你的流程有点不对劲,这可能会更好。对我来说,真正的问题是你应该先掷骰子,然后再检查是否赢了。这将使您的 WHILE 正常工作。
public void StartGame(int maxPoints)
{
while (!gameEnded)
{
for (int i = 0; i < playerArray.Length; i++)
{
playerArray[i].PlayerScore += rollAllDice();
Console.WriteLine("'{0}': {1}", playerArray[i].PlayerName, playerArray[i].PlayerScore);
if(playerArray[i].PlayerScore >= maxPoints){
Console.WriteLine("Congratulations, Player '{0}' has won by reaching {1} points.",playerArray[i].PlayerName, playerArray[i].PlayerScore);
gameEnded = true;
break;
}
}
}
}
你可以这样做:
public void StartGame(int maxPoints)
{
//playerArray[0].PlayerTurn = true; // Is it necessary?
while (true)
{
for (int i = 0; i < playerArray.Length; i++)
{
Player currentPlayer = playerArray[i];
currentPlayer.PlayerScore += rollAllDice();
Console.WriteLine("'{0}': {1}", currentPlayer.PlayerName, currentPlayer.PlayerScore);
if (currentPlayer.PlayerScore >= maxPoints)
{
Console.WriteLine("Congratulations, Player '{0}' has won by reaching {1} points.", currentPlayer.PlayerName, currentPlayer.PlayerScore);
return;
}
}
}
}
背景;我正在尝试为多人游戏创建一个骰子游戏,您可以在其中选择游戏中想要的玩家数量、骰子面数和骰子本身。每个玩家轮流掷 n 个骰子,每次掷骰子的分数都会附加到玩家 classes playerScore 属性。一旦玩家达到 X 点,玩家将被宣布为获胜者。
问题;下面的代码是 "Game" class 的一部分。当我编译代码时,游戏大部分都符合我的预期;每个玩家每回合掷 5 个骰子并将点数附加到所述玩家,但是一旦玩家达到 100 分,玩家就被宣布为赢家,但骰子会再次为另一个玩家掷骰子,尽管 while 循环无效.在我看来,问题出在 for 循环上,但我不知道如何解决这个问题,我试过 "break" 但它只从 if 语句中断。
我的程序有 3 个 class;死,玩家,游戏。如果您需要更多信息或屏幕截图。我可以提供。
P.S。如果您认为此代码可以改进,请发表评论,我很乐意听到。
if 语句打乱了您的流程。为什么?
if (gameEnded || playerArray[i].PlayerScore >= maxPoints)
{
Console.WriteLine("Congratulations, Player '{0}' has won by reaching {1} points.",playerArray[i].PlayerName, playerArray[i].PlayerScore);
gameEnded = true;
break;
}
else if (!gameEnded )
{
playerArray[i].PlayerScore += rollAllDice();
Console.WriteLine("'{0}': {1}", playerArray[i].PlayerName, playerArray[i].PlayerScore);
}
在这里,您要检查当前玩家是否达到了最终分数。如果是这样,您将打破 for 循环并设置 gameEnded = true,同时打破 while 循环。但这会检查当前玩家的分数;它不会检查当前玩家是否达到分数。这样,您只会发现玩家 A 是否在下一轮比赛中获胜,而不是当前比赛。
这样一来,玩家一达到分数,游戏就结束了:
public void StartGame(int maxPoints)
{
playerArray[0].PlayerTurn = true; // Not sure why you're doing this, so I'm gonna leave this here
Player winner = null;
while (!gameEnded)
{
for (int i = 0; i < playerArray.Length; i++)
{
Player currentPlayer = playerArray[i];
currentPlayer.PlayerScore += rollAllDice();
Console.WriteLine("'{0}': {1}", currentPlayer.PlayerName, currentPlayer.PlayerScore);
if (currentPlayer.PlayerScore >= maxPoints)
{
winner = currentPlayer;
gameEnded = true;
break;
}
}
}
Console.WriteLine("Congratulations, Player '{0}' has won by reaching {1} points.", winner.PlayerName, winner.PlayerScore);
}
此代码中只有一个"problem":一旦玩家达到点数,游戏就会结束。不等回合结束..
我觉得你的流程有点不对劲,这可能会更好。对我来说,真正的问题是你应该先掷骰子,然后再检查是否赢了。这将使您的 WHILE 正常工作。
public void StartGame(int maxPoints)
{
while (!gameEnded)
{
for (int i = 0; i < playerArray.Length; i++)
{
playerArray[i].PlayerScore += rollAllDice();
Console.WriteLine("'{0}': {1}", playerArray[i].PlayerName, playerArray[i].PlayerScore);
if(playerArray[i].PlayerScore >= maxPoints){
Console.WriteLine("Congratulations, Player '{0}' has won by reaching {1} points.",playerArray[i].PlayerName, playerArray[i].PlayerScore);
gameEnded = true;
break;
}
}
}
}
你可以这样做:
public void StartGame(int maxPoints)
{
//playerArray[0].PlayerTurn = true; // Is it necessary?
while (true)
{
for (int i = 0; i < playerArray.Length; i++)
{
Player currentPlayer = playerArray[i];
currentPlayer.PlayerScore += rollAllDice();
Console.WriteLine("'{0}': {1}", currentPlayer.PlayerName, currentPlayer.PlayerScore);
if (currentPlayer.PlayerScore >= maxPoints)
{
Console.WriteLine("Congratulations, Player '{0}' has won by reaching {1} points.", currentPlayer.PlayerName, currentPlayer.PlayerScore);
return;
}
}
}
}