目录
前言
在学习C语言中我们学习了各种的语句,循环语句,分支语句,顺序语句,各个语句又存在各种类型,那么我们怎么去运用这些语句去实现功能,如何跳出“hello world ”的舒适圈呢?今天我们就用我们学习的这些简单语句来实现一个游戏,赚一波满满的成就感吧!
一.游戏概述
猜数字游戏是学习C语言中一个有趣的小游戏,也是博主学习C语言时用C语言写的第一个小游戏。猜数字,顾名思义就是去想一个数字然后与电脑生成的一个随机数作比较,直到猜对为止。当然这个随机数在一定的范围内,要不然,一个简单的小游戏其难度也会被无限放大,其简单就简单在它的限制条件多,将其限制在了一个简单的范围内。
二.游戏过程
写一个猜数字游戏
- 1.自动产生一个1-100之间的随机数
- 2.猜数字
- a.猜对了,就恭喜你,游戏结束
- b.猜错了,会告诉你是猜大了,还是猜小了,继续猜,直到猜对为止
- 3.游戏可以一直玩,除非退出游戏
我们大致已经分析出了整个游戏的实现步骤,从a,b我们可以看出这是一个分支语句;游戏可以一直玩,除非退出,显然此处需要一个循环。而自动产生一个1到100之间的随机数该怎么实现呢?这里就不得不提到一个概念,那就是时间戳。时间戳指的是对特定时间的标记或记录,它通常表示一个日期和时间的数值。简单说就是时间戳就是一种记录时间的方式,其功能就是将一个时间点转换为一个数值,并且这个转换一直在进行。这样我们就可以通过时间戳来产生一组随机数。现在随机数是有了,那么我们又该如何限制其区间范围呢?游戏需要的只是在1到100之间的随机数。我们先来看一组算式:
5 % 4 = 1;
8 % 4 = 0;
10 % 4 = 2;
15 % 4 = 3;
27 % 4 = 3;
59 % 4 = 3;
从上面这组数据你能看出什么规律?是不是无论多大的数字对4取余,其余数都小于4。那么如果现在让你产生一组数值在1到4之间的数该怎么做?是不是应该任意取一些数,然后对4取余再加1,因为对4取余,只能产生0~3之间的数,所以要想得到1~4之间的数,还需要加1。那么这些任意的数要怎么产生呢?没错,就是用时间戳。如下图:
可以发现每个时间点,时间戳都是不同的,这样就可以取到任意数了。综上所述,同产生1~4之间的数一样,要想产生1~100之间的数,只需要用时间戳对100取余加1,就可以产生1~100之间的随机数了。那么在C语言中如何产生时间戳呢?
C语言中提供了一个库函数rand(),其功能就是产生一个随机数并返回一个0~RAND_MAX之间的整数。我们将RAND_MAX写入编译器(VS2022)并转到定义,得到如下图结果,0x7fff就是32767,所以rand()函数能够产生并返回一个0到32767之间的整数。
而要想获得一个时间戳,肯定需要获取时间,而且要其足够随机,最好是获取连续的时间。C语言中time()函数正好可以解决这一问题。其参数直接写NULL即可。time_t数据类型当做int类型看就行。值得一提的是,在rand函数之前必须先使用srand()函数,而time函数就是嵌套在srand()中获取时间的。其中srand()和rand()的头文件是<stdlib.h>,time()函数的头文件是<time.h>,在使用这几个库函数时可别忘记在开头应用。
三.游戏实现
(1)主函数
既然是玩游戏,那么一开始我们就需要先进入游戏主页面,并且希望能够一直玩,而不是玩一次就退出游戏,所以应该选择使用do....while()循环,这样一开始就能够进入游戏然后选择是否玩游戏。而进入游戏主页面需要一个菜单进行选择。接下来我们就用printf()函数实现一个简易菜单。代码如下:
void menu()
{
printf("**************************\n");
printf("******** 1.play ******\n");
printf("******** 0.exit ******\n");
printf("**************************\n");
}
可以发现我将菜单函数独立了出来,这样可以让我们的代码看起来层次分明。主函数代码如下:
int main()
{
int input = 0;
srand((unsigned int)time(NULL));//因为srand()的参数类型是unsigned int,而time()函数的
//返回值是time_t类型即int型的,所以需要进行强制类型转换。
//即(unsigned int)。
do
{
menu();
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,重新选择!\n");
break;
}
} while (input);
return 0;
}
(2)游戏主体(game.c)
- 猜数字
- a.猜对了,就恭喜你,游戏结束
- b.猜错了,会告诉你是猜大了,还是猜小了,继续猜,直到猜对为止
以上三点就是游戏实现的主体,电脑产生一个随机数,然后玩家输入一个猜想的数字,比对后,游戏会提醒你才大了还是猜小了,从侧面降低了游戏难度,直到猜对为止。game()函数代码实现如下:
void game()
{
int guess = 0;
int ret = rand()%100+1;//rand函数返回了一个0-32767的一个随机数,rand()%100产生0-99的随机数,+1就变成了1-100.
//printf("%d\n", ret);
while (1)
{
printf("请猜数字\n");
scanf("%d", &guess);
if (guess < ret)
{
printf("猜小了\n");
}
else if (guess > ret)
{
printf("猜大了\n");
}
else
{
printf("恭喜你,猜对了!\n");
break;
}
}
}
四.总体代码实现
代码如下:
#define _CRT_SECURE_NO_WARNINGS
//写一个猜数字游戏
//1.自动产生一个1-100之间的随机数
//2.猜数字
// a.猜对了。就恭喜你,游戏结束
// b.猜错了,会告诉你是猜大了,还是猜小了,继续猜,直到猜对为止
//3.游戏可以一直玩,除非退出游戏
#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 guess = 0;
int ret = rand()%100+1;//rand函数返回了一个0-32767的一个随机数,rand()%100产生0-99的随机数,+1就变成了1-100.
//printf("%d\n", ret);
while (1)
{
printf("请猜数字\n");
scanf("%d", &guess);
if (guess < ret)
{
printf("猜小了\n");
}
else if (guess > ret)
{
printf("猜大了\n");
}
else
{
printf("恭喜你,猜对了!\n");
break;
}
}
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,重新选择!\n");
break;
}
} while (input);
return 0;
}
相信很多小伙伴会觉得猜数字游戏没有挑战性并且还告诉玩家猜大了还是猜小了,挑战难度大大降低。那么如果你限制一下猜数字的次数,并且对超出猜数字次数的行为做出惩罚呢?例如猜数字失败,然后在后面加一个在一分钟内电脑关机的程序,然后再把这个游戏发给你的好哥们儿玩一下,
这么一想是不是瞬间觉得有趣多了哈哈。有兴趣的小伙伴可以下去尝试一下,也可以在评论区评论+点赞,博主后期可以单独出一期。
希望这篇文章可以帮到你们,学艺不精,错误之处还望指教,一起探讨。博主码字不易,喜欢的小伙伴还望点赞支持+关注,谢谢。