震惊!还有这么简单的猜数字游戏?!看什么呢~还不点进来看看~~你敢看完,你就会!

1.猜数字游戏的分析和设计

1.1 猜数字游戏的功能说明

游戏要求:
1. 电脑自动生成1~100的随机数。
2.  玩家猜数字,猜数字的过程中,根据猜测数据的大小给出⼤了或小了的反馈,直到猜对,游戏结束。
游戏界面

震惊!还有这么简单的猜数字游戏?!看什么呢~还不点进来看看~~你敢看完,你就会!_第1张图片       震惊!还有这么简单的猜数字游戏?!看什么呢~还不点进来看看~~你敢看完,你就会!_第2张图片       震惊!还有这么简单的猜数字游戏?!看什么呢~还不点进来看看~~你敢看完,你就会!_第3张图片

              初始界面                                    猜数字界面                               结束界面

1.2 游戏的分析和设计

  1.2.1 数据结构的分析

猜数字开始前,我们需要生成一个数字,并且每次游戏的数字都不能重复或可预测。

那么,这里我们就需要生成随机数

怎么生成随机数呢?小江下面会介绍

震惊!还有这么简单的猜数字游戏?!看什么呢~还不点进来看看~~你敢看完,你就会!_第4张图片

                                                                生成随机数界面

其次,猜的过程中需要给出提示,那我们就需要包含if()语句等的循环来实现。

1.2.2 文件结构的设计

猜数字游戏比较简单,这里一个文件就够了。

1.test.c //文件中写游戏的逻辑实现和运行实现

1.2.3 猜数字方法推荐

这里,小江推荐二分法猜数字哦!这样,有次数限制时,更方便哦。

2. 生成随机数

要想完成猜数字游戏,首先得产生随机数,那怎么产生随机数呢?

2.1 rand

C语言提供了⼀个函数叫 rand ,这函数是可以生成随机数的,函数原型如下所示:
1 int rand (void);
rand函数会返回⼀个 伪随机数 ,这个随机数的范围是在0~ RAND_MAX 之间,这个RAND_MAX的大小是 依赖编译器上实现的,但是⼤部分编译器上是 32767
rand函数的使用需要包含⼀个头文件是:stdlib.h
那我们就测试⼀下rand函数,这里多调用几次,产生5个随机数:
1  #include 
2  #include 
3  int main()
4  {
5  printf("%d\n", rand());
6  printf("%d\n", rand());
7  printf("%d\n", rand());
8  printf("%d\n", rand());
9  printf("%d\n", rand());
10 return 0;
11 }
我们先运行⼀次,看看结果,再运行⼀次再看看结果,多运行几次呢?
震惊!还有这么简单的猜数字游戏?!看什么呢~还不点进来看看~~你敢看完,你就会!_第5张图片                          震惊!还有这么简单的猜数字游戏?!看什么呢~还不点进来看看~~你敢看完,你就会!_第6张图片

                第一次运行结果                                                                 第二次运行结果

我们可以看到虽然⼀次运行中产生的5个数字是相对随机的,但是 下⼀次运行程序生成的结果和上⼀次⼀模⼀样 ,这就说明有点问题。
如果再深入了解⼀下,我们就不难发现,其实rand函数生成的随机数是伪随机的,伪随机数不是真正的随机数,是通过某种算法生成的随机数。真正的随机数的是无法预测下⼀个值是多少的。而rand函数是对⼀个叫“ 种子 ”的基准值进行运算生成的随机数。
之所以前面每次运行程序产生的 随机数序列是⼀样的,那是因为rand函数 生成随机数的 默认种子是1
如果要生成不同的随机数,就要让种子是变化的。

2.2 srand

C语言中又提供了⼀个函数叫 srand ,用来初始化随机数的生成器的,srand的原型如下:
1 void srand (unsigned int seed);
程序中在 调用 rand 函数之前先调用srand 函数 ,通过 srand 函数的参数seed来设置rand函数生成随机数的时候的种子,只要种子在变化,每次生成的随机数序列也就变化起来了
那也就是说给srand的种子是如果是随机的,rand就能生成随机数; 在生成随机数的时候又需要⼀个随机数,这就矛盾了。

 

2.3 time

在程序中我们⼀般是 使用程序运行的时间作为种子 的,因为时间时刻在发生变化的。
在C语言中有⼀个函数叫 time ,就可以获得这个时间,time函数原型如下:
1 time_t time (time_t* timer);
time 函数会返回当前的日历时间 ,其实返回的是1970年1月1日0时0分0秒到现在程序运行时间之间的差值,单位是秒。 返回的类型是time_t类型的 time_t 类型本质上其实就是32位或者64位的整型类型
time函数的参数 timer 如果是非NULL的指针的话,函数也会将这个返回的差值放在timer指向的内存中带回去。
如果 timer是NULL,就只返回这个时间的差值 。time函数返回的这个时间差也被叫做: 时间戳
time函数的时候需要包含头文件:time.h

震惊!还有这么简单的猜数字游戏?!看什么呢~还不点进来看看~~你敢看完,你就会!_第7张图片

                                                                       时间戳

//VS2022 上time_t类型的说明
#ifndef _CRT_NO_TIME_T
 #ifdef _USE_32BIT_TIME_T
 typedef __time32_t time_t;
 #else
 typedef __time64_t time_t;
 #endif
#endif
typedef long             __time32_t;
typedef __int64          __time64_t;
如果只是让time函数返回时间戳,我们就可以这样写:
1 time(NULL);//调⽤time函数返回时间戳,这⾥没有接收返回值

那么我们就可以让生成随机数的代码生成如下:

