C语言趣味小游戏--猜数字(第二次,比第一次更详细,更易懂)

11 篇文章 1 订阅

游戏的条件:

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;
}

  • 4
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值