IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C语言详解系列——综合练习,猜数字小游戏 -> 正文阅读

[C++知识库]C语言详解系列——综合练习,猜数字小游戏

题目需求

今天与大家分享一个简单的猜数字小游戏,当作我们前面学习的一个综合练习,我们的需求是:
1.可以自动生成一个1-100之间的随机数
2.玩家猜数字,如果猜对了,恭喜玩家,游戏结束,猜错了就继续猜直到猜对
3.游戏可以重复游玩,除非玩家自己退出游戏

思路分析

首先,玩过游戏的朋友都知道,一般游戏都会有一个主界面,所以我们来为我们的游戏设计一个主界面

void menu()
{
	printf("******************\n");
	printf("******************\n");
	printf("****1.开始游戏****\n");
	printf("****0.结束游戏****\n");
	printf("******************\n");
	printf("******************\n");
	printf("******************\n");
}

又因为在需要求中说了,我们的游戏可以重复游玩,所以我们的主界面在游戏结束后应该再次出现,所以我们可以使用循环语句来实现,根据题目需求可以知道,我们需要先游玩一局游戏在判断是否继续游玩,所以使用do while语句。

void menu()
{
	printf("******************\n");
	printf("******************\n");
	printf("****1.开始游戏****\n");
	printf("****0.结束游戏****\n");
	printf("******************\n");
	printf("******************\n");
	printf("******************\n");
}

int main()
{
	do
	{
	
		menu();
		
	}while(1);

	return 0;
}

如上图我们将我们写的menu()函数在主函数中调用,循环生成主界面,但是真正的游戏不是这样的,我们需要让玩家自己选择是否进行游戏,所以我们还需要进行判断。

void menu()
{
	printf("******************\n");
	printf("******************\n");
	printf("****1.开始游戏****\n");
	printf("****0.结束游戏****\n");
	printf("******************\n");
	printf("******************\n");
	printf("******************\n");
}

int main()
{
	int input = 0;
	do
	{
		menu();
		printf("请选择是否开始游戏:\n");
		scanf("%d", &input);

		switch (input)
		{
		case 1:
		  {
			printf("游戏开始\n");
			break;
		  }

		case 0:
		  {
			printf("游戏结束\n");
			break;
		  }
		
		default :
		  {
			printf("您的选择错误,请重新选择:\n");
			break;
		  }
		}

	}while(input);

	return 0;
}

我来对上述代码进行讲解,首先我们进入循环,给出提示让玩家选择是否开始游戏,之后进入switch选择语句,根据玩家的选择判断分支入口。循环的判断条件为玩家输入的选择,我们看逻辑是否正确,当玩家输入0时游戏结束,跳出循环,当玩家输入其他时,开始游戏或者重新选择,继续循环,所以逻辑正确。当然我们的游戏不可能仅仅是开始游戏四个字,所以我们需要完善游戏的主体部分,先上代码:

void game()
{
	int num = rand()%100+1;//rand()库函数,返回值类型int 参数void 随机生成一个0—RAND_MAX(32767)之间的数字,但是并不随机,每次生成的随机数相同
	//需要使用srand()函数设置随机数生成器,在调用rand之前,设置一个随机的起点。
	int guess = 0;

	while (1)
	{
		printf("请玩家输入您猜测的数字:\n");
		scanf("%d", &guess);

		if (guess > num)
		{
			printf("猜大了\n");
		}
		else if (guess < num)
		{
			printf("猜小了\n");
		}
		else
		{
			printf("恭喜你猜对了,游戏结束\n");
			break;
		}
	}
	
}

我们的大致思路是,首先要随机生成一个随机数供玩家猜测,使用rand()函数,(我们之后会给大家详解这个库函数)因为猜字游戏存在猜对或者猜错所以需要多次猜字,使用while语句实现,玩家猜字,使用分支语句进行判断,提示玩家猜大了还是猜小了,直到玩家猜对结束循环。完整的代码如下:

#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

void menu()
{
	printf("******************\n");
	printf("******************\n");
	printf("****1.开始游戏****\n");
	printf("****0.结束游戏****\n");
	printf("******************\n");
	printf("******************\n");
	printf("******************\n");
}

