【C语言小游戏--猜数字】

文章目录

前言

猜数字小游戏是我们大多数人学习C语言时都会了解到的一个有趣的C语言小游戏,下面我将详细介绍该游戏的实现和编程逻辑。玩小游戏的同时,也能对C语言控制语句有更好的认识。

1.游戏描述

电脑随机生成一个1-100的数字,玩家来猜。玩家可以根据自己需要,设置每次猜的次数。如果在设置的次数内猜对了,则提示你猜对了,否则提示猜错了。

2.代码实现

2.1打印菜单

我们在玩游戏前,都是先打印菜单,在进行选择。所以此处选择do-while循环

c 复制代码
#include<stdio.h>
void menu()
{
	printf("***********************\n");
	printf("***  1.play  0.exit ***\n");
	printf("***********************\n");
}
int main()
{
	do
	{
		menu();
	} while (1);
	return 0;
}

效果展示:

2.2构建基础框架

选择1:玩游戏;

选择0:退出;

选择其它:重新选择

c 复制代码
int main()
{
	int input = 0;
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("玩游戏\n");
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,请重新选择:\n");
		}
	} while (input);
	return 0;
}

效果展示:

2.3玩游戏

既然我们要玩猜数字游戏,那么我们选择1后,不能就打印一个玩游戏吧,因此下面来真正实现猜数字游戏。

2.3.1生成随机数

怎么才能生成随机数呢?

C语言提供了一个函数用来生成随机数

2.3.1.1rand()

查看文档我们发现:

  • rand函数会返回⼀个伪随机数,这个随机数的范围是在0~RAND_MAX之间,这个RAND_MAX的大小是 依赖编译器上实现的,但是⼤部分编译器上是32767。
  • 在调用rand之前,使用srand函数为伪随机数生成器提供种子。
  • rand函数的使用需要包含⼀个头文件是:stdlib.h

什么意思呢?我们不妨写代码测试一下:

运行一下发现,确实产生了随机数。但是当我运行第二次发现,产生的随机数和第一次的一样,那怎么能行,这不是BUG吗?


如果再深⼊了解⼀下,我们就不难发现,其实rand函数⽣成的随机数是伪随机的,伪随机数不是真的随机数,是通过某种算法⽣成的随机数。真正的随机数的是⽆法预测下⼀个值是多少的。⽽rand函数是对⼀个叫"种⼦"的基准值进⾏运算⽣成的随机数。

之所以前⾯每次运⾏程序产⽣的随机数序列是⼀样的,那是因为rand函数⽣成随机数的默认种⼦是1。 如果要⽣成不同的随机数,就要让种⼦是变化的。

种子要变化,我们再让种子是一个随机值不就行了嘛
NO,大漏特漏

如果这样的话,就死循环了

2.3.1.2srand()

刚才在文档中提到的一个srand是什么呢?

程序中在调⽤ rand 函数之前先调⽤ srand 函数,通过 srand 函数的参数seed来设置rand函数⽣成随机数的时候的种⼦,只要种⼦在变化,每次生成的随机数序列也就变化起来了。

那也就是说给srand的种⼦如果是随机的,rand就能⽣成随机数;在⽣成随机数的时候⼜需要⼀个随机数,这就又矛盾了

那电脑上什么东西是一直变化的呢?------时间

2.3.1.3time()
  • time 函数会返回当前的⽇历时间,其实返回的是1970年1⽉1⽇0时0分0秒到现在程序运行时间之间的差值,单位是秒。 如果
  • time()的参数timer是NULL,就只返回这个时间的差值。time函数返回的这个时间差也被叫做:时间戳

如果是这样,我们就可以这样写代码:

这样我们发现数字就随机起来了,那我们的代码接下来可就好写咯。

我们需要的随机数是1-100之间的,所以我们可以这样写代码:

2.3.2game()

生成随机数

c 复制代码
void game()
{
	srand((unsigned int)time(NULL));
	int random_number = rand() % 100 + 1;
	printf("%d\n", random_number);
}

