基于玩家回合的骰子游戏(循环有问题)

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;
                }
            }
        }
    }