一.猜数游戏的整体框架
1.理解猜数游戏
想要实现猜数游戏,我们先要建立正确的逻辑,可从结果入手,也就是说我们想要让玩家看到怎样的画面,从结果入手可以让我们对项目有大致的理解,以便后续构建程序。
2.猜数游戏的实现步骤
a.第一步:打印菜单
void manu()
{
printf("******************\n");
printf("*** 输入1:START***\n");
printf("*** 输入0:EXIT ***\n");
printf("******************\n");
}
首先,我们想让玩家选择是否进行游戏,这时候需要呈现选择菜单以便玩家选择。此时我们就需要考虑选择什么结构更加简便。
b.第二步:游戏核心结构
为了结构的简洁明了,这里选择将游戏主体内容写成函数。可以先声明函数,等将main函数大致框架构建完成后再实现函数的具体功能。
void game();
定义game()函数来实现游戏核心。
二.猜数游戏的具体结构
1.随机数rand和srand函数
1.rand()函数
猜数游戏要求给出要猜的数字的大概范围,这是我们就要用到rand()函数。当为int型时,随机数的范围为0~32767。但是要注意,rand()函数生成的并非是真正的随机数,而是伪随机数。rand生成随机数和种子有关,在一般情况下,种子默认为1,通俗来讲就是当种子为1时,rand每次生成的随机数都一样,而只有种子改变的情况下,随机数才会不断变化,这样就大大增加了程序的可玩性。
2.利用srand()和时间戳改变种子
srand()用来设置rand()产生随机数时的随机数种子(seed)。参数seed是整数,当改变seed值时,产生的伪随机数序列就会发生改变。使用srand()函数,改变seed数值,可以改变伪随机数的序列。每次要想生成不同的伪随机数序列,就要手动改变seed值,也不是很方便。所以,最好的办法是每次运行程序,seed值都可以自动改变。通常可以利用time(NULL)或getpid()的返回值作为seed。
3.srand搭配time(NULL)改变种子
我们主要介绍time(NULL),包含在头文件<time.h>。time(NULL)的返回值为当前时间的时间戳(以秒为单位),比如2023-8-2 17:19:04对应的时间戳数值为1690967944。所以每次运行时间不一样,通过srand()函数给rand()函数设定的seed的值也不一样,因此产生的随机数序列也就不一样了。time(NULL)获取的是时间戳值,所以与程序的进程无关,无论进程相同还是不同,只要调取函数的时间不一样,那么生成的seed值就不一样。
srand((unsigned)time(NULL));
4.game()的定义
void game() //因为不需要函数返回值,用void定义
{
int guess = 0;
int sum = rand() % 100 + 1; //生成1-100的随机数
while (1)
{
printf("请输入要猜的数字:");
scanf("%d", &guess);
if (guess < sum)
printf("猜小了\n");
else if (guess > sum)
printf("猜大了\n");
else
{
printf("恭喜你,猜对了\n");
break;
}
}
}
5.主体main()函数
int main()
{
int input = 0;
srand((unsigned)time(NULL)); //改变种子,生成不同的伪随机数列
do
{
manu(); //打印菜单
printf("请选择:");
scanf("%d", &input);
switch(input)
{
case 1:
game(); //玩家输入1游戏开始
break;
case 0:
printf("退出游戏");
break;
default:
printf("选择错误,重新选择\n");
break;
}
} while (input); //使用do-while循环使游戏多次运行
return 0;
}
三.总结
1.最终代码如下
#include <stdio.h>
#include <time.h>
void manu()
{
printf("******************\n");
printf("*** 输入1:START***\n");
printf("*** 输入0:EXIT ***\n");
printf("******************\n");
}
void game();
int main()
{
int input = 0;
srand((unsigned)time(NULL));
do
{
manu();
printf("请选择:");
scanf("%d", &input);
switch(input)
{
case 1:
game();
break;
case 0:
printf("退出游戏");
break;
default:
printf("选择错误,重新选择\n");
break;
}
} while (input);
return 0;
}
void game()
{
int guess = 0;
int sum = rand() % 100 + 1;
while (1)
{
printf("请输入要猜的数字:");
scanf("%d", &guess);
if (guess < sum)
printf("猜小了\n");
else if (guess > sum)
printf("猜大了\n");
else
{
printf("恭喜你,猜对了\n");
break;
}
}
}
2.改进
为了增加游戏的趣味性,我们可以添加次数上限,对game函数进行小小的修改(以上限5次为例)。
void game()
{
int guess = 0;
int i = 5;
int sum = rand() % 100 + 1;
while (1)
{
printf("你一共有5次机会\n");
printf("请输入要猜的数字:");
scanf("%d", &guess);
if (guess < sum)
printf("猜小了\n");
else if (guess > sum)
printf("猜大了\n");
else
{
printf("恭喜你,猜对了\n");
break;
}
i--;
printf("你还有%d次机会\n", i);
if (i == 0)
{
printf("很遗憾,你失败了\n");
printf("正确的数是%d\n", sum);
break;
}
}
}
本篇尚有许多不足,望各位同仁多多包涵。(完结)