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