前言
在上一篇文章随机数的生成中,我们学习了rand,srand和time函数,那么这篇文章就让我们来尝试使用它们来写一个猜数字游戏,数字范围是 1 ~ 100。
对随机数的生成以及相关函数还不熟悉的话,也可以点击下方文章链接再回顾一下:
C语言–随机数的生成——rand,srand,time函数
一、游戏设计分析
1.1 菜单页面
既然是一个游戏,那么我们可以先给它设计一个简单的菜单页面,使用函数包装起来,先放在主函数中:
void menu()
{
printf("*************************\n");
printf("****** 0. exit ******\n");
printf("****** 1. play ******\n");
printf("*************************\n");
}
1.2 建立框架
然后就可以创建变量input
,使用switch
语句,来根据菜单选择我们所想实现的操作:
- 如果input == 0,游戏结束;
- 如果input == 1,游戏开始;
- 如果输入的input既不是1也不是0,那么就说明输入错误,让玩家重新选择。
int main()
{
int input = 0;
menu();
printf("请选择您的操作>\n");
scanf("%d", &input);
switch (input)
{
case 0:
printf("游戏结束!\n");
break;
case 1:
printf("游戏开始!\n");
//游戏具体实现的函数game();
break;
default:
printf("输入错误,请重新选择!\n");
break;
}
return 0;
}
整个大的游戏架构设计好了,然后我们就可以设计游戏具体实现的函数,然后放在case 1语句后面
1.3 游戏具体实现
我们将游戏具体实现的代码分装在game函数中,放在主函数case 1语句中:
1.3.1 生成随机数
既然是猜测 1 ~ 100 之间生成的随机数,首先要生成随机数,那么就需要使用rand
函数:
但是该函数生成的随机数是伪随机数,所以还要使用srand
和time
函数来不断改变rand函数的“种子”的数值。但是记得要分别包含头文件#include <stdlib.h>
和#include <time.h>
srand只需要执行一次,放在主函数中就行;
在game函数中,创建ret变量来接收rand函数生成的随机值。
void game()
{
int ret = rand() % 100 + 1;
}
int main()
{
srand((unsigned int)time(NULL));
int input = 0;
menu();
printf("请选择您的操作>\n");
scanf("%d", &input);
switch (input)
{
case 0:
printf("游戏结束!\n");
break;
case 1:
printf("游戏开始!\n");
game();
break;
default:
printf("输入错误,请重新选择!\n");
break;
}
return 0;
}
1.3.2 随机数与猜测数比较
创建一个我们所输入的猜测数的变量guess,并与产生的随机数变量ret进行比较:
- 如果ret > guess ,说明我们的猜测数比随机数小;
- 如果ret < guess ,说明我们的猜测数比随机数大;
- 如果ret = guess, 说明我们猜对了。
我们的运气可能没有那么好,有可能一次猜不对,需要猜多次。那么就可以使用while函数进行死循环,如果没有猜中就一直猜,当猜中了就可以使用break语句来跳出循环,游戏就结束了。
void game()
{
int ret = rand() % 100 + 1;
int guess = 0;
while (1)
{
printf("请猜测该随机数:\n");
scanf("%d", &guess);
if (ret > guess)
{
printf("猜小了!");
}
else if (ret < guess)
{
printf("猜大了!\n");
}
else
{
printf("恭喜你,猜中了!\n");
break;
}
}
}
当然也可以优化一下,比如我们可以创建一个变量count,来表示猜数字的次数限制,每猜一次,机会就会少一次,count–,当机会使用完后就视为游戏失败,公布随机数的答案。
void game()
{
int ret = rand() % 100 + 1;
int guess = 0;
int count = 0;
printf("请输入您想使用的机会次数:\n");
scanf("%d", &count);
while (count)
{
printf("请猜测该随机数:\n");
scanf("%d", &guess);
if (ret > guess)
{
printf("猜小了!");
}
else if (ret < guess)
{
printf("猜大了!\n");
}
else
{
printf("恭喜你,猜中了!\n");
break;
}
count--;
}
if (count == 0)
{
printf("游戏失败,随机数是:%d\n", ret);
}
}
1.3.3 不过瘾,再来亿把!
当我们玩完一把后,有可能意犹未尽,还想接着玩,那么就需要将主函数中游戏框架作为循环语句,使用do-while
循环。
为什么使用do-while循环?因为是先玩一把,然后再决定要不要继续玩。
- 如果不想玩了,input就可以输入0,循环结束,游戏结束;
- 如果还想继续玩,input既有可以接着输入1,循环一次,游戏再执行一遍;当玩完之后再进行选择。
- 如果输入非1非0,说明输入错误,重新选择。
int main()
{
srand((unsigned int)time(NULL));
int input = 0;
do
{
menu();
printf("请选择您的操作>\n");
scanf("%d", &input);
switch (input)
{
case 0:
printf("游戏结束!\n");
break;
case 1:
printf("游戏开始!\n");
game();
break;
default:
printf("输入错误,请重新选择!\n");
break;
}
} while (input);
return 0;
}
二、完整代码
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void menu()
{
printf("*************************\n");
printf("****** 0. exit ******\n");
printf("****** 1. play ******\n");
printf("*************************\n");
}
void game()
{
int ret = rand() % 100 + 1;
int guess = 0;
int count = 0;
printf("请输入您想使用的机会次数:\n");
scanf("%d", &count);
while (count)
{
printf("请猜测该随机数:\n");
scanf("%d", &guess);
if (ret > guess)
{
printf("猜小了!");
}
else if (ret < guess)
{
printf("猜大了!\n");
}
else
{
printf("恭喜你,猜中了!\n");
break;
}
count--;
}
if (count == 0)
{
printf("游戏失败,随机数是:%d\n", ret);
}
}
int main()
{
srand((unsigned int)time(NULL));
int input = 0;
do
{
menu();
printf("请选择您的操作>\n");
scanf("%d", &input);
switch (input)
{
case 0:
printf("游戏结束!\n");
break;
case 1:
printf("游戏开始!\n");
game();
break;
default:
printf("输入错误,请重新选择!\n");
break;
}
} while (input);
return 0;
}
结语:到这里我们的猜数字游戏(C语言实现)就学习结束了,本人才疏学浅,本文有错误和有待改进的地方欢迎大家批评和指正,感谢您的阅读!如果本文对您有帮助,可以高台贵手点点赞和关注哦!