运用分支结构与循环结构写一个猜拳小游戏

下面我们运用平常所学的知识来写一个小游戏,这样能够加强我们学习的趣味性,并且能够更加的巩固我们所学的知识。


游戏代码:

直接放代码:(手势可以使用数字来代替,比如0对应石头,1对应剪刀,2对应布)

#include<time.h>
#include<stdio.h>
#include<stdlib.h>

int human;//人类出拳
int comp;//计算机出拳
int win_no;//胜利次数
int lose_no;//失败次数
int draw_no;//平局次数

char *ha[] = {"石头",  "剪刀", "布"};
//游戏初始化
void initialize()
{
	human = 0;
	comp = 0;
	win_no = 0;
	lose_no = 0;
	draw_no = 0;
	
	srand(time(NULL));//随机生成种子
	printf("猜拳游戏开始\n");
}
//进行玩家输入和机器输入
void jyanken()
{
	int i = 0;
	comp = rand() % 3;
	
	do
	{
		printf("\a\n石头剪刀布……");
		for(;i < 3; i++)
		{
			printf("(%d)%s", i, ha[i]);
		}
		printf(":");
		scanf("%d", &human);
	}while(!(human >= 0 && human <= 2));
	
}
/*更新胜利/失败/平局的次数*/
void count_no(int result)
{
	switch(result)
	{
	case 0:draw_no++; break;
	case 1:lose_no++; break;
	case 2:win_no++;  break;
	default:break;
	}
}

/*显示判断结果*/
void disp_result(int result)
{
	switch(result)
	{
	case 0:printf("平局");   break;
	case 1:printf("你输了"); break;
	case 2:printf("你赢了"); break;
	default:printf("错误\a"); break;
	}
}

/*确认是否再次挑战*/
int comfirm_retry()
{
	int x;
	printf("再来一次吗……(1)是 (0)否");
	scanf("%d", &x);
	
	return x;
}

int main()
{
	int judge;//胜负
	int retry;
	
	initialize();//游戏初始化
	
	do
	{
		jyanken();//运行猜拳游戏
		
		/*显示计算机和我选出的手势*/
		printf("我出%s, 你出%s.\n", ha[comp], ha[human]);
		
		judge = (human - comp + 3) % 3;
		
		count_no(judge);//统计胜负次数
		
		disp_result(judge);//显示胜负
		
		retry = comfirm_retry();
	}while(retry != 0);
	
	printf("胜:%d\n负:%d\n平局:%d", win_no, lose_no, draw_no);
	
	return 0;
}

全局变量的定义及其原因

首先,我们先进行设置全局变量,这个变量从程序的开始到结束都是始终存在的,设置全局变量的目的是因为,在使用函数分装代码时,大部分都能用到这些变量。

initialize()函数

接着创建initialize();函数进行初始化,此函数的功能是讲这些全局变量的值都初始化为0,并且使用srand()函数和time()函数生产一个伪随机数,也就是种子,这两个函数大家可以自行搜索一下。

jyanken();函数

紧接着我们创建jyanken();函数,此函数的功能是实现机器和玩家的出拳。

具体的实现方法:

comp = rand() % 3; rand()是上面生成种子的值,我们用它进行求余,可以得到余数为0,1,2的值,这些值可以表示机器所出的手势,之后进入do循环,利用for语句中的printf函数来显示玩家的选择界面,使用scanf函数来输入human的值,也就是我们所要选择的手势,在whlie语句内要确保输入的human的值在0—2内。

count_no()函数和disp_result()函数

接下来我们创建count_no()函数,此函数使用来实现对游戏进行胜局/败局/平局,局数的统计,我们利用形参result所谓判断胜负的依据,如何作为依据我们最后再来说明。

之后我们创建disp_result();函数,用来显示游戏对局的结果。函数功能的实现与上面的函数一致

comfirm_retry()函数

最后我们创建comfirm_retry();函数,功能是确认玩家是否继续进行游戏,函数的实现是得到一个你输入的返回值,该值将用于在主函数中判断跳出do循环的条件。

main函数中变量judge的作用:

在主函数中我们创建judge变量,这样对其进行赋值:judge = (human - comp + 3) % 3;

judge作为实参传给函数后能作为判断依据的原因

并且把这个变量作为实参传给count_no(),disp_result()函数,下面将解释为何这个实参的计算结果能作为判断的依据:

human comp human-comp (human-comp+3)%3
0 0 0 0
1 1 0 0
2 2 0 0
玩家失败
human comp human-comp (human-comp+3)%3
0 2 -2 1
1 0 1 1
2 1 1 1
玩家胜利
human comp human-comp (human-comp+3)%3
0 1 -1 2
1 2 -1 2
2 0 2 2

游戏对局结果的显示:

使用printf函数,进行格式化输出,显示出win_no, lose_no, draw_no的结果。

相关推荐

  1. (六):分支循环结构的应用

    2024-05-09 08:14:01       36 阅读
  2. 循 环 结 构

    2024-05-09 08:14:01       34 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-09 08:14:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-09 08:14:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-05-09 08:14:01       87 阅读
  4. Python语言-面向对象

    2024-05-09 08:14:01       96 阅读

热门阅读

  1. 链表的原理和实现python

    2024-05-09 08:14:01       34 阅读
  2. 在Linux中,用户的软件一般安装在哪里比较好

    2024-05-09 08:14:01       34 阅读
  3. 【算法】用存入下标的方法来巧解单调队列

    2024-05-09 08:14:01       38 阅读
  4. 【linux】隐藏文件,vim 或 gedit 打开隐藏文件

    2024-05-09 08:14:01       30 阅读
  5. 探索九型人格测试API接口:神奇之处暗藏何处?

    2024-05-09 08:14:01       27 阅读
  6. Amazon IoT 服务的组件

    2024-05-09 08:14:01       34 阅读
  7. docker安装部署FastGPT

    2024-05-09 08:14:01       29 阅读
  8. selenium 同样的class如何选择第二个

    2024-05-09 08:14:01       33 阅读