【C语言】新手实现简单的石头剪刀布人机对战 Codeforces Round #666 (Div. 2)题解ABC Codeforces Round #666 (Div. 2)E Monster Invaders 华为今年不会推出运行鸿蒙OS的手机;Deno 1.3.2发布|极客头条 异或在笔试题中的超神表现 超级码力在线编程大赛初赛 第2场 T1-T4题解 1397D. Stoned Game(博弈) Codeforces Round #666(Div.2)A~D题题解 高性能微服务架构技术选型 阿里饿了么Java4面:(数据结构+框架源码+JVM+分布式) 2020java面试总结 使用ffmpeg提取mp4内部日期重命名文件(需lua) 【剑指Offer】56.2 数组中只出现一次的数字,其他出现3次 JAVA二三事-使用IO+Properties实现动态读取文本信息 排序算法的C语言实现C代码(未更完) RT-Thread 内核学习--信号量的初步使用 【剑指Offer】57.2 和为S的连续正数序列 Qt三方库开发技术:QXlsx介绍、编译和使用 4G DTU模块的作用和功能说明 【Tips】- Wifi模块和4G无线通信 【5G核心网】 Identifiers 身份标识 DPDK支持的硬件:CPU、网卡NIC、加密引擎、基带加速器 如何根据普通ip地址获取当前地理位置 人工智能能力提升指导总结 520了,用32做个简单的小程序 程序员的数学--用贝叶斯定理来推断一个案子 文旅部新规:在线旅游网站不得擅自屏蔽删除评价 不得大数据杀熟 苏宁易购开学季消费大数据:手机以旧换新销量增长299% 做实供电服务“133” 助大数据直上“云”端 思科前程序员离职 5 月后“删虚拟机跑路”,240 万美元打水漂,网友:够狠! 抗疫代码成国博最新藏品 阿里程序员“写代码写进国博挺酷” 国博史上首次收藏代码!它们是阿里程序员写下的抗疫代码 威胜信息发布2020年上半年业绩:物联网产业进入爆发期 营收净利双增长 下月发布会不止有新品折叠屏手机 酷开的物联网家居生态野心初现 史上最全的数据库面试题 数据库面试必看 一个数据库SQL查询的数次轮回 百度智能云正式对外发布百度智能云数据库品牌GaiaDB 数据库三大泛式是什么 电力行业网管需求 IT运维管理解决方案 citrix桌面虚拟化中的运维工具Director SRE运维体系的构建和工作职责划分 运维的核心价值是什么 手游开发定制的全过程详解 开发人员透露:《赛博朋克2077》枪支泛滥 成熟的产品经理如何应对“这个需求不合理” CI/CD管道对开发和运维的重要性 APP开发的流程是怎样的 如何开发一个APP 零基础学web前端开发要学多久 如何系统学习 Web前端要学习哪些内容呢 前端工程师至少要满足四类客户的需求
您的位置:首页 >计算机基础 >

【C语言】新手实现简单的石头剪刀布人机对战

一、要用到的知识点

1、对于C语言循环while、选择结构switch和条件判断if的理解。
2、对逻辑运算符&&和||、三目运算符的运用。
3、随机函数及制表方法

二、敲代码时个人学习领悟

1、写代码之前应先构思好框架,期望实现什么样的效果,确定研究的对象、需要用到的方法,不然写代码时会感觉无从下手。

比如这个人机石头剪刀布游戏,我们就可以想到用数字赋予石头剪刀布,利用数字的大小来判断输赢;

其次对象是人和机器,人要出的手势用scanf接收,switch根据接收来的数值的不同来实现不同的功能。

至于电脑,和人是完全剥离的,行为没有关联,而且是随机没有目的的,于是我就想到了用随机函数来随机电脑的手势,这样,通过比较人和电脑手势代表的数字大小就可以判断输赢。

2、要多思考思考,有的地方有一定的逻辑性,可以试着从多个方面去实现,虽然有时候只是一厢情愿。
例如:

if (human == computer) {printf("平局!\n"); } else if ((human != 0 && human < computer) || (human == 2 && computer == 0)) {printf("电脑赢了!\n"); } else {printf("你赢了!\n");wincount++; } break; 
 其中我用0代表布,1代表剪刀,2代表石头,以上是可以判断的。

但我在写的时候有了一个小想法:可不可以通过取余的特性来避免条件的冗长呢?
于是我尝试了一下:把1代表布,2代表剪刀,3代表石头
其中改成else if(human<computer%3)感觉就差不多,
3%3=0和human比较来合并 布<剪刀<石头 并且 布>石这个条件,我以为这样就可以更简单的实现,结果发现当human取1的时候是满足的,但2就不行了,因为computer随机到3时,结果是人赢了,但是人是剪刀,电脑是石头,这么一看,需要加human==1这个条件,反而更复杂了,所以实践是检验真理的唯一标准,不过老师说过,多想想也没坏处。

3、写的时候看好while(1)循环的位置,定义的变量是否在下一次循环就被重置了(比如全局变量计数的定义就不能在while(1)中。
4、为学习而作,希望读者大佬们能够给出宝贵的建议和意见,在下感激不尽,希望可以共同学习进步。

附上代码

#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#include<time.h>int main(){ //规则如下 //布<剪刀<石头 并且 布>石头 //撒下随机函数种子 srand((unsigned int)time(NULL)); int wincount = 0; int allcount = 0; while (1){int human = 0; int computer = 0;//制表 printf("----------------------------\n"); printf("\t0.退出游戏\n"); printf("\t1.人机对战\n"); printf("----------------------------\n");int userKey = 0; printf("请输入0~1:\n"); scanf("%d", &userKey);switch (userKey){case 0: printf("%d", wincount); break; case 1: //制表 printf("----------------------------\n"); printf("\t0.布\n"); printf("\t1.剪刀\n"); printf("\t2.石头\n"); printf("----------------------------\n"); scanf("%d", &human); computer = rand() % 3;//范围0~2 //使用三目运算符打印双方出手的结果 printf("玩家出的是:%s\n电脑出的是:%s\n",(human == 0) ? "布" : (human == 1) ? "剪刀" : "石头", (computer == 0) ? "布" : (computer == 1) ? "剪刀" : "石头"); if (human == computer) {printf("平局!\n"); } else if ((human != 0 && human < computer) || (human == 2 && computer == 0)) {printf("电脑赢了!\n"); } else {printf("你赢了!\n");wincount++; } break; }if (userKey == 0){printf("总次数为:%d,你赢的次数为:%d", allcount,count);break;//直接跳出while循环}allcount++;system("pause");system("cls");//清屏}system("pause");return 0;}

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。