C语言猜数字游戏实现

欢迎来到 Claffic 的博客

前言: 

猜数字是一项简单的小游戏,跟着C看看如何从无到有,有逻辑地把这项小游戏用C语言写出来吧。

初学C语言的小伙伴放心食用~~~

目录

❤️1.整体框架

2.简易菜单

3.游戏逻辑

3.1随机数字的生成

3.2猜数字

4.最终成果展示


猜数字游戏的要求:

1.生成1~100之间的随机数;

2.猜数字:

   1>猜小了,程序会告诉你猜小了,继续猜;

   2>猜大了,程序会告诉你猜大了,继续猜;

   3>才对了,程序会告诉:恭喜你猜对了!!!,游戏结束。

3.游戏可以反复玩。


1.整体框架

C语言猜数字游戏实现_第1张图片

进入程序,输入1开始猜数字,输入0退出游戏,此处可用switch-case执行分支;

要使游戏至少能进行一次,可以使用do  while循环;

这样可以先写出整体框架

#include
int main()
{   
	int input = 0;//要作为循环判断条件,所以初始化在循环体系外
	do
	{
		//打印菜单
		menu();
		//选择入口
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("猜数字\n");
            //游戏逻辑
			geme();
			break;
		case 0:
			//退出
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,请重新输入");
			break;
		}

	} while (input);//input是0时为假,是1时为真,可以作为判断标志
	return 0;
}

2.简易菜单

打印一个简易菜单,创建一个菜单函数:

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

到这里游戏的基本框架就有了

运行:

C语言猜数字游戏实现_第2张图片


3.游戏逻辑

3.1随机数字的生成

在C语言中,有专门生成随机整数的函数,那就是rand函数

C/C++资源网站

C语言猜数字游戏实现_第3张图片

rand函数返回的是0~RNAD_MAX之间的整数值

转到定义,可以看到RAND_MAX代表的十六进制数字 7fff

转换为十进制就是32767

那就明白了:

rand()随机生成0~32767之间的整数

按照思路创建game函数:

void game()
{
		int ret = rand();
		printf("%d\n", ret);
}

运行几次:

C语言猜数字游戏实现_第4张图片 C语言猜数字游戏实现_第5张图片C语言猜数字游戏实现_第6张图片C语言猜数字游戏实现_第7张图片

发现每次生成的数字都是相同的,

每次生成的数字是相同的?那可没意思,

怎么解决这个问题呢?

其实rand函数并不是这么使用的,我们忽视了一个关键点:

C语言猜数字游戏实现_第8张图片

那就是在使用rand函数之前要调用srand函数来设置随机数的生成器

C语言猜数字游戏实现_第9张图片

要调用srand函数,找到关于srand函数的信息

应用srand要返回一个整数值

下面随机给srand一个整数并运行程序:

C语言猜数字游戏实现_第10张图片C语言猜数字游戏实现_第11张图片

C语言猜数字游戏实现_第12张图片C语言猜数字游戏实现_第13张图片

诶?

如果给srand的值是固定的,那生成的数也是固定的

反过来想,如果给srand的值不是固定的,那生成的数不就不是固定的了吗?也就是实现了随机数的生成

问题又来了,有没有随时变化的值?

没错,那就是时间

于是我们引入一个概念:时间戳

恰好 C语言中,time函数会返回时间戳

C语言猜数字游戏实现_第14张图片

time_t本质上就是整形,这里不做过多阐述

需要注意的是time函数需要的是time_t* ,也就是指针

而我们对返回的值没有确界要求,只要让time返回一个数就可以了

那我们给空指针NULL

srand(time(NULL));

此时出现了警告:

解决方法很简单,把time强制转化成unsigned int就好

于是就有了:

srand((unsigned int)time(NULL));

 加入game函数:

void game()
{
	srand((unsigned int)time(NULL));
	int ret = rand();
	printf("%d\n", ret);
}

运行几次:

C语言猜数字游戏实现_第15张图片

问题双来了:

每次生成的数字都很接近,尤其是前后选择时间较短的时候

原因是每次选择都会调用一次srand函数,相当于每次进行游戏都会重置起点

其实srand函数只要调用一次就行了,不需要频繁调用

通过把srand函数放到main函数开头就可以解决这个问题了

最后,我们需要的是1~100的整数

只需要把rand返回的值模100并+1就ok

void game()
{
	int ret = rand()%100+1;
	printf("%d\n", ret);
}

3.2猜数字

常规思路

输入并判断:

    printf("猜一个吧");
	scanf("&d", &num);
	if (num > ret)
	{
		printf("猜大了");
	}
	else if (num < ret)
	{
		printf("猜小了");
	}
	else
	{
		printf("恭喜你猜对了!!!");
	}

 猜大和猜小都需要重新猜,知道猜对为止

所以while循环给死,猜对跳出

void game()
{
	int ret = rand()%100+1;
	int num = 0;
	//printf("%d\n", ret);
	while (1)
	{
		printf("猜一个吧:");
		scanf("%d", &num);
		if (num > ret)
		{
			printf("猜大了\n");
		}
		else if (num < ret)
		{
			printf("猜小了\n");
		}
		else
		{
			printf("恭喜你猜对了!!!\n");
			break;
		}

	}
}

4.最终成果展示

#define _CRT_SECURE_NO_WARNINGS 1
#include
#include//包含rand和srand函数
#include//包含time函数
void menu()
{
	printf("****************\n");
	printf("*    1.play    *\n");
	printf("*    0.exit    *\n");
	printf("****************\n");
}
void game()
{
	int ret = rand()%100+1;
	int num = 0;
	//printf("%d\n", ret);
	while (1)
	{
		printf("猜一个吧:");
		scanf("%d", &num);
		if (num > ret)
		{
			printf("猜大了\n");
		}
		else if (num < 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("选择错误,请重新输入");
			break;
		}

	} while (input);
	return 0;
}

C语言猜数字游戏实现_第16张图片

这游戏我能玩一天!!! 


如果你觉得这篇文章还不错并且对你有帮助,不妨动动手指点赞收藏加转发,给一个大大的关注

你们的每一次支持都将转化为我前进的动力!!!

你可能感兴趣的:(小项目,游戏,c语言)