C#小案例-->人机猜拳小游戏

java实现人机猜拳小游戏 通过构建玩家类,计算机类,游戏类,三个类,实现了简单的人机猜拳小游戏。 /** * @author 万星明 * @version 创建时间:2018年10月20日 下午3:01:09 * 计算机类 */ public class Computer { public static String name = "计算机"; public static int score = 0; //... 阅读详情

案例功能要求:

实现代码:

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.测试演示

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

C#面向对象实战:从零构建人机猜拳游戏,掌握控制台应用开发核心 面向对象编程(OOP)是构建现代软件系统的核心范式,其核心思想是通过抽象、封装、继承和多态来模拟现实世界,从而提升代码的可维护性、可扩展性和复用性。在C#等现代编程语言中,OOP原理体现为类与对象的设计,通过定义清晰的职责边界来组织代码结构。掌握OOP对于开发健壮的应用程序具有重要技术价值,尤其在游戏逻辑、业务系统等需要清晰建模的场景中应用广泛。本文以经典的“石头剪刀布”游戏为具体应用场景,深入讲解如何运用C#的枚举(Enum)、Random类、循环控制等基础技术,并融入**防御性编程**和**单一职责原则 阅读详情

相关推荐

C#编程基础第四课2:使用if语句、if-else语句、多重if语句、嵌套if语句完成的C#控制台小程序

知识点:基本算术运算、简单if语句、if-else语句的练习。利用语句完成简单C#控制台程序。 1、运用if-else语句,判断用户输入的年份是否是闰年 static void Main(string[] args) { /* * 输入一个年份,输出是否是闰年 * 提示:闰年的判断标准...

王迪 1732

C#小案例-->可控制输赢的猜拳小游戏

【代码】C#小案例-->可控制输赢的猜拳小游戏。

MM_MS的博客 515

用STM32L552驱动AD9102:一个硬件工程师的实战避坑指南(附完整代码)

本文详细介绍了如何使用STM32L552微控制器驱动AD9102任意波形发生器芯片,从硬件设计到波形生成的完整实战指南。内容包括电源架构、时钟电路设计、输出调理电路等关键硬件设计要点,以及软件驱动架构、波形存储优化和典型波形生成实例。通过实战经验分享,帮助硬件工程师避开常见设计陷阱,提升开发效率。

weixin_30889885的博客 333

【C#】简易人机对抗“石头剪刀布”游戏

需要实现如下图所示的人机猜拳小游戏: 我们需要建立一个玩家类Player、一个电脑类Computer、一个裁判类Judge来分别模拟各自的操作: 【Player.cs】 /* * 作者:JeronZhou * 时间:2021-11-01 * 功能:石头剪刀布游戏 */ using System; namespace Test2_2 { public class Player { public string FistName { get; set; } pub

JeronZhou的博客 2万+

【联邦学习】联邦平均(FedAvg)_附pytorch代码实现

其他代码包括1)数据集划分;2)训练;3)保存结果;4)绘图都可在 https://github.com/kt4ngw/fedavg-pytorch 找到。如果您对文章有建议及指定,也欢迎您留言评论,作者定当虚心修正。

kt4ngw的博客 5111

CentOS7.9 安装 ImageMagick,图片转换为HEIC图像格式

由于ImageMagick7以下不支持heic等图片格式,所以重新安装了ImageMagick7.1版本支持heic格式,在网上找了很多资料,归纳总结并写此文章记录一下。在Linux(CentOS7.9)上安装ImageMagick7.1.1-38。

shmily_i的博客 1941

基于控制台的人机猜拳小游戏

这是一个简单的猜拳小游戏。唯一亮点在于对判断输赢的算法作了优化,if((human_opt-comp_opt+1)%3==0)这句是文眼。 importjava.util.Scanner; publicclassTest{ publicstaticvoidmain(String[]args){ //假设1代表石头,2代表剪刀,3代...

weixin_34417635的博客 186

Dify 第 2 篇 Dify 插件离线安装

Dify是一个支持插件扩展的AI平台,其插件市场提供5种类型插件(模型、工具、Agent策略、扩展、插件包)。由于默认pip安装速度慢,可通过dify-plugin-repackaging工具将插件转换为离线包(使用阿里云镜像加速)。该工具提供两种方式:1)自备Python环境执行脚本;2)使用Docker环境(推荐)。脚本支持从Dify市场或GitHub下载插件,并重新打包为含依赖的离线包,便于通过"本地插件"方式快速安装。

