【手把手带你搞定】第一个C语言猜数字游戏(超详细教程,不仅学如何写代码,更学方法思路!)


在这里插入图片描述

什么是猜数字游戏

大家玩过猜数字游戏吗?

这是你们美好的童年回忆吗??

在这里插入图片描述
猜数字游戏顾名思义就是猜数字游戏,在百度上有一个听起来怪牛逼的名字 - 古老的密码破译类益智类小游戏。看来玩这个游戏还有益于智商?!
在这里插入图片描述
但是这个游戏一般要两人以上玩,那么孤独的单身汉怎办?不如咱们就写一个猜数字游戏让他可以寄几一个人和电脑玩~

游戏思路

首先我们要思考一下,我们应该怎么写这个游戏呢?

打开方式

想想看,我们一般玩的游戏,在进入游戏之前是不是都有一个特别酷炫的打开方式,让你选择开始游戏、开始游戏还是开始游戏。
在这里插入图片描述
我们暂且称它为菜单。

游戏逻辑

那么当我们进入游戏之后,游戏的逻辑又是怎样的呢?

首先我们是游戏是数字,那当然应该先给出一个数字让玩家猜,那么这个数字每次都应该不一样,应该每次都在给定范围内自由变化,所以,我们应该用一个1-100的随机数来完成。

在系统确定了一个数字之后,玩家就开始猜数字,这时候我们可以用一个整型变量来保存玩家输入的数字,然后告诉玩家是猜大了还是猜小了,还是猜中了。

如果猜中了,则游戏结束;如果猜错了,则让玩家继续猜,直到猜中为止。

游戏结束后,通常又会跳出一个界面,是继续玩游戏呢?还是退出游戏呢?这时可以把最开始的菜单调出来,让玩家再次选择,是否再次进入游戏。
在这里插入图片描述

当然,在游戏结束前,我们还可以把每一局游戏玩家猜的次数告诉玩家。

以上就是一个完整的猜数字游戏的思路了,重点总结如下:

  1. 菜单
  2. 随机数
  3. 猜数字循环
  4. 游戏结束,回到菜单

代码实现

菜单

首先我们要写一个菜单。
在这里插入图片描述
当然我们也可以把打印的菜单放大到一个函数里,来简化main函数内部。
在这里插入图片描述
当玩家输入选择后,我们要根据玩家给出的选择,判断是继续进入游戏,还是退出游戏,因为判断的内容是一个整型表达式,所以我们可以用一个switch语句来完成。
在这里插入图片描述

运行结果如下:
在这里插入图片描述

随机数

接下来我们要给游戏设定一个随机数。

首先,我们要引入一个rand函数1

rand()函数用来产生随机数。
rand()会返回一个范围在0到RAND_MAX(至少是32767)之间的伪随机数(整数)。

在这里插入图片描述
但是我们会发现,当我们无论运行多少次,打印出来的数都是41。

这是为什么呢?大家有没有注意到,我们说计算机产生的随机数都是伪随机数。因为无论计算机怎样发展,它也无法产生一串绝对随机的随机数,只能生成相对随机的随机数,即伪随机数:

  1. “伪”是有规律的意思,就是计算机产生的伪随机数是随机而有规律的。
  2. 计算机的伪随机数是由随机种子根据一定的计算方法计算出来的数值。所以,只要计算方法一定,随机种子一定,那么产生的随机数就是固定的。
  3. 在调用rand()函数之前,可以使用srand()函数2设置随机数种子,如果没有设置随机数种子,那么在调用rand()函数时,随机数种子会自动设置为1。所以每次产生的随机数都是一样的。

所以,如果我们要每次产生的随机数都不一样,我们应该每次设置的随机数种子应该也不一样,那儿怎么找到一个一直处在变化中的随机数种子呢?

在cplusplus网站中关于srand()函数的介绍中给出了指导:
在这里插入图片描述
我们可以把时间作为随机数种子,即时间戳3

在这里插入图片描述
这样每次就可以获得一个不同的随机数了。

那么时间戳应该如何使用呢?
在这里插入图片描述
把它放到VS2019中看看:
在这里插入图片描述
可以看到,time_t实际上是一个长整型,只是在这里被重新定义为了time_t。

那么我们再来看看srand()函数怎么用:
在这里插入图片描述
懂了一点,又好像没有懂……
在这里插入图片描述

唉……再回头看看rand()函数1的讲解吧,翻到下面的例子,我发现了什么???
在这里插入图片描述
恰好也是一个猜数字游戏噢~

