前情指引
首先,我们需要知道,猜数字游戏的原理在哪里
在程序中,我们会给你一个随机数让你猜,并在大了、小了与正确之间徘徊。这时候,我们要解决的问题有哪些?随机数、判断随机数与所猜数字的大小关系,以及游戏最基础的逻辑框架结构
- 首先解决的是随机数的问题
我们知道rand()函数就是电脑用来生成随机数的,但是它还是不是绝对的随机数,它只是根据种子而生成随机数罢了,所以,如果要生成真正的随机数,那就要拥有真正随机的种子才可以
所以,我们找到了srand函数,一个生成随机数种子的函数,而后,我们又发现了一个无需人为操作,自己就是随机数的东西:时间。所以,只要将随机数种子设为时间,那么rand函数生成的随机数,就是真正的随机数
- 再就是游戏的逻辑框架结构与判断随机数与所猜数字的大小关系
是个人都知道,玩游戏需要有进入和退出的菜单才可以,就比如这样:
所以首先要设置一个menu函数,用来输出菜单
然后呢,就是通过按键选择玩或是不玩。由于我们希望通过循环使玩家在玩完一局之后还可以再玩,所以我们选择使用循环结构与分支结构嵌套在一起
因为以上缘故,我们特地将“玩”与“不玩”设置为选择“1”和“0”,这样在选择1的时候,会一直在里面循环,而选择0的话则是会结束循环,结束程序
最后,游戏的核心程序,比较输入数与随机数的大小,利用if语句,让输入数大了的时候输出“大了”,而小了的时候输出“小了”,直到答对的时候输出“对了”,并退出循环,再次进入到游戏的主界面选择环节
知道了这些原理之后,我们就可以开始编写代码,并把它们组装到一起了
代码编写
- 基础架构
//主函数
int main()
{
srand((unsigned int)time(NULL));
//随机随机数种子
int input = 0;
do
{
menu();//菜单
printf("Please enter:");
scanf("%d", &input);
switch (input)
{
case 0:
printf("Exit the guess number game\n");
break;
//退出游戏
case 1:
printf("Game start\n");
game();
break;
//玩游戏
default:
printf("Error,again please\n");
break;
//输错了,重新输一遍
}
} while (input);
return 0;
}
//菜单
void menu()
{
printf("*************\n");
printf("***1. play***\n");
printf("***0. exit***\n");
printf("*************\n");
}
//游戏函数
void game()
{
int guess = rand() % 100 + 1;//1到100的随机数
int num = 0;
while (1)
{
printf("请输入猜测数:\n");
scanf("%d", &num);
if (num < guess)
printf("小了\n");
else if (num > guess)
printf("大了\n");
else
{
printf("It is right\n");
break;
}
}
}
//头文件
#include<stdio.h>
#include<time.h>//time(NULL)需要引用
#include<stdlib.h>//srand和rand
显而易见,将这些组合起来之后就可以运行一个简单的猜数字游戏了,功能已经相当的完备。
所以,在后面,我将会给这个代码加上一点难度,让它变得更加复杂,也就是进阶玩法
- 限制次数
void game_two()
{
int guess = rand() % 100 + 1;//1到100的随机数
int num = 0;
int count = 10;
//表示有几次机会
while (count)
{
printf("你还有%d次机会\n", count);
printf("请输入猜测数:\n");
scanf("%d", &num);
if (num < guess)
printf("小了\n");
else if (num > guess)
printf("大了\n");
else
{
printf("It is right\n");
break;
}
count--;//每选一次机会就变少
}
if (count == 0)
{
printf("Loser!");//机会用完,输了
}
}
- 加上倒计时
void times(int n)
{
for (int i = n; i >= 0; i--)//倒计时
{
printf("倒计时:%d\n", i);
Sleep(1000);//一秒之后再输出
system("cls");//每过一次就清除前一次的输出
}
}
//这里要用到#include<Windows.h>
//这里如果想一边倒计时一边输入比较困难,需要用到多线程,笔者暂时还不会,如果有会输入线程的小伙伴欢迎来与我探讨
而如果想要包含这些模式进去,那么我们就需要考虑建立第二个菜单,也就是副菜单,包含几个模式的输入
//副菜单
void menu_two()
{
printf("*************\n");
printf("***1. easy***\n");//简单模式
printf("***2. average***\n");//普通模式
printf("***3 .difficult***\n");//困难模式
printf("*************\n");
}
而主函数也会变成这个样子
//主函数
int main()
{
srand((unsigned int)time(NULL));
int input1 = 0;
int input2 = 0;
do
{
menu_one();
printf("Please enter:");
scanf("%d", &input1);
//主要的变化在下面
switch (input1)
{
case 0:
printf("Exit the guess number game\n");
break;
case 1:
menu_two();
printf("Please enter:");
scanf("%d", &input2);
printf("Game start\n");
switch (input2)
{
case 1:
printf("简单模式开始\n");
game_one();
break;
case 2:
printf("普通模式开始\n");
game_two();
break;
case 3:
printf("困难模式开始\n");
game_three();
break;
}
break;//这里的break是为了防止前面的游戏结束之后,继续输出default的内容
default:
printf("Error,again please\n");
break;
}
} while (input1);
return 0;
}
以上就是笔者我对于猜数字游戏的一些粗略理解,如有更佳的方法或者更苦难的写法,欢迎大家一起来探讨!