目录
  • 一、游戏逻辑
  • 二、思维导图
  • 三、游戏过程
  • 四、代码分析
    • 1.设置随机数的方法
    • 2.设置计算机出拳的方法
    • 3.判断输赢的方法
    • 4.玩家猜拳
  • 五、完整代码

    一、游戏逻辑

    1.打印选择菜单(1.play,0.exit)

    2.提示玩家0、1、2 分别代表石头、剪刀、布

    3.设置与计算机博弈次数

    4.为计算机设置出拳(调用rand()函数生成0、1、2其中一个随机数)

    5.玩家出拳

    6.判断输赢

    7.展示玩家和计算机出的拳

    8.若退出游戏展示玩家胜负与平局信息

    二、思维导图

    C语言详细实现猜拳游戏流程

    三、游戏过程

    C语言详细实现猜拳游戏流程

    四、代码分析

    1.设置随机数的方法

    C语言详细实现猜拳游戏流程

    仅仅使用rand()函数来生成随机数是不行的,因为它每玩一次生成的随机数都是相同的,即随机数不随机,所以要通过srand()函数,种下一个随机种子,来产生随机数。根据时间每时每刻都是变化的,可以用time()时间函数来产生种子。

    C语言详细实现猜拳游戏流程

    C语言详细实现猜拳游戏流程

    这里 time_t 的类型就是在C语言中被定义为长整型,而srand()函数的参数类型unsignedint(无符号整形),所以使用时要强制类型转换,而且**time()**函数,不需要设置参数,故用NULL代替。

    2.设置计算机出拳的方法

    comp = rand() % 3;

    调用 rand() 函数 %3 就可以得到有个0~2之间的数值

    3.判断输赢的方法

    C语言详细实现猜拳游戏流程

    据图可以看出只需要判断 (human – comp + 3) % 3 的值是 0、1 还是 2 就可以判断是平局、计算机赢还是电脑赢。

    代码示例:

    void disp_result(is_winer)
    {
    	switch (is_winer)
    	{
    	case 0:
    		printf("平局\n");
    		draw++;//平局次数加1
    		break;
    	case 1:
    		printf("计算机赢\n");
    		lose++;//失败次数加1
    		break;
    	case 2:
    		printf("玩家赢\n");
    		win++;//获胜次数加1
    		break;
    	}
    }

    is_winer 中存放的是 (human – comp + 3) % 3 的值,利用 switch 语句判断其结果,再输出对应的语句。变量draw、lose、win是用来统计玩家战绩信息。

    4.玩家猜拳

    控制玩家输入的范围是0~2之间的数值

    倘若玩家输入的数值不是0~2之间的,程序就无法正常运行了,所以要控制范围。

    可以利用do while循环来达到此目的。

    代码示例:

    do
    {
    	scanf("%d", &human);//玩家出拳
    	printf("\n");
    	if (human < 0 || human > 2)
    	{
    		printf("输入错误,重新输入\n");
    	}
    	is_winer = (human - comp + 3) % 3;
    	disp_result(is_winer);//判断输赢的函数
     
        Dishumanplayer(human);//展示玩家出的拳
    	Discomplayer(comp);//展示计算机出拳
    } while (human < 0 || human > 2);//控制玩家输出范围是0~2	

    if 语句的作用是用来当玩家输入的数值超过了范围时,对其进行提示输入错误。

    五、完整代码

    #include<stdio.h>
    #include<time.h>
    #include<stdlib.h>
    int draw = 0;//统计平局数
    int lose = 0;//统计失败数
    int win = 0;//统计获胜数
    int human = 0;//玩家手势
    int comp = 0;//计算机手势
    int is_winer = 0;//判断胜负
    void menu()
    {
    	printf("****************************************\n");
    	printf("*************** 猜拳游戏 ***************\n");
    	printf("****************************************\n");
    	printf("***************  1.play ****************\n");
    	printf("***************  0.exit ****************\n");
    	printf("****************************************\n");
    }
    void Displayer(int comp, int human)//展示计算机和玩家出拳的函数
    {
    	printf("计算机出的是:");
    	switch (comp)
    	{
    	case 0:
    		printf("石头\n");
    		break;
    	case 1:
    		printf("剪刀\n");
    		break;
    	case 2:
    		printf("布\n");
    		break;
    	}
    	printf("玩家出的是:");
    	switch (human)
    	{
    	case 0:
    		printf("石头\n");
    		break;
    	case 1:
    		printf("剪刀\n");
    		break;
    	case 2:
    		printf("布\n");
    		break;
    	}
    }
    //判断输赢
    void disp_result(is_winer)
    {
    	switch (is_winer)
    	{
    	case 0:
    		printf("平局\n");
    		draw++;//平局次数加1
    		break;
    	case 1:
    		printf("计算机赢\n");
    		lose++;//失败次数加1
    		break;
    	case 2:
    		printf("玩家赢\n");
    		win++;//获胜次数加1
    		break;
    	}
    }
    void game()
    {
    	printf("(0)-石头,(1)-剪刀,(2)-布\n");
    	printf("猜拳游戏开始!!!\n");
    	int number = 0;//猜拳次数
    	printf("请选择猜拳次数:");
    	scanf("%d", &number);
    	while (number)
    	{
    		comp = rand() % 3;//计算机出拳
    		printf("玩家出拳:");
    		do
    		{
    			scanf("%d", &human);//玩家出拳
    			printf("-----------猜拳游戏-------------\n");
    			if (human < 0 || human > 2)
    			{
    				printf("输入错误,重新输入\n");
    			}
    			is_winer = (human - comp + 3) % 3;
    			disp_result(is_winer);//判断输赢的函数
    			Displayer(comp, human);//展示出拳
    		} while (human < 0 || human > 2);//控制玩家输出范围是0~2	
    		number--;
    	}
    }
    int main()
    {
    	srand((int)time(NULL));
    	int input = 0;
    	do
    	{
    		menu();
    		printf("选择玩游戏还是退出游戏!!!\n");
    		printf("请选择:");
    		scanf("%d", &input);
    		switch (input)
    		{
    		case 1:
    			game();
    			break;
    		case 0:
    			printf("退出游戏\n");
    			break;
    		default:
    			printf("选择错误,重新选择\n");
    			break;
    		}
    	} while (input);
    	//展示玩家成绩	
    	printf("\a\n%d平 %d败 %d胜\n", draw, lose, win);
    	return 0;
    }
    声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。