甘蓝的专栏 1265

用c#语言实现人机猜拳游戏,用C#编写一个猜拳的小游戏

是石头剪子布?你得说清楚点儿,需要什么功能回答者:是石头剪子布?你得说清楚点儿,需要什么 - 初学弟子 一级11-05 21:40:33用个随机函数,然后判断一下,就完了回答者:用个随机函数,然后判断一下,就完了 - 总监 八级11-06 08:44:44using System;using ;using ;using ;using ;using ;using ;namespace Windows...

weixin_39638623的博客 457

6、深入解析Microsoft 365核心服务对比与迁移策略

本文深入解析了Microsoft 365的核心服务,包括身份和设备管理、现代设备配置体验、Exchange和SharePoint的迁移策略以及Microsoft Teams的协作功能。同时探讨了迁移过程中需要考虑的安全控制措施,为组织规划和实施云迁移项目提供了全面的指导和建议。

k8s6orchestrator的博客 107

48-OpenCVSharp —-Cv2.MatchTemplate() 函数功能(模板匹配)详解

是 OpenCV 中一个常见且简单的模板匹配算法,适用于目标检测和图像识别中的静态场景。它的优点是易于理解和实现,但在面对旋转、尺度变化、复杂背景或光照变化等挑战时,效果可能大打折扣。在这些情况下,结合多尺度图像、特征匹配算法(如 SIFT、SURF、ORB 等)以及深度学习模型可以显著提高匹配的鲁棒性和精度。模板匹配仍然是一个非常基础但强大的工具,适用于一些简单的图像匹配任务。对于更加复杂和动态的图像识别任务,我们通常会使用其他更加复杂的算法或者深度学习模型来处理。

weixin_45590420的博客 4523

用C# Winform写个猜拳小游戏

简介 猜拳游戏,也叫划拳游戏. 顾名思义就是: 2个人在一起划拳,比谁赢,比谁输. 这里的猜拳游戏是人和电脑之间的较量. 原理 原理很简单, 给人3个值(字符串): 剪刀 石头 布. 电脑的出拳用的随机的Random函数得到整型值,然后将其转换成相应的字符串 用于显示在窗体界面上.同时再写一个方法将字符串(剪刀 石头 布)转成成相应的整型值. 写一个裁判的方法 将两者的整型值进行比较,得出输...

weixin_30500105的博客 864

绿盾用户使用看图软件每次都需要把图片解密之后才能打开查看,怎么才能不用这么麻烦打开就能看

Win10专业版绿盾控制台7.0看图软件FastStone Image Viewer。

本博客,博文仅代表个人操作经验,不能完全解决你的问题,仅供参考,佛系回复。 1202

C#写一个控制台小游戏(猜拳游戏)

今天中午花了1个多小时的时间写了一个C#控制台的小游戏.至于我为什么写为控制台界面,一是控制台不需要做界面,简单,二是内存占用的少(32位占用1.2MB内存,64位占用1.8MB内存). 此游戏设计思路十分简单,就是不断的要求用户键入键盘上的键来达到游戏的目的。游戏是属于人和机器人对战的游戏,废话不多讲,144行代码(无注释): 1 using System; 2 ...

weixin_30621959的博客 795

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

if语句~猜拳游戏

用计算机来生成随机数: Random rand = new Random(); int n = rand.Next(10); //n代表生成一个0-9之间的随机数 案列:做猜拳的小游戏 0---剪刀 1---石头 2---布 思路:电脑随机产生一个数,人输入一个0--2之间的数 1、如果人出的拳减去电脑随机数是1或-2,则人赢了 2、如果人出...

weixin_30438813的博客 176

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

c#--【简单】猜拳游戏

