猜数字小游戏(随机生成’三剑客‘)

 

大家好,我是一只励志要翻身的小牛,废话少说,下面就给大家介绍第一个C语言小游戏——猜数字小游戏!

文章目录

一、游戏规则

二、效果展示

三、游戏设计思路

四、游戏交互界面

1.创建游戏菜单

2.创建游戏逻辑主体

五、游戏实现

1、随机数生成”三剑客“

(1)随机数生成器:rand函数

(2)随机数发生器的初始化函数:srand函数

(3)获取时间戳:time函数: 

(4)三剑客的”有机结合“ -真随机的实现

2、玩家输入与判断

六、完整代码

七、结语


一、游戏规则

至于猜数字嘛,见名知意,规则无非就是:玩家反复输入猜的数字直到猜对为止,下面,我们就通过C语言实现一个1-100之间的猜数字游戏,老铁们准备好了吗,发车了!

二、效果展示

三、游戏设计思路

1.游戏交互界面

        (1)创建游戏菜单

        (2)创建游戏逻辑主体

2.猜数字游戏

        (1)电脑生成随机数字

        (2)玩家输入数字

        (3)判断是否猜对

四、游戏交互界面

1.创建游戏菜单

玩游戏怎么能没有菜单呢,下面我们创建一个简易的菜单供玩家选择:

void menu()
{
	printf("**************************************************\n");
	printf("*******      1->play       0->exit        ********\n");
	printf("**************************************************\n");
}

2.创建游戏逻辑主体

游戏的逻辑的是否完美实现是整个游戏成败的关键,对于这样一个简单的小游戏我们可以这样实现游戏主体逻辑:

int main()
{	
    srand((unsigned int)time(NULL));//拿时间戳来设置随机数的生成起始点
	int input = 0;
	do {
		menu();
		printf("请选择:");
		scanf("%d",&input);
		switch (input)
		{case 1:
			game();//猜数字游戏
			break;
		case 0:
			printf("游戏结束\n");
			break;
		default:
			printf("选择错误\n");
			break;
		}
	} while (input);//这里用do while 循环是因为这个游戏需要至少进去一次
		            //特点:先执行,后判断
	return 0;
}

1、因为游戏是面向用户的,所以这里需要定义并调用菜单函数——menu()

2、因为游戏至少可以进入一次,所以用do-while()循环——代码至少执行一次

注意:while(input)——循环条件input的巧妙之处,C语言中0为假,非0为真,所以这里用户输入1或输入 其他非0数字导致错误,都会再次调出菜单让用户选择,无需增加其他条件。

当然了这里的猜数字游戏函数-game()还未定义,我们接下来我们就需要对 game()函数进行实现:

五、游戏实现

1、随机数生成”三剑客“

我们回到游戏的设计思路,其实猜数字游戏中最重要的一步就是生成随机数,那我们应该如何生成随机数呢?这里C语言为我们提供了随机数生成三剑客:rand--srand--time

(1)随机数生成器:rand函数

rand()函数的属性:int rand (void)——生成随机整数(0-32767)

分析:rand()函数接受参数为空,返回一个int类型的随机整数。头文件-stdlib.h

但是rand()函数真的随机吗?我们下面一探究竟:

#include <stdio.h>
#include<stdlib.h>
int main()
{
	int i = 5;
	while (i)
	{
		int ret = rand();
		printf("%d\n", ret);
		i--;
	}
	return 0;
}

执行3次结果:

可以发现,循环5次后,每组的随机数据都一致,因此答案就很明显了,rand()函数是假随机。

(2)随机数发生器的初始化函数:srand函数

那么我们还有没有办法让它真随机呢?办法当然是有的啦,C语言同时为我们提供了一个随机数发生器的初始化函数:srand函数--配合rand函数使用,设置随机数生成起点

srand()函数属性:void srand (unsigned int seed)

分析:srand函数接受一个unsigned int类型,返回空(不需要返回值->设置随机数生成起点),头文件-stdlib.h

执行结果:

可以发现,rand函数生成的随机值随srand函数接受参数变化而变化,要想让rand函数生成一个随机数,srand函数就需要接收一个随机值

(3)获取时间戳:time函数: 

那么这个随机值去哪找呢?因为时间是不断变化的,因此我们可以让srand函数接收一个时间戳。 这里引出获取时间戳:time函数:

time函数属性:time_t time (time_t* timer)

分析:time函数接收一个指针类型,返回time_t类型,头文件-time.h

(4)三剑客的”有机结合“ -真随机的实现

1.rand函数的属性:int rand (void)

2.srand函数属性:void srand (unsigned int seed)

3.time函数属性:time_t time (time_t* timer)

了解了“三剑客”各自的属性,就可以开始配置随机数生成器,实现“真随机 ”

//生成随机数的大致逻辑结构
#include<stdlib.h>
#include<time.h>
int main()
{
	srand((unsigned int)time(NULL));
	int ret = rand();
	return 0;
}

注意:

1、time函数接收指针类型参数,所以传入NULL-空指针

2、srand函数接收unsigned int类型参数 ,所以将time返回类型time_t转换为unsigned int类型

2、玩家输入与判断

玩家输入与判断模块通过简单的while循环语句与if判断语句即可实现,这里就不再分开赘述,代码如下:

void game()
{
	int a = 0;
	//rand()函数生成一个随机数
	int ret = rand() % 100 + 1;//1-100之间的随机数
	while (1)//1为真,让他一直循环,直到猜对
	{
		printf("请猜数字:");
		scanf("%d", &a);
		if (a > ret)
		{
			printf("猜大了\n");
		}
		else if (a < ret)
		{
			printf("猜小了\n");
		}
		else
		{
			printf("恭喜你,猜对了!\n");
			break;
		}
	}
}

注意:

1、这里的srand函数放到了主函数中,因为调用一次函数就会设置一个随机数的生成器,不需要重复调用。

2、 rand()%100+1的含义:因为rand生成随机整数范围是(0-32767),所以rand()%100限定了范围(0-99),加1满足(1-100)范围需求。

六、完整代码

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
	printf("**************************************************\n");
	printf("*******      1->play       0->exit        ********\n");
	printf("**************************************************\n");
}
void game()
{
	int a = 0;
	//rand()函数生成一个随机数
	int ret = rand() % 100 + 1;//1-100之间的随机数
	while (1)//1为真,让他一直循环,直到猜对
	{
		printf("请猜数字:");
		scanf("%d", &a);
		if (a > ret)
		{
			printf("猜大了\n");
		}
		else if (a < ret)
		{
			printf("猜小了\n");
		}
		else
		{
			printf("恭喜你,猜对了!\n");
			break;
		}
	}
}
int main()
{	
    srand((unsigned int)time(NULL));//拿时间戳来设置随机数的生成起始点
	int input = 0;
	do {
		menu();
		printf("请选择:");
		scanf("%d",&input);
		switch (input)
		{case 1:
			game();
			break;
		case 0:
			printf("游戏结束\n");
			break;
		default:
			printf("选择错误\n");
			break;
		}
	} while (input);//这里用do while 循环是因为这个游戏需要至少进去一次
		            //特点:先执行,后判断
	return 0;
}

七、结语

铁汁们,猜数字游戏这点事大家都明白了吗?如果本文对你有所帮助的话,请给博主一个一键三连哦🥰

  • 22
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 18
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不摸鱼的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值