那如果我们的游戏是猜1-100的话,照葫芦画瓢,举一反三,我们应该怎样做?
在这里插入图片描述
运行一下:
在这里插入图片描述
虽然成功了,但是我们应该注意到,srand()函数的参数应该是一个无符号数,而time的返回类型是长整型(是有符号的),所以这时候我们可以用一个操作符:(类型) 4把它强制转换为无符号数。即:
在这里插入图片描述

这样就能确保不出问题啦~

再次运行,发现每次打印的随机数都不一样啦~

猜数字循环

设置好随机数,接下来就该轮到玩家猜数字啦!

根据逻辑:玩家输入一个数,程序反馈猜中了还是猜大/小了,那么我们可以用一个分支和循环结构来完成。

这里我和菜单一样,把游戏过程封装成一个函数独立出来。
在这里插入图片描述
在这里插入图片描述
运行如下:
在这里插入图片描述
假如在游戏中,我突然不想猜这个数了,希望退出本次游戏。能否做到呢?

当然了!

在这里插入图片描述
在这里插入图片描述
运行如下:
在这里插入图片描述

游戏结束,回到菜单

现在整体游戏已经出来了,我们已经实现了一个完整的游戏,但是如果玩家玩了一局之后还不过瘾,还想继续玩,或者中途退出后想重新玩呢?

这时候我们可以让把程序放到一个循环结构中,一局游戏结束后再打印菜单,玩家自由选择游戏还是退出,实现可以反复玩的状态。

我们的游戏打开之后,应该至少打印一次菜单,即循环至少执行一次,所以我们可以用do……while循环来完成。
在这里插入图片描述
运行如下:
在这里插入图片描述

这样,一个完整猜数字游戏就稿定啦~

接下来就可以把它送给你身边爱玩游戏的兄弟 or 闺蜜啦!

办法我在之前这篇文章有提过噢!【一张图搞定关机程序】让你的代码有趣起来!送兄弟送闺蜜,快乐原来如此简单!(赋全过程和结果,超详细解说)可直接跳转到 “如何把程序送出去”这一节
点此前往https://blog.csdn.net/weixin_53286472/article/details/118092801

在这里插入图片描述

完整代码

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
	printf("*****************************\n");
	printf("*********   1.play  *********\n");
	printf("*********   0.exit  *********\n");
	printf("*****************************\n");
}
void game(int num)
{
	int guess = 0;
	while (1)
	{
		printf("请猜数字(1-100)\n");
		scanf("%d", &guess);
		if (guess < num)
		{
			if (guess == 0)
			{
				printf("退出本次游戏\n");
				break;
			}
			printf("猜小了!\n");
		}
		else if (guess > num)
		{
			printf("猜大了!\n");
		}
		else
		{
			printf("恭喜你!猜中了!\n");
			break;
		}
	}
}
int main()
{
	int input = 0;
	int num = 0;
	srand((unsigned int)time(NULL));
	do
	{
		num = rand() % 100 + 1;
		menu();//打印菜单
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)//根据玩家输入的值判断是否开始游戏
		{
		case 1:
			printf("开始游戏(输入'0'可中途退出)\n");
			//printf("%d\n",num);
			game(num);
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,请重新选择!\n");
			break;
		}
	} while (input);
	return 0;
}

你学废了吗???

如果你觉得本文对你有用,记得👍++关注噢!

总结

大家可以看到,这个猜数字游戏并不难,整个程序写下来不过几十行代码,但是已经可以很好地完成一个完整的游戏程序。

如果你能把这些都学会,那你已经超级棒了噢~

可以看到,整个游戏中的一个难点是随机数,这是一个初学者不太熟悉的东西。

那么面对不熟悉的内容时,我们可以借助网络资源(比如cplusplus网站)来了解、熟悉它,我们除了看定义、解释,还可以看看它给出的例子。说不定就撞见了我们想要写的东西呢~(比如这次的猜数字游戏kk)
在这里插入图片描述

敲重点:遇到问题时,学会自己一步步查资料,找解答是一项很重要的能力噢~

在这里插入图片描述

关注我!学习更多~~

在这里插入图片描述


  1. rand函数详见:http://www.cplusplus.com/reference/cstdlib/rand/?kw=rand ↩︎ ↩︎

  2. srand函数详见:http://www.cplusplus.com/reference/cstdlib/srand/?kw=srand ↩︎

  3. 时间戳详见:http://www.cplusplus.com/reference/ctime/time/ ↩︎

  4. 强制转换类型操作符:(类型) ,可参考之前的文章:【手把手带你入门】初识C语言(下)> 操作符 > 单目操作符 > (类型) 强制类型转换https://blog.csdn.net/weixin_53286472/article/details/117934506 ↩︎

  • 15
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值