C语言猜数字小游戏及如何生产随机数rand()

实现目标

  • 菜单 首先猜数字游戏肯定得要有一个随机数
  • 可以重复玩多次
  • 猜数字能提示(大了,小了,对了)

菜单

  • 一般游戏都有个菜单界面,询问玩家游戏或者退出!我们将它封装成一个函数Game_begin提示玩家。
void Game_begin()
{
	printf("****************************\n");
	printf("**********猜数字游戏********\n");
	printf("******     1.play     ******\n");
	printf("******     2.exit     ******\n");
	printf("****************************\n");
	printf("请输入选项:\n");
}

游戏框架
如何实现反复玩游戏,首先我们想到的就是利用循环 while for do while实现循环达到反复游戏的目的

这里便选择switch更直观一点

1 .进入游戏
2.退出游戏
3.选择错误(然后默认退出)

游戏主体
在封装好的函数里将要猜的值传进去,用while(1)形成一个死循环
接着scanf输入一个数字,用if语句判断猜大还是猜小,如果没猜对就继续循环,每猜一次就计数一次,如果猜对了就break退出。

  • 部分游戏主题代码
int Guess_num(int ret)//ret为随机数
{
	int temp = 0;//计数器
	int num = 0;//输入的数
	while (1)
	{
		printf("请猜一个数字:");
		scanf_s("%d", &num);
		temp = temp + 1;//每次循环完计数+1
		if (num < ret)
		{
			printf("猜小了!\n");
		}
		else if (num > ret)
		{
			printf("猜大了!\n");
		}
		else
		{
			printf("恭喜您猜对了!\n");
			break;
		}
	}
	return temp;
}

rand()、srand()
C语言产生随机数要用到的函数是rand()和srand()。random()函数不遵循ANSIC标准,在gcc、vs等编译器下不能通过编译。

(1)若是为了生成一个无范围限制的随机数,只需要使用rand()即可。

rand()返回一个随机数,范围为0~RAND_MAX。RAND_MAX定义在stdlib.h中,其值为2147483647。

(2)如果要生成某个范围内的随机数,有两种情况:

①从0开始的随机数,例如:生成0~10的随机数,利用rand()函数对10求余,即rand()%10;

②不从0开始的随机数,例如:生成5~25的随机数,利用rand()函数对25-5=20求余再加上5,即rand()%20+5.

(3)以上两种情况生成的随机数都是一次性的,以后无论再运行几次,输出的结果都将与第一次相同。为了使程序在每次执行时都能生成一个新序列的随机值,需要为随机数生成器提供一个新的随机种子。此时需要使用srand()函数,该函数为随机数生成器播撒种子。只要种子不同,rand()函数就会产生不同的随机数序列。srand()称为随机数生成器的初始化器。
函数原型:void srand(unsigned int seed);

该函数的参数seed是种子,用来初始化rand()的起始值。

功能为:从srand(seed)中所指定的seed开始,返回一个在[0,RAND_MAX]之间的随机整数。rand()函数是真正的随机数生成器,srand()为rand()提供随机数种子。srand((unsigned int)time(NULL)) 表示使用系统定时器的值作为随机数种子。

  • 系统在调用rand()函数之前会自动调用srand()函数,如果用户在调用rand()函数之前没有调用srand()函数,那么系统就会默认将1作为伪随机数的初始值。如果用户调用过srand(),并给参数seed赋一个值,那么rand()函数就会将此值作为产生随机数的初始值。如果给seed一个固定值,那么rand()函数产生的随机数将会是一样的。

游戏完整代码

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

int Guess_num(int ret)//ret为随机数
{
	int temp = 0;//计数器
	int num = 0; //输入的数
		while (1)
		{
			printf("请猜一个数字:");
			scanf_s("%d", &num);
			temp = temp + 1;//每次循环完计数+1
			if (num < ret)
			{
				printf("猜小了!\n");
			}
			else if (num > ret)
			{
				printf("猜大了!\n");
			}
			else
			{
				printf("恭喜您猜对了!\n");
				break;
			}
		}
	return temp;
}
void Game_begin()
{
	printf("****************************\n");
	printf("**********猜数字游戏********\n");
	printf("******     1.play     ******\n");
	printf("******     2.exit     ******\n");
	printf("****************************\n");
	printf("请输入选项:\n");
}
int main()
{
	srand(time(NULL));//随机数种子
	int ret = rand() % 100 + 1;//范围是0-100的随机数
	int temp = 0;//计数器
	int i = 0;//用户输入的值
	Game_begin();//游戏菜单
	scanf_s("%d", &i);//输入1、2,进入游戏或者退出
	while (1)
	{
		switch (i)
		{
		case 1:
		{
			temp = Guess_num(ret);
			printf("您一共猜了%d次\n", temp);
			break;
		}
		case 2:
			exit(0);
		default:
			printf("输入有误!");
			break;
		}
		printf("是否继续游戏?\n");
		printf("1.继续\n");
		printf("2.退出\n");
		scanf_s("%d", &i);
		switch (i)
		{
		case 1:
			continue;
		case 2:
			exit(0);
		default:
			printf("输入错误!");
			exit(0);
		}
	}
	return 0;
}
上一篇:c语言实现简单的扫雷小游戏


下一篇:2021-10-22