C# 在一个简单的游戏中,我如何让电脑先行?

C# 在一个简单的游戏中,我如何让电脑先行?,c#,C#,所以我为课堂作业制作了一个简单的游戏。总共有21个筹码,玩家和电脑每回合可以选择1-3个筹码,谁先达到零就赢。但我也必须随机选择比赛开始时谁先走。但是我在写代码时遇到了困难,所以计算机可以先走一步 谁能帮帮我吗。如果随机选择1-3之间的数字,则玩家将首先选择。如果随机选择了4个或5个数字,则计算机将首先运行 int chips=21,用户,计算机; 整型皮克播放器; Random rn=新的Random(); pickPlayer=rn.Next(1,5); 如果(pickPlayer==1 |

所以我为课堂作业制作了一个简单的游戏。总共有21个筹码,玩家和电脑每回合可以选择1-3个筹码,谁先达到零就赢。但我也必须随机选择比赛开始时谁先走。但是我在写代码时遇到了困难,所以计算机可以先走一步

谁能帮帮我吗。如果随机选择1-3之间的数字,则玩家将首先选择。如果随机选择了4个或5个数字,则计算机将首先运行

int chips=21,用户,计算机;
整型皮克播放器;
Random rn=新的Random();
pickPlayer=rn.Next(1,5);
如果(pickPlayer==1 | | pickPlayer==2 | | pickPlayer==3)
{
//玩家先走
而(芯片>0)
{
WriteLine(“有{0}个芯片选择1、2、3或4个芯片”,芯片);
user=Convert.ToInt32(Console.ReadLine());
芯片=芯片-用户;
随机rnd=新随机();

如果(芯片请,使用“userTurn”标志的简单解决方案

int chips=21,用户,计算机;
Random rn=新的Random();
int pickPlayer=rn.Next(1,5);
bool userTurn=pickPlayer==1 | | pickPlayer==2 | | pickPlayer==3;
而(芯片>0)
{
如果(userTurn)
{
WriteLine(“有{0}个芯片选择1、2、3或4个芯片”,芯片);
user=Convert.ToInt32(Console.ReadLine());
芯片=芯片-用户;

if(chips一种方法是创建一个类来表示用户,然后将该类的一个实例(使用
名称
“计算机”)与另一个实例(由用户指定
名称
)放在一起然后,我们可以通过在循环中选择
0
1
的索引来确定下一个用户

我们还可以为该类提供
PlayTurn
的功能,这是一种将多个筹码作为参数的方法,并在询问用户希望获取多少筹码后返回多个筹码(或者如果是计算机播放器,则随机获取):

用户先行的示例输出

先用计算机输出样本


从根本上说,你需要抽象出一台计算机和一个玩家的代码。然后你应该能够大大简化你的代码,让两个玩家都能更容易地开始。理想情况下,你可以考虑拥有一个
player
类,包括一个
HumanPlayer
和一个
ComputerP层
都使用
TakeTurn
方法,或者类似的方法。我同意像玩家移动和计算机移动一样提取这些方法,但我觉得使用类可能有点过火,你不觉得吗?@Joelius-不太可能,不。特别是作为一种学习经验。@MattBurland很公平,学习经验总是f这是针对这样的事情:)仅供参考,
Random中的上界。Next(1,5)
是独占的,这意味着您只能从
1
4
中选择一个数字。
int chips = 21, user, computer;

Random rn = new Random();
int pickPlayer = rn.Next(1, 5);

bool userTurn = pickPlayer == 1 || pickPlayer == 2 || pickPlayer == 3;

while (chips > 0)
{
    if (userTurn)
    {
        Console.WriteLine("There are {0} Chips Choose Either 1,2,3 or 4 chips", chips);

        user = Convert.ToInt32(Console.ReadLine());
        chips = chips - user;

        if (chips <= 0)
        {
            Console.WriteLine("You Lose");
            break;
        }
    }
    else
    {
        computer = rn.Next(1, 4);

        Console.WriteLine("Computer picks {0} chips", computer);

        chips = chips - computer;

        if (chips <= 0)
        {
            Console.WriteLine("You Win");
            break;
        }
    }
    userTurn = !userTurn;
}
Console.ReadLine();
class Player
{
    private static readonly Random Random = new Random();
    public string Name { get; set; }
    public bool IsComputer { get; set; }

    public int PlayTurn(int chipsRemaining)
    {
        var maxToTake = Math.Min(4, chipsRemaining);

        var chipsTaken = IsComputer
            ? Random.Next(maxToTake) + 1
            : Program.GetIntFromUser(
                $"There are {chipsRemaining} chips remaining. " +
                $"Enter the number to take (1 - {maxToTake}): ",
                x => x > 0 && x <= maxToTake);

        if (IsComputer) Console.WriteLine($"Computer takes {chipsTaken} chips");

        return chipsRemaining - chipsTaken;
    }
}
public class Program
{
    static void Main(string[] args)
    {
        var rnd = new Random();
        var chips = 21;

        var players = new List<Player>
        {
            new Player {Name = "Computer", IsComputer = true},
            new Player {Name = GetStringFromUser("Please enter your name: ")}
        };

        // Decide who goes first by choosing a number from 1 - 5. 
        // If it's less than 4, the user goes first
        var nextPlayer = rnd.Next(1, 6) < 4 ? 1 : 0;
        var previousPlayer = nextPlayer;

        while (chips > 0)
        {
            chips = players[nextPlayer].PlayTurn(chips);
            previousPlayer = nextPlayer;

            // Here we choose the next player simply 
            // by changing `1` to `0` (or `0` to `1`)
            nextPlayer = nextPlayer == 0 ? 1 : 0;
        }

        Console.WriteLine(players[previousPlayer].IsComputer
            ? "Congratulations, you won!"
            : "Sorry, you lost. Better luck next time!");

        GetKeyFromUser("\n\nDone! Press any key to exit...");
    }

    // These are helper methods I use to get input from the user
    private static string GetStringFromUser(string prompt)
    {
        Console.Write(prompt);
        return Console.ReadLine();
    }

    public static int GetIntFromUser(string prompt, Func<int, bool> validator = null)
    {
        int result;
        var cursorTop = Console.CursorTop;

        do
        {
            ClearSpecificLineAndWrite(cursorTop, prompt);
        } while (!int.TryParse(Console.ReadLine(), out result) ||
                    !(validator?.Invoke(result) ?? true));

        return result;
    }
}