C语言入门小游戏——猜数字游戏(详解)

大家好,我是十一,今天给大家带来"猜数字游戏"的代码和讲解。

目录

前言

基本流程

1.打印菜单

1.1主函数逻辑

2.生成随机数

随机数生成结果

2.1srand函数

2.2时间戳

2.3time函数

2.4生成1-100的随机数

3.猜数字

代码运行效果

总体代码

main函数

game函数

menu函数


 

前言

在做猜数字游戏之前我们先来了解rand函数:

rand函数是专门用来生成随机数的,他对应的头文件是  <stdlib.h>  rand函数返回的是0-rand_MAX(0-32767)之间的一个随机数,既然有返回值,那么我们就需要创建一个变量来接收他的返回值:

int ret =rand();

 

基本流程

1.创建菜单选择开始游戏或退出游戏

2.生成随机数

3.玩家猜数字

1.打印菜单

我们需要生成一个菜单让玩家选择开始或退出

代码如下:

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

1.1主函数逻辑

代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <windows.h>
int main()
{	
	int input = 0;
	srand((unsigned int)time(NULL));//生成1-100的随机数
	do
	{
		menu();//打印菜单
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			system("cls");//清屏让界面变整洁
			game();//游戏函数
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("\n选择错误,请重新选择\n");
			break;
		}
	} while (input);
	return 0;
}

我们想让游戏一上来就能玩,所以我们需要写一个do...while循环,循环的判断条件是玩家输入的数字,所以我们需要创建一个input变量来存放玩家输入的数字,如果玩家输入的数字是1,游戏就正式开始,游戏结束之后循环继续,如果玩家输入的数字是0,就会提示退出游戏,并终止循环,如果输入其他数字则会提示选择错误并让玩家重新选择(循环继续)。

2.生成随机数

代码如下:

int ret = rand();

随机数生成结果

2c17982f56aa43c99e8eaa34c1412f1d.png

 当我们退出游戏再重新打开:

a09fec972a9f43079acdc385cc82e2ad.png

 不难发现,两次程序运行生成的随机数一模一样,那这个游戏就缺少了重复可玩性了,那这个游戏还有什么意义呢?所以我们需要对我们的代码进行优化,其实rand函数在调用之前还需要调用一个函数:srand(设置随机数的生成起点)

2.1srand函数

d96dab10c13f4c7caeb4f5606b18c7c6.png

  srand函数的调用需要传递一个整数,那么我们先试着传递一个0

    srand(0);
	int ret = rand();

817090eb98e447c4968b82eed51b7140.png

可以看到,如果我们传递一个固定的值给srand函数,那么这个函数生成的值也是一个固定值,

那么我们的思路就是传递一个会变化的值给srand函数,那么什么值是一直在变化的呢?没错,就是时间!这时候就要用到时间戳:

2.2时间戳

36c9502db53f41b4aa7493f12fea8833.png

 时间戳就是从1970年1月1日(00:00:00 GMT)至当前时间的总秒数

我们就可以给srand函数传一个时间戳,这时候又要用到一个 time函数(对应的头文件是:<time.h>

2.3time函数

a4d1d4952ae74a73acdaf572248d3738.png

time函数返回的是time_t,time_t本质上其实是一个整数。time函数还需要一个time_t*的一个参数,我们不需要time函数的参数,所以我们就给他传递一个空指针(NULL):

srand((unsigned int)time(NULL));
//为了不让编译器报警告,我们要在time函数前加(unsigned int)

注意:srand函数是设置随机数的生成起点,所以srand在程序中只需要调用一次就可以,不需要多次调用,否则会出现以下问题:

ed997ab273b14b82994d328d8df63b61.png

多次调用后生成的随机数十分接近,调用过快甚至会导致生成的随机数一致!

所以我们要把srand函数放在main函数里而非game函数!

2.4生成1-100的随机数

我们要缩小随机数的生成范围为1-100,这样游戏会变得相对简单。

想要生成1-100的随机数我们就得对rand函数做一些改动:

int ret = rand() % 100 + 1;

任何数%100之后他的余数的取值范围必定是0-99之间,我们再对这个范围进行+1,就会产生1-100的随机数。

3.猜数字

有了随机数我们就可以进行猜数字了,我们需要设置一个循环让玩家能一直猜数字,直到猜对为止

代码如下:

void game()
{
	int n = 0;
	int ret = rand() % 100 + 1;
	while (1)
	{
		printf("请猜数字(1-100)->");
		scanf("%d", &n);
		if (n < ret)
		{
			printf("猜小了\n");
		}
		else if (n > ret)
		{
			printf("猜大了\n");
		}
		else
		{
			printf("恭喜你猜对了,3秒后返回菜单\n");
			Sleep(3000);
			system("cls");
			break;
		}
	}
}

代码运行效果

e1e839925fe643798e36b842a722dd28.png

3b20915768524fda873023ed34d4cbd2.png

总体代码

main函数

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <windows.h>
int main()
{	
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			system("cls");
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("\n选择错误,重新选择\n");
			break;
		}
	} while (input);
	return 0;
}

game函数

void game()
{
	int n = 0;
	int ret = rand() % 100 + 1;
	while (1)
	{
		printf("请猜数字(1-100)->");
		scanf("%d", &n);
		if (n < ret)
		{
			printf("猜小了\n");
		}
		else if (n > ret)
		{
			printf("猜大了\n");
		}
		else
		{
			printf("恭喜你猜对了,3秒后返回菜单\n");
			Sleep(3000);
			system("cls");
			break;
		}
	}
}

menu函数

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

 以上就是本文全部内容,如有不足之处,还请各位多多包涵与指出。

每一个成功者都有一个开始。勇于开始,才能找到成功的路。

 

  • 32
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

十一要变强

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

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

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

打赏作者

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

抵扣说明:

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

余额充值