void game()
{
	int num = rand()%100+1;//rand()库函数,返回值类型int 参数void 随机生成一个0—RAND_MAX(32767)之间的数字,但是并不随机,每次生成的随机数相同
	//需要使用srand()函数设置随机数生成器,在调用rand之前,设置一个随机的起点。
	int guess = 0;

	while (1)
	{
		printf("请玩家输入您猜测的数字:\n");
		scanf("%d", &guess);

		if (guess > num)
		{
			printf("猜大了\n");
		}
		else if (guess < num)
		{
			printf("猜小了\n");
		}
		else
		{
			printf("恭喜你猜对了,游戏结束\n");
			break;
		}
	}
	
}

int main()
{
	int input = 0;
	//时间 - 时间戳 - 计算现在时间与计算机起始时间的差值换算成秒。
	srand((unsigned)time(NULL));//srand需要的参数类型为unsigned,而time()函数的返回值类型为time_t所以需要强制类型转换
	do
	{
		menu();
		printf("请选择是否开始游戏:\n");
		scanf("%d", &input);

		switch (input)
		{
		case 1:
		  {
			game();
			break;
		  }

		case 0:
		  {
			printf("游戏结束\n");
			break;
		  }
		
		default :
		  {
			printf("您的选择错误,请重新选择:\n");
			break;
		  }
		}

	}while(input);

	return 0;
}

rand()库函数随机数的生成

首先我们在MSDN中查找rand()·这个库函数
在这里插入图片描述
我们可以知道了,rand()库函数的返回值类型为int,参数为void,需要调用<stdlib.h>头文件,由此我们可以在代码中实验一下

void game()
{
	int num = rand();

	printf("%d\n", num);
	int guess = 0;
}

我们将void game函数改写成上述代码,我们测试输出的结果
在这里插入图片描述
好像我们这样实现了随机数的生成,但是当我们再次执行程序我们发现
在这里插入图片描述
竟然与第一次生成的随机数相同,这是万万不能的,这样的游戏不是一个好游戏,我们该如何解决呢?我么在MSDN中寻找答案,在MSDN中提示我们了,rand()函数生成了一个0——RAND_MAX的数,在这之前我们还需要调用srand()库函数去生成一个随机数生成器,设置随机数的生成起点。有很多朋友要问了,RAND_MAX的值是多少呢?我们在代码中转到定义发现,是一个16进制的数,换算成10进制为32767。

在这里插入图片描述
所以我们我们知道了rand()库函数生成了一个范围为0——32767的随机数,但是是伪随机。我们还需要在他之前掉用srand()
在这里插入图片描述
我们了解到了,srand()的返回值为空,参数类型为unsigned int,需要引用头文件<stdlib.h>。要实现随机数,那么他的起点一定也是随机的,但我们现在需要去设置起点获得随机数,而起点的设置有需要随机参数,这不是无线套娃嘛,嘿嘿,我们也有解决方法,我们掉用我们计算机的时间,去帮助我们设置随机数的起点,我们称为时间戳

在这里插入图片描述
时间戳的概念:现在计算机的时间与计算机起始时间的差值换算成秒就是时间戳。

void game()
{
    srand((unsigned)time(NULL));
	int num = rand();

	printf("%d\n", num);
	int guess = 0;
}

我们再次执行代码,获得随机数
在这里插入图片描述
在这里插入图片描述
我们发现两次获得的随机数并不相同,这样我们就完成了生成随机数的代码。我们再来解释一个下srand((unsigned)time(NULL));这个语句,首先我们来了解一下time()
在这里插入图片描述
我们看到库函数time()的返回值为time_t参数为time_t *timer,调用time()函数需要引用头文件<time.h>。但srand()的参数类型为unsigned所以我们需要强制类型转换,将time()的返回值类型变为unsigned,我们不用这个参数,所以直接传一个空值进去就可以了。这就是srand((unsigned)time(NULL));的大致思路。

游戏的试玩

写完了这个游戏我们可以试玩一下
在这里插入图片描述
我们的游戏完美运行,是不是很有成就感呢!

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-07-20 18:34:21  更:2022-07-20 18:36:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/13 7:34:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码