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:有很不错的用户体验

4:自行决定是否结束

可以学到的内容:

1:初步认识时间戳的运用

2:初步认识循环怎样嵌套

3:初步理解do while循环

4:锻炼写代码的逻辑能力

5:初识(rand)函数(srand)函数(time)函数

6:认识一个简单的游戏框架是怎样实现的

全篇无任何废话,本文的解释都在代码段中,所以一定要看代码,边看边学边理解。

这只是初学者入门的一个小游戏,不难懂,没有什么复杂的内容

开始:

1:首先C的代码都是头文件+main函数,这个不过多解释

2:写一个do while循环,使用do while循环的原因是因为可以先执行后判断,相当于先玩游戏,再决定要不要继续?

int main() {

	do 
	{
		
	} while ();

	return 0;
}

3:先写一个菜单,代码中尽量使用英文,最好是和想要表达的东西是一个意思

比如菜单的英文就是menu;开始就是play;结束就是over...等等

void menu() //菜单不需要返回值,只是用于看的并且做出选择
{
	printf("********************\n");
	printf("******—1.play—******\n");
	printf("******—0.over—******\n");
	printf("********************\n");
}

int main() {

	do//使用do while循环的原因是因为可以先执行后判断,相当于先玩游戏,再决定要不要继续 
	{

		menu();//进来先打印一个菜单

	} while ();

	return 0;
}

4:接受输入的信息

int main() {

	int a = 0;//做出选择

	do//使用do while循环的原因是因为可以先执行后判断,相当于先玩游戏,再决定要不要继续 
	{
		menu();//进来先打印一个菜单

		scanf("%d", &a);// 输入 1 或者 0 或 其他


	} while ();

	return 0;
}

5:根据信息来进行下一步操作

int main() {

	int a = 0;//做出选择

	do//使用do while循环的原因是因为可以先执行后判断,相当于先玩游戏,再决定要不要继续 
	{
		menu();//进来先打印一个菜单

		scanf("%d", &a);// 输入 1 0 其他

		switch (a) //根据a的值匹配case语句
		//因为输入的是数字,switch语句最佳
		{


		}

	} while ();

	return 0;
}

不懂? do while以及switch???语句的语法格式,去这篇文章看一下,1分钟就懂了

https://blog.csdn.net/W20223161730/article/details/126200624?spm=1001.2014.3001.5502

6:游戏的大致框架完成

int main() {

	int a = 0;//做出选择

	do//使用do while循环的原因是因为可以先执行后判断,相当于先玩游戏,再决定要不要继续 
	{
		menu();//进来先打印一个菜单

		scanf("%d", &a);// 输入 1 0 其他

		switch (a) //根据a的值匹配case语句
		//因为输入的是数字,switch语句最佳
		{
		case 1://玩游戏
			printf("猜数字\n");
			//game(); ←这个函数里面假设有一个游戏主体

		case 0:	//结束
            printf("结束游戏\n");
			break;

		default ://不做过多解释,不懂就看上面链接的详解
			printf("选择错误,请重新选择\n");
		}

	} while ();

	return 0;
}

下面开始这个小游戏的主体

1:开始这个小游戏的主体

void game() {
	//1.生成一个随机数

	//2.猜数字

}

新知识:rand函数:

?测试一下:

#include<stdlib.h>//rand函数的头文件

void game() {
	//1.生成一个随机数
	int ret = rand();
	printf("%d\n", ret);

	//2.猜数字

}

测试结果1:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 测试结果2:

?两次结果都一样,说明有问题

?再看一下rand函数的介绍:

?也就是说使用rand函数之前必须使用srand函数

新知识:srand函数

void game() {
	//1.生成一个随机数
	srand(100);
	int ret = rand();
	printf("%d\n", ret);

	//2.猜数字

}

?测试:

还是有问题? ? ? ? 那就把srand的参数换成200

void game() {
	//1.生成一个随机数
	srand(200);
	int ret = rand();
	printf("%d\n", ret);

	//2.猜数字

}

测试:

?所以:只要srand的参数变化,那么生成的数字就会变换

那么问题来了:什么可以一直发生改变? ? ? ? 时间可以????????

所以要把时间传给srand函数就可以完成这个游戏

新知识:时间戳

时间戳就是目前的时间相较于计算机起始时间(1970年1月1日0时0分0秒)的差值,且经过(单位:秒)换算的差值

https://tool.lu/timestamp/

如果能把时间戳传给srand函数,当作它的生成器,就可以得到一个不断改变的值

