一、要用到的知识点
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;
}