#include 
#include 
#include 
int main()
{
 //使⽤time函数的返回值设置种⼦
 //因为srand的参数是unsigned int类型,我们将time函数的返回值强制类型转换
 srand((unsigned int)time(NULL));
 printf("%d\n", rand());
 printf("%d\n", rand());
 printf("%d\n", rand());
 printf("%d\n", rand());
 printf("%d\n", rand());
 return 0;
}
多运行几次看看,每次的运行就有差异了。

 震惊!还有这么简单的猜数字游戏?!看什么呢~还不点进来看看~~你敢看完,你就会!_第8张图片                    震惊!还有这么简单的猜数字游戏?!看什么呢~还不点进来看看~~你敢看完,你就会!_第9张图片

                 第一次运行结果                                                        第二次运行结果

(注:截图只是当时程序运行的结果,你运行的结果可能不一样)
srand函数是不需要频繁调用的,⼀次运行的程序中调用⼀次就够了。
所以,将srand函数放在main函数中。

2.4 设置随机数的范围

如果我们要生成0~99之间的随机数,方法如下:
1 rand() %100;//余数的范围是0~99

如果我们要生成1~100之间的随机数,方法如下:

1 rand() %100+1;//%100余数的范围是0~99,0~99的数字+1,范围是1~100

如果我们要生成100~200之间的随机数,方法如下:

1  100 + rand()%(200-100+1)
2  //%101余数的范围是0~100,加100后就是100~200
所以如果要生成a~b的随机数,方法如下:
1 a + rand()%(b-a+1)

到这里,我们所有的准备工作和相关知识点已经结束了。下面,就是猜数字游戏的实现了。

3.猜数字游戏的实现

3.1 test.c中初步逻辑实现

#define _CRT_SECURE_NO_WARNINGS 1
//保证scanf()可以正常运行,否则vs2022报错或警告

//运行需要的头文件
#include
#include//rand函数
#include//time函数



int main()
{
	srand((unsigned int)time(NULL));//放在main函数中,只用调用一次
	int input = 0;
	do
	{
		menu();//先初步调用menu(),之后再写代码
		printf("Please input 1 or 0 :");
		scanf("%d", &input);
		switch (input)//选择
		{
		case 1:
			game();//先初步调用game(),之后再写代码
			break;
		case 0:
			printf("退出游戏");
			break;
		default:
			printf("选择错误,请重新选择\n");
			break;
		}
	} while (input);//do while()循环———>游戏可循环多次

		return 0;
}

3.2 menu()函数声明和实现

void menu()
{
	printf("*******************\n");
	printf("*******1.Play******\n");
	printf("*******0.Exit******\n");
	printf("*******************\n");
}

3.3 game()函数声明和实现

void game()
{
	int i = 1 + rand() % (100 - 1 + 1);//设置随机数范围1~100
	int guess = 0;
	while (1)//循环多次输入数字
	{
		printf("请猜数字:");
		scanf("%d", &guess);
		//循环if语句进行提示,直到猜对
		if (guess > i)
			printf("猜大了\n");
		else if (guess < i)
			printf("猜小了\n");
		else
		{
			printf("猜对了\n");
			break;
		}
	}
}

4. 猜数字游戏完整代码

#define _CRT_SECURE_NO_WARNINGS 1
//保证scanf()可以正常运行,否则vs2022报错或警告

//运行需要的头文件
#include
#include//rand函数
#include//time函数

void menu()
{
	printf("*******************\n");
	printf("*******1.Play******\n");
	printf("*******0.Exit******\n");
	printf("*******************\n");
}
void game()
{
	int i = 1 + rand() % (100 - 1 + 1);//设置随机数范围1~100
	int guess = 0;
	while (1)//循环多次输入数字
	{
		printf("请猜数字:");
		scanf("%d", &guess);
		//循环if语句进行提示,直到猜对
		if (guess > i)
			printf("猜大了\n");
		else if (guess < i)
			printf("猜小了\n");
		else
		{
			printf("猜对了\n");
			break;
		}
	}
}
int main()
{
	srand((unsigned int)time(NULL));//放在main函数中,只用调用一次
	int input = 0;
	do
	{
		menu();//先初步调用menu(),之后再写代码
		printf("Please input 1 or 0 :");
		scanf("%d", &input);
		switch (input)//选择
		{
		case 1:
			game();//先初步调用game(),之后再写代码
			break;
		case 0:
			printf("退出游戏");
			break;
		default:
			printf("选择错误,请重新选择\n");
			break;
		}
	} while (input);//do while()循环———>游戏可循环多次

		return 0;
}
还可以加上猜数字的次数限制,如果5次猜不出来,就算失败。
只需要在void game()中添加一点东西就好了。
void game()
{
	int i = 1 + rand() % (100 - 1 + 1);//设置随机数范围1~100
	int guess = 0;
	int count = 5;//设置次数限制
	while (1)//循环多次输入数字
	{
		printf("\n你还有%d次机会\n", count);
		count--;//如果5次之内猜对,游戏结束;如果直到5次机会全部用完,无论成功与否,结束游戏
		printf("请猜数字:");
		scanf("%d", &guess);
		//循环if语句进行提示,直到猜对
		if (guess > i)
			printf("猜大了\n");
		else if (guess < i)
			printf("猜小了\n");
		else
		{
			printf("猜对了\n");
			break;
		}
	}
	if (count == 0)
	{
		printf("你失败了,正确值是:%d\n", i);//5次机会用完
	}
}

这样就实现了次数限制了。

PS:小江目前是个新手小白,这个猜数字游戏也只是最初级的,肯定还有一些功能需要完善,欢迎大家在评论区讨论哦!有问题也可以讨论的!

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