C语言 新手村学习:石头剪刀布小游戏的代码设计和优化探讨

14 篇文章 3 订阅
13 篇文章 1 订阅

石头剪刀布

小时候都玩过石头剪刀布的游戏,这里通过C语言来制作一个史上最牛逼的石头剪刀布小游戏用来学习交流,这是一篇完整的小游戏代码设计,新手能够很容易的掌握本课程小项目,并且学习怎么优化代码和优化算法,从入门到精通!!!

首先先整理一下:

  • 先玩家输入一个数,然后打印
  • 然后机器人随机一个数 ,然后打印
  • 最后将这两个数作为判断输赢的依据

游戏核心逻辑

通过代号的思想依次构建如下结构体系:

  • 0 — 石头
  • 1 — 剪刀
  • 2 — 布

游戏规则
然后根据游戏规则 石头 > 剪刀 > 布 ,其次特殊情况是 布 > 石头。

通过数字代号表示就是 0 > 1 > 2,其次 2  > 0

可见,规律就是除了2和0比较外,谁小谁就是最大的

代码描述
在游戏中一方扮演机器人,另一方就是玩家,所以定义两个变量play和rob

  • play — 玩家
  • rob — 机器人

//预设play=1,rob=2的情况下

#include<stdio.h>
void main()
{
	int play = 1;
	int rob = 2;
	
	//判断
	if(play == rob)	//相等就是平局
	{
		printf("平局");
	}
	else		//不相等的情况下
	{
		//判断特殊情况 是否存在 一个是2 另一个是0的情况
		if(play == 2 && rob == 0)
		{
			printf("玩家胜利");
		}
		else if(play == 0 && rob == 2)
		{
			printf("机器人胜利");
		}
		else		//不处于特殊情况的话 谁小谁就赢
		{
				if(play < rob)
				{
					printf("玩家胜利");
				}
				else
				{
					printf("机器人胜利");
				}
		}
	}
}

如上面代码,能够完美的实现此逻辑。然后我们加入随机数,讲机器人随机起来。
在c语言中,生成随机数需要3步:

  1. 导入stdlib头文件和time头文件
  2. 创建随机种子
  3. 调用随机函数生成随机数
#include<stdlib.h>	//第一步
#include<time.h>
int main()
{
	srand((unsigned)time(NULL));	//第二部 根据time.h头文件中的方法time()来设置随机种子数
	int rob = rand()%3	//第三步	rand函数会生成 0 到 32767之间的伪随机数 
}

通过rand()函数,控制自己想要随机数的范围

例如:

rand()%3
通过这个方法,与3求余,我们就会得到0 到 2之间随机

因此最终代码为:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void main()
{
	int play;
	int rob;
	srand((unsigned)time(NULL));
	scanf("%d",&play);
	rob = rand()%3;
	printf("玩家:%d\n",play);
	printf("机器人:%d\n",rob);
	//判断
	if(play == rob)	//相等就是平局
	{
		printf("平局");
	}
	else		//不相等的情况下
	{
		//判断特殊情况 是否存在 一个是2 另一个是0的情况
		if(play == 2 && rob == 0)
		{
			printf("玩家胜利");
		}
		else if(play == 0 && rob == 2)
		{
			printf("机器人胜利");
		}
		else		//不处于特殊情况的话 谁小谁就赢
		{
				if(play < rob)
				{
					printf("玩家胜利");
				}
				else
				{
					printf("机器人胜利");
				}
		}
	}
}

优化代码

首先将代码划分为模块化,用函数来封装,这样会使得代码更加简洁明了,方便阅读

使用标记逻辑来优化算法
下面代码将核心逻辑封装在函数coreLogic中,然后此函数返回 1或0或-1这三个值,然后在printWin函数中判断返回的值并且打印结果,如下逻辑:

  • return 1 — 玩家胜利
  • return 0 — 平局
  • return -1 — 机器人胜利
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int coreLogic(int play, int rob)
{
    //判断
	if(play == rob)	//相等就是平局
	{
		//printf("平局");
		return 0;
	}
	else		//不相等的情况下
	{
		//判断特殊情况 是否存在 一个是2 另一个是0的情况
		if(play == 2 && rob == 0)
		{
			//printf("玩家胜利");
			return 1;
		}
		else if(play == 0 && rob == 2)
		{
			//printf("机器人胜利");
			return -1;
		}
		else		//不处于特殊情况的话 谁小谁就赢
		{
				if(play < rob)
				{
					//printf("玩家胜利");
					return 1;
				}
				else
				{
					//printf("机器人胜利");
					return -1;
				}
		}
	}
}

void printWin(ret)
{
	if(ret == 0)
	{
		printf("平局");
	}
	else if(ret > 0)
	{
		printf("玩家胜利");
	}	
	else
	{
		printf("机器人胜利");
	}
}

void main()
{
	int play;
	int rob;
	int ret;	//用来存储逻辑结果的
	srand((unsigned)time(NULL));
	scanf("%d",&play);
	rob = rand()%3;
	printf("玩家:%d\n",play);
	printf("机器人:%d\n",rob);
	ret = coreLogic(play,rob);
	printWin(ret);
}

优化算法

继续优化函数checkWin,使其更加简短易读:

仔细想想,我们上面将checkWin函数的返回值 1代表玩家胜利,-1代表机器人胜利,0代表平局

将这个逻辑继续优化的话就可以变成:

—负数为机器人胜利
—正数为玩家胜利
—0为平局。

根据两个数的相差即可获得正负数结果:
正常情况下 : -(玩家的值 - 机器人的值)

然后,之前提到过的,还有一种特殊情况:一方出的是布,另一方出的是石头。即取个负号即可得到特殊情况的结果了:
特殊情况下: 玩家的值 - 机器人的值

实现优化后的代码逻辑

将coreLogic函数优化成如下代码:

int coreLogic(int play, int rob)
{
	if(play + rob == 2 && play != rob)	//这里通过play+rob==2和play不等于rob来判断是否特殊情况
	{
		return (play - rob);	//特殊情况下,玩家值大玩家获胜
	}
	return -(play - rob);	//正常情况下,玩家值小玩家获胜,所以前面加了一个负号
}

这样优化过来,代码量大大减小了,阅读也更加容易了。

最后,最终的代码如下:

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

int coreLogic(int play, int rob)
{
	if(play + rob == 2 && play != rob)
	{
		return (play - rob);	
	}
	return -(play - rob);
}

void printWin(ret)
{
	if(ret == 0)
	{
		printf("平局");
	}
	else if(ret > 0)
	{
		printf("玩家胜利");
	}	
	else
	{
		printf("机器人胜利");
	}
}

void main()
{
	int play;
	int rob;
	int ret;	//用来存储逻辑结果的
	srand((unsigned)time(NULL));
	scanf("%d",&play);
	rob = rand()%3;
	printf("玩家:%d\n",play);
	printf("机器人:%d\n",rob);
	ret = coreLogic(play,rob);
	printWin(ret);
}
  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值