首先,界面代码 1 namespace 石头剪刀布 2 { 3 public partial class Form1 : Form 4 { 5 public Form1() 6 { 7 InitializeComponent(); 8 } 9 10 ...

weixin_30247781的博客 1064

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

人机互动版猜拳游戏(采用OOP面向对象思想,运用Spring IoC方式实现

请根据传统方式,改造为IoC方式实现。 传统方式: 项目共包括4个类:Computer类、User类、Game类和PlayGame类。 public class Computer { public String name; public int score; public void chuquan(int i){ switch(i){ case 1:System.out.println("电脑出拳:剪刀");break; case 2:System.out.println("电脑..

weixin_53630942的博客 3972

人机猜拳游戏(自己编写shell脚本)

#!/bin/bashread -p "请输入你的选择(石头 剪刀 布):" b0a0=$[RANDOM % 3 + 1]#1为石头 2为剪刀 3为布if [ $a0 -eq 1 ];thenif [ $b0 == 石头 ];then &>/dev/nullecho "平局"elif [ $b0 == 剪刀 ];then &&gt...

weixin_34082854的博客 961

AI编程助手与推理路由策略在游戏开发中的高效应用实践

在软件开发领域,AI编程助手正逐渐成为提升开发效率的关键工具。其核心原理是基于大规模代码库训练的语言模型,能够理解开发者意图并生成代码片段。这种技术的价值在于将开发者从重复性编码任务中解放出来,专注于架构设计和核心逻辑。在游戏开发这一特定应用场景中,项目通常涉及复杂的系统交互和快速迭代需求。通过引入“推理路由”策略——即将复杂任务拆解为一系列结构化的子任务并引导AI逐步完成——开发者可以更高效地利用AI助手处理诸如状态机实现、管理器架构搭建、物理交互逻辑等模块。例如,在构建Unity 2D射击游戏原型时,该

weixin_34348174的博客 402

第6章第4节:自定义分词器

本节详解Elasticsearch自定义分词器,解析analyzer三段式结构(char_filter→tokenizer→filter),掌握常用组件如ik_max_word、synonym_graph、ngram等。通过_analyze API调试分词效果,实现“索引时扩展同义词、搜索时不带”的生产级方案,提升中文搜索与智能提示体验。

啊渊的专栏 777

C#使用opencv和Yolo模型识别车牌号

本文基于OpenCVSharp与OnnxRuntime,结合YoloV8n-pose_plate模型(检测车牌位置)和OCR模型(识别车牌文字),实现高效车牌识别。通过预处理、目标检测、NMS筛选及文字识别流程,最终输出车牌框位置与识别文本。代码封装良好,支持自定义路径与置信度阈值,具备实际应用价值。

lweiyue的专栏 180

C# NAFNet 图片去模糊

基于NAFNet与ONNX Runtime的C# WinForms图片去模糊工具,支持DirectML GPU加速与CPU回退,实现一键去模糊、大图分块处理、并排对比及拖拽打开。具备高DPI适配、自绘圆角界面、命令行批量处理等功能,适用于Windows 10/11系统,可灵活配置模型路径与分块大小,解决显存不足与边缘接缝问题。

hixiong123的博客 262

使用C#代码提取、修改或删除 Excel 中的超链接

通过 C# 和 VB.NET,可以方便地管理 Excel 文件中的超链接,包括提取、修改和删除等操作。提取超链接: 获取工作表中的超链接集合,读取每个超链接的地址和类型,并将相关信息保存到文本文件中。修改超链接: 更新超链接的显示文本和目标地址,确保链接信息准确。删除超链接: 移除指定的超链接,同时可以选择保留单元格中的原有显示文本,或清除单元格的全部内容。这些操作可以帮助开发人员更高效地管理 Excel 文档中的链接信息,减少重复的手动操作,也便于在数据迁移、文档维护和自动化报表处理等场景中使用。

2501_93070778的博客 236

C#: 控件不支持透明的背景色

把透明度固定为255。

海天鹰 46

基于 OPC UA 的半导体工厂化学气体传输 SCADA 监控系统:架构设计与 C# MVVM 实现

本文提出一套面向半导体化学气体传输的可演进SCADA系统,基于OPCUA统一信息模型与C#+WPF+MVVM技术栈,实现从气源到机台的全链路实时监控、安全联锁与追溯。通过资产树建模、分层解耦架构与标准对齐(SEMI E30/E95/S2),确保系统可扩展、可维护、可审计,满足高安全、高可靠要求,支持快速落地与持续演进。

ponygame的博客 336
上一篇: C#小案例-->迷你DVD管理器
下一篇: C#小案例-->可控制输赢的猜拳小游戏
MM_MS
博客等级 码龄1年 58粉丝 100原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MM_MS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值