效果如下:

但是如果你是老司机,手速比较快的话,生成的随机数会相同,如下:

这是为什么呢?

因为当我们运行一次game(),就会调用一次srand(),这样在较短时间内调用,就会产生相同的数字。

因此,srand函数不需要频繁调用的,⼀次运⾏的程序中调用⼀次就够了。

所以,我们可以将其放在main()中

c 复制代码
void game()
{
	int random_number = rand() % 100 + 1;
	int number = 0;
	while (1)
	{
		printf("请猜数字:");
		scanf("%d", &number);
		if (number > random_number)
		{
			printf("您猜大了\n");
		}
		else if (number < random_number)
		{
			printf("您猜小了\n");
		}
		else
		{
			printf("恭喜你,猜对了!\n");
			break;
		}
	}
}

2.4自己设定猜的次数

用户自己输入次数,如果未在设置的次数中猜对,则提示失败

代码变动地方如下:

c 复制代码
switch (input)
		{
		case 1:
			printf("你感觉你几次就能猜对呢?\n");
			scanf("%d", &count);
			game(count);
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,请重新选择:\n");
		}
c 复制代码
void game(int count)
{
	int random_number = rand() % 100 + 1;
	int number = 0;
	while (count)
	{
		printf("请猜数字:");
		scanf("%d", &number);
		if (number > random_number)
		{
			printf("您猜大了\n");
		}
		else if (number < random_number)
		{
			printf("您猜小了\n");
		}
		else
		{
			printf("恭喜你,猜对了!\n");
			break;
		}
		count--;
	}
	if (count == 0)
	{
		printf("你未在规定的次数内猜对,有点高估自己了,还得练哦\n");
	}
}

效果如下:

3.完整代码

c 复制代码
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
	printf("***********************\n");
	printf("***  1.play  0.exit ***\n");
	printf("***********************\n");
}
void game(int count)
{
	int random_number = rand() % 100 + 1;
	int number = 0;
	while (count)
	{
		printf("请猜数字:");
		scanf("%d", &number);
		if (number > random_number)
		{
			printf("您猜大了\n");
		}
		else if (number < random_number)
		{
			printf("您猜小了\n");
		}
		else
		{
			printf("恭喜你,猜对了!\n");
			break;
		}
		count--;
	}
	if (count == 0)
	{
		printf("你未在规定的次数内猜对,有点高估自己了,还得练哦\n");
	}
}
int main()
{
	srand((unsigned int)time(NULL));
	int input = 0;
	int count = 0;
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("你感觉你几次就能猜对呢?\n");
			scanf("%d", &count);
			game(count);
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,请重新选择:\n");
		}
	} while (input);
	return 0;
}

本次分享就到这里啦,感谢您的观看

相关推荐
杜杜的man3 分钟前
【go从零单排】迭代器(Iterators)
开发语言·算法·golang
亦世凡华、3 分钟前
【启程Golang之旅】从零开始构建可扩展的微服务架构
开发语言·经验分享·后端·golang
测试界的酸菜鱼17 分钟前
C# NUnit 框架:高效使用指南
开发语言·c#·log4j
GDAL17 分钟前
lua入门教程 :模块和包
开发语言·junit·lua
李老头探索19 分钟前
Java面试之Java中实现多线程有几种方法
java·开发语言·面试
CSXB9920 分钟前
三十四、Python基础语法(文件操作-上)
开发语言·python·功能测试·测试工具
web Rookie40 分钟前
JS类型检测大全:从零基础到高级应用
开发语言·前端·javascript
很楠不爱1 小时前
Qt——窗口
开发语言·qt
yi碗汤园1 小时前
【一文了解】C#基础-集合
开发语言·前端·unity·c#
skaiuijing1 小时前
Sparrow系列拓展篇:对调度层进行抽象并引入IPC机制信号量
c语言·算法·操作系统·调度算法·操作系统内核