案例功能要求:







实现代码:
1.Program类: 主程序类
namespace _02_人机猜拳
{
/// <summary>
/// 程序入口类,负责启动游戏
/// </summary>
internal class Program
{
/// <summary>
/// 程序主方法,程序从这里开始执行
/// </summary>
/// <param name="args">命令行参数(本程序未使用)</param>
static void Main(string[] args)
{
// 创建游戏实例
Game game = new Game();
// 调用游戏启动方法,开始人机猜拳流程
game.StartGame();
}
}
}
2.Role类: 角色抽象基类
namespace _02_人机猜拳
{
/// <summary>
/// 角色抽象基类(User和Computer的父类)
/// 封装所有角色的公共属性(姓名、得分)和抽象行为(出拳)
/// </summary>
public abstract class Role
{
// 私有字段:存储角色姓名
private string _name;
// 私有字段:存储角色得分
private int _score;
// 公有属性
public int Score { get { return _score; } set { _score = value; } }
public string Name { get { return _name; } set { _name = value; } }
// 公有构造方法
public Role()
{
_name = "";
_score = 0;
}
/// <summary>
/// 带参构造函数:创建角色时直接指定姓名和得分
/// </summary>
/// <param name="name">角色姓名</param>
/// <param name="score">初始得分</param>
public Role(string name, int score)
{
_name = name;
_score = score;
}
/// <summary>
/// 抽象方法:出拳(由子类User和Computer实现具体逻辑)
/// </summary>
/// <returns>出拳对应的数字(1=剪刀,2=石头,3=布)</returns>
public abstract int ShowFist();
}
}
3.User类: 用户类(继承自Role)
using System;
namespace _02_人机猜拳
{
/// <summary>
/// 用户类(继承自Role),表示玩家角色
/// </summary>
public class User : Role
{
/// <summary>
/// 实现父类的抽象出拳方法:接收用户输入并返回对应的出拳数字
/// 增加输入验证,避免非数字/非法数字导致程序崩溃
/// </summary>
/// <returns>出拳数字(1=剪刀,2=石头,3=布)</returns>
public override int ShowFist()
{
int fistNum;
// 循环直到用户输入合法的数字(1-3)
while (true)
{
// 读取用户输入的字符串
string input = Console.ReadLine();
// 验证输入是否为数字,且在1-3范围内
if (int.TryParse(input, out fistNum) && fistNum >= 1 && fistNum <= 3)
{
break; // 输入合法,跳出循环
}
else
{
Console.WriteLine("输入无效!请输入1-3之间的数字(1=剪刀,2=石头,3=布):");
}
}
// 根据出拳数字,转换为对应的文字描述
string fistStr = "";
switch (fistNum)
{
case 1:
fistStr = "剪刀";
break;
case 2:
fistStr = "石头";
break;
case 3:
fistStr = "布";
break;
default:
fistStr = "";
break;
}
// 输出用户的出拳结果
Console.WriteLine($"你出拳:{fistStr}");
return fistNum;
}
}
}
4.Computer类: 电脑类(继承自Role)
using System;
namespace _02_人机猜拳
{
/// <summary>
/// 电脑类(继承自Role),表示AI对手角色
/// </summary>
public class Computer : Role
{
// 随机数生成器:用于生成电脑的随机出拳
private readonly Random _random = new Random();
/// <summary>
/// 实现父类的抽象出拳方法:随机生成1-3的数字作为出拳
/// </summary>
/// <returns>出拳数字(1=剪刀,2=石头,3=布)</returns>
public override int ShowFist()
{
// 生成1-3之间的随机整数(Random.Next(3)生成0-2,+1后变为1-3)
int fistNum = _random.Next(3) + 1;
// 根据出拳数字,转换为对应的文字描述
string fistStr = "";
switch (fistNum)
{
case 1:
fistStr = "剪刀";
break;
case 2:
fistStr = "石头";
break;
case 3:
fistStr = "布";
break;
default:
fistStr = ""; // 因前面验证过,此分支不会触发
break;
}
// 输出电脑的出拳结果
Console.WriteLine($"电脑出拳:{fistStr}");
return fistNum;
}
}
}
5 .Game类: 游戏核心类
using System;
namespace _02_人机猜拳
{
/// <summary>
/// 游戏核心类:负责游戏的初始化、对战流程、结果计算与展示
/// </summary>
public class Game
{
// 当前玩家对象
private readonly User _user = new User();
// 当前电脑对手对象
private readonly Computer _computer = new Computer();
/// <summary>
/// 游戏初始化方法:设置对战双方的角色(电脑角色+玩家姓名)
/// </summary>
private void Initial()
{
Console.WriteLine("-----------欢迎进入游戏世界--------------");
Console.WriteLine("\n\n\n");
Console.WriteLine("\t*************");
Console.WriteLine("\t** 猜拳,开始 **");
Console.WriteLine("*****************************");
Console.WriteLine("\n\n\n");
Console.WriteLine("出拳规则:1.剪刀 2.石头 3.布");
// 步骤1:选择电脑对手的角色(刘备/孙权/曹操)
Console.WriteLine("请选择对方角色(1.刘备 2.孙权 3.曹操):");
int roleChoice;
// 循环直到用户输入合法的角色编号(1-3)
while (true)
{
if (int.TryParse(Console.ReadLine(), out roleChoice) && roleChoice >= 1 && roleChoice <= 3)
{
break;
}
else
{
Console.WriteLine("输入无效!请输入1-3之间的数字选择角色:");
}
}
// 根据选择设置电脑角色的姓名
switch (roleChoice)
{
case 1:
_computer.Name = "刘备";
break;
case 2:
_computer.Name = "孙权";
break;
case 3:
_computer.Name = "曹操";
break;
default:
_computer.Name = "未知角色";
break;
}
// 步骤2:输入玩家姓名
Console.WriteLine("请输入你的姓名:");
string userName;
// 循环直到用户输入非空姓名
while (string.IsNullOrWhiteSpace(userName = Console.ReadLine()))
{
Console.WriteLine("姓名不能为空!请输入你的姓名:");
}
_user.Name = userName;
// 步骤3:展示对战双方信息
Console.WriteLine($"\n{_user.Name} VS {_computer.Name} 对战");
}
/// <summary>
/// 单局对战方法:调用双方出拳方法,比较结果并更新得分
/// </summary>
private void PlaySingleRound()
{
// 1. 玩家出拳
int userFist = _user.ShowFist();
// 2. 电脑出拳
int computerFist = _computer.ShowFist();
// 3. 比较出拳结果,判断胜负
/* 胜负规则(以玩家为视角):
- 玩家赢:剪刀(1)克布(3)、石头(2)克剪刀(1)、布(3)克石头(2)
- 平局:双方出拳相同
- 玩家输:其他情况
*/
if ((userFist == 1 && computerFist == 3) ||
(userFist == 2 && computerFist == 1) ||
(userFist == 3 && computerFist == 2))
{
Console.WriteLine("结果:恭喜,你赢了!!!");
_user.Score++; // 玩家得分+1
}
else if (userFist == computerFist)
{
Console.WriteLine("结果:和局 真衰! 嘿嘿,等着瞧吧!");
// 平局无得分变化
}
else
{
Console.WriteLine("结果:^_^ 你输了,真笨!!!");
_computer.Score++; // 电脑得分+1
}
}
/// <summary>
/// 展示最终对战结果:输出双方得分、总战绩
/// </summary>
/// <param name="roundCount">总对战局数</param>
private void ShowFinalResult(int roundCount)
{
Console.WriteLine("\n-----------------------------");
Console.WriteLine($"{_computer.Name} VS {_user.Name}");
Console.WriteLine($"对战次数:{roundCount}次\n");
// 输出得分表格
Console.WriteLine("姓名\t得分");
Console.WriteLine($"{_user.Name}\t{_user.Score}");
Console.WriteLine($"{_computer.Name}\t{_computer.Score}\n");
// 输出最终胜负结论
if (_user.Score > _computer.Score)
{
Console.WriteLine("结果:好厉害,电脑都被你打败了!");
}
else if (_user.Score < _computer.Score)
{
Console.WriteLine("结果:呵呵,笨笨,下次加油啊~");
}
else
{
Console.WriteLine("结果:打成平手,下次再和你一决高下!");
}
}
/// <summary>
/// 游戏启动方法:串联初始化、多轮对战、结果展示的完整流程
/// </summary>
public void StartGame()
{
// 1. 初始化游戏(设置角色、姓名)
Initial();
// 2. 询问是否开始游戏(验证输入合法性)
Console.WriteLine("\n要开始吗(y/n):");
string isStart;
while (true)
{
isStart = Console.ReadLine()?.ToLower() ?? "";
if (isStart == "y" || isStart == "n")
{
break;
}
Console.WriteLine("输入无效!请输入y(开始)或n(退出):");
}
// 3. 如果用户选择开始,进入多轮对战循环
if (isStart == "y")
{
string nextRound = "y"; // 控制是否开启下一轮
int totalRound = 0; // 统计总对战局数
while (nextRound.ToLower() == "y")
{
totalRound++; // 局数+1
Console.WriteLine($"\n===== 第{totalRound}局 =====");
Console.WriteLine("请出拳:1.剪刀 2.石头 3.布(请输入相应数字):");
// 执行单局对战
PlaySingleRound();
// 询问是否开启下一轮(验证输入合法性)
Console.WriteLine("\n是否开始下一轮(y/n):");
while (true)
{
nextRound = Console.ReadLine()?.ToLower() ?? "";
if (nextRound == "y" || nextRound == "n")
{
break;
}
Console.WriteLine("输入无效!请输入y(继续)或n(结束):");
}
}
// 4. 游戏结束,展示最终结果
ShowFinalResult(totalRound);
}
else
{
Console.WriteLine("游戏已退出,欢迎下次再来!");
}
}
}
}
6.测试演示

希望对大家有所帮助。感谢大家的关注和点赞。
1732



被折叠的 条评论
为什么被折叠?



