【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;

}

おすすめ

転載: blog.csdn.net/weixin_50067564/article/details/108304510
おすすめ