目录
前言
本文的猜数字小游戏所运用到的知识都十分基础,分支循环,自定义函数及其调用,唯一一个难点就是生成随机数,这部分我会尽量以通俗简单的话去讲解
游戏要求
1. 让电脑自动生成一个随机数,范围是 1 ~ 100
2. 玩家猜数字,根据猜测数字的大小给出 “大了” 或者 “小了” 的反馈,直到玩家猜中数字,游戏结束
游戏的代码实现
1.1 随机数的生成
在C语言中,有一个叫做 rand 的函数,它的头文件为: stdlib.h,在使用的时候不要忘记写头文件哦。它能够生成一个伪随机数,为什么是伪随机呢,这就得深入了解一下 rand 函数了。
伪随机是通过某种算法生成的,真正的随机数是无法预测下一个值是多少,而 rand 函数是对一个叫“种子”的基准值进行运算生成的随机数,“种子”一旦确定,rand 生成的数是确定的。所以,如果我们想要生成真正的随机数,就必须得让“种子”发生变化,所以我们得再调用 srand 函数来改变“种子”,在C语言中,我们一般用 time 函数来做“种子”,它可以返回当前的日历时间,时间每时每刻都会发生变化,十分适合“种子”所需的随机性,而使用 time 函数时需要包含头文件:time.h
随机数生成的这个过程类似套娃,随机伪随机数,那就是随机数了,具体实现如下:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
//使用time函数的返回值设置种子
//因为srand的参数是unsigned int类型,使用我们需要强制转换time返回值的类型
srand((unsigned int)time(NULL));
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
return 0;
}
运行的两次结果如下:
(第一次运行结果) (第二次运行结果)
两次结果不一样且随机,这样就能够得到我们所要的随机数了
1.2 函数代码框架
玩游戏嘛,肯定要一个游戏菜单,让玩家选择能够选择开始或结束游戏,要想显示游戏菜单,我们可以先自定义一个菜单函数 menu( ),它的作用是显示菜单,因此无需返回任何值。代码如下:
//游戏菜单
void menu( )
{
printf(" 猜数字游戏 \n");
printf("===============\n");
printf("=== 1. play ===\n");
printf("=== 0. exit ===\n");
printf("===============\n");
}
接下来就是游戏主体部分,即猜数字的玩法实现。我们可以定义一个 game( ) 函数,它和上面的菜单函数 menu( )一样,无需返回任何值。在函数里面,我们需要把生成的随机数限定在 1 ~ 100 的范围内,这就需要我们限制生成的随机数。我们可以用 100 取余随机数,这样就能得到随机数的十位和个位,再 + 1 ,就能确保余数的范围在 1 ~ 100 ,做法如下:
rand ( ) % 100 + 1 // 此时就能生成 1 ~ 100 之间的随机数
如果想要生成 a ~ b 之间的随机数,公式如下:
a + rand ( ) % (b - a + 1) // 此时就能生成 a ~ b 之间的随机数
完成了随机数的生成,我们就要接收玩家输入的数字,并将它跟随机数进行比较大小,如果大于随机数,就显示 “猜大了” 来提醒玩家,如果小于随机数,就显示 “猜小了” 来提醒玩家,直至玩家猜中正确的数字,游戏结束。以上都是 game( ) 函数里要实现的功能,代码如下:
//游戏主体
void game()
{
int RanNum = rand() % 100 + 1;
int guess = 0;;
while (1)
{
printf("请输入想猜的数字 —— ");
scanf("%d", &guess);
if (guess > RanNum)
{
printf("猜大了\n");
}
else if (guess < RanNum)
{
printf("猜小了\n");
}
else
{
printf("恭喜你,猜中了!\n");
break;
}
}
}
接下来就是主函数的代码思路了。在程序的开始,我们需要先定义一个变量 input,让玩家选择能够选择开始或结束游戏,为 1 则开始游戏,为 0 则退出游戏。如果玩家选择开始游戏,我们就可以进行下一步—生成随机数,即 srand((unsigned int)time(NULL)),然后就可以开始游戏啦。在这里我会使用 do - while 循环,它可以先生成菜单,再来判断,十分适合该场景。
接下来,我们可以用 switch 语句来判断玩家输入的是 “1” 还是 “0”,为 1 则开始游戏,为 0 则退出游戏,如果输入其他值,就可以显示 “选择错误,请重新选择”,这样就可以实现猜数字游戏啦 !
1.3 代码源码
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//游戏菜单
void menu( )
{
printf(" 猜数字游戏 \n");
printf("===============\n");
printf("=== 1. play ===\n");
printf("=== 0. exit ===\n");
printf("===============\n");
}
//游戏主体
void game()
{
int RanNum = rand() % 100 + 1;
int guess = 0;;
while (1)
{
printf("请输入想猜的数字 —— ");
scanf("%d", &guess);
if (guess > RanNum)
{
printf("猜大了\n");
}
else if (guess < RanNum)
{
printf("猜小了\n");
}
else
{
printf("恭喜你,猜中了!\n");
printf("就是%d这个数!\n", RanNum);
break;
}
}
}
//主函数
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu( );
printf("请选择 —— ");
scanf("%d", &input);
switch (input)
{
case 1:
game();
case 0:
printf("游戏结束\n");
break;
default :
printf("输入错误,请重新选择\n");
break;
}
} while (input);
return 0;
}
1.4 难度升级
有人可能会说,这个猜数字游戏没啥挑战性啊,那么,如果我加上猜数字的次数限制,阁下又该如何应对呢(dogo),我们可以限制猜的次数,如果五次猜不出来,就算失败。
我们只需要在代码中加入一个 count 变量,每猜一次 count-- ,直到 count == 0,用 if 语句判段 count 的值,一旦 count == 0,直接跳出 while 循环,显示 “游戏失败”。具体代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//游戏菜单
void menu( )
{
printf(" 猜数字游戏 \n");
printf("===============\n");
printf("=== 1. play ===\n");
printf("=== 0. exit ===\n");
printf("===============\n");
}
//游戏主体
void game()
{
int RanNum = rand() % 100 + 1;
int guess = 0;
int count = 5;//加入次数限制count
while (count)
{
printf("\n你还有%d次机会\n", count);
printf("请猜数字 —— ");
scanf("%d", &guess);
if (guess > RanNum)
{
printf("猜大了\n");
}
else if (guess < RanNum)
{
printf("猜小了\n");
}
else
{
printf("恭喜你,猜中了!\n");
printf("就是%d这个数!\n", RanNum);
break;
}
count--;
}
if (count == 0)
{
printf("你失败了,正确的数字是:%d\n", RanNum);
}
}
//主函数
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu( );
printf("请选择 —— ");
scanf("%d", &input);
switch (input)
{
case 1:
game();
case 0:
printf("游戏结束\n");
break;
default :
printf("输入错误,请重新选择\n");
break;
}
} while (input);
return 0;
}
这样是不是变得更有挑战性了呢
结语
综上就是猜数字游戏的思路分析和代码实现,有初阶版本和进阶版本两种难度,不知到大家觉得如何,欢迎各位在评论区友好讨论,如果觉得不错的话,麻烦您点个赞吧,十分感谢!