C语言提供了time函数,它可以返回一个时间戳

新知识:time函数

?实现:

#include<stdlib.h>//rand和srand的头文件
#include<time.h>//time函数的头文件
void game() {
	//1.生成一个随机数
	srand((unsigned int)time(NULL));
    //time函数返回的是time_t,所以需要强制类型转换成srand对应的参数

	int ret = rand();
	printf("%d\n", ret);

	//2.猜数字

}

测试:

依然有问题,值确实改变了,但是改变的很慢,如果速度快点,就相当于没改变

分析:因为每次按1,它就会调用一次,每次就归零了(重新开始),所以不需要频繁的调用,只需要调用一次就可以了,?所以直接放到主函数里面

????????

int main() {
	srand((unsigned int)time(NULL));//主函数只会调用一次,放到主函数里面没问题
	int a = 0;
	do {
		menu();
		scanf("%d", &a);
		switch (a) {
		case 1:
			game();
			break;
		case 0:	
			printf("结束游戏\n");
			break;
		default :
			printf("选择错误,请重新选择\n");
		}
	} while (a);
	return 0;
}

测试:

?非常的随机,但是数太大?

那么 在C中任何数%100余的数只可能是0到99,那么+1就是1到100

把rand%100再+1就完美解决了这个问题

void game() {
	//1.生成一个随机数
	int ret = rand()%100+1;
	printf("%d\n", ret);

	//2.猜数字
}

测试:

?没有问题,继续下一步,那么随机数生成过后不可能让你看,猜数字才是最重要的

void game() {
	//1.生成一个随机数
	int ret = rand()%100+1;

	//2.猜数字
}

开始猜数字:

void game() {
	int g = 0;
	//1.生成一个随机数
	int ret = rand()%100+1;//任何数%100余的数只可能是0到99,那么+1就是1到100
	//printf("%d\n", ret);

	//2.猜数字
	scanf("%d", &g);
	if (g > ret) {
		printf("猜大了\n");
	}
	else if (g < ret) {
		printf("猜小了\n");
	}
	else {
		printf("猜对了\n");
	}

}

注意:不可能猜一边就成功,要猜多次

void game() {
	//1.生成一个随机数
	int ret = rand()%100+1;
	//printf("%d\n", ret);

	//2.猜数字
	while (1)//一直猜
	{
        printf("猜数字\n");
       
		int g = 0;

		scanf("%d", &g);

		if (g > ret) {
			printf("猜大了\n");
		}
		else if (g < ret) {
			printf("猜小了\n");
		}
		else {
			printf("猜对了\n");
			break;				//猜对了跳出
		}
	}
}

整体+代码注释版本

#include<stdio.h>
#include<stdlib.h>//rand和srand的头文件
#include<time.h>//time函数的头文件

void menu() //菜单不需要返回值,只是用于看的并且做出选择
{
	printf("********************\n");
	printf("******—1.play—******\n");
	printf("******—0.over—******\n");
	printf("********************\n");
}

void game() {
	//1.生成一个随机数
	int ret = rand()%100+1;//任何数%100余的数只可能是0到99,那么+1就是1到100
	//printf("%d\n", ret);

	//2.猜数字
	while (1)//一直猜
	{
		printf("猜数字:>\n");

		int g = 0;

		scanf("%d", &g);

		if (g > ret) {
			printf("猜大了\n");
		}
		else if (g < ret) {
			printf("猜小了\n");
		}
		else {
			printf("猜对了\n");
			break;				//猜对了跳出
		}
	}
}

int main() {

	srand((unsigned int)time(NULL));//time函数返回的是time_t,所以需要强制类型转换

	int a = 0;//做出选择

	do//使用do while循环的原因是因为可以先执行后判断,相当于先玩游戏,再决定要不要继续 
	{
		menu();//进来先打印一个菜单

		printf("请选择\n");

		scanf("%d", &a);// 输入 1 0 其他

		switch (a) //根据a的值匹配case语句
		//因为输入的是数字,switch语句最佳
		{
		case 1://玩游戏
			game();//游戏主体
			break;

		case 0:	//结束
			printf("结束游戏\n");
			break;

		default ://不做过多解释,不懂就看上面链接的详解
			printf("选择错误,请重新选择\n");
		}

	} while (a);//switch语句选择后来到这里	1为真 0为假
				//所以1就是玩游戏		0就是退出

	return 0;
}

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-08-19 18:45:50  更:2022-08-19 18:47:03 
 
开发: 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/11 1:42:19-

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