前言
嗨嗨,虽然是不同的时间,但是在同一个地点,我码达拉又来了奥。那么这篇呢为大家带来“猜数游戏”的正式过程,在此之前所要掌握的关于随机数的生成等内容,请看我的上一篇:CSDN
整体架构流程
1.要形成整体思路蓝图:只有事先在脑海里形成程序的框架需求,我们才能朝着正确的方向前进。说到猜数游戏,我认为应该想到以下几点:
(1)游戏不能只玩一次就结束,而是可以根据玩家意愿选择继续或退出。
(2)游戏开始时,首先出现菜单提示:开始或退出,玩家输入对应的数字进行选择,若选择不当,应重新选择。
(3)当玩家选择玩游戏后,进入游戏环节,计算机应生成一个随机数供玩家猜测,并就玩家输入的数字提示偏大或偏小,若猜对或者次数用尽,则终止游戏。
(4)计算机保留玩家的输入记录,并显示每次距离目标数的误差大小。
2.依照蓝图建高楼:
(1)顺着思路,我们开始走:首先,我们要保证游戏是循环进行的,那我们直接do while起手:
#include <stdio.h>
int main()
{
do
{
} while ();
return 0;
}
花括号内就是我们的游戏程序,此时先不管循环条件是啥。
(2)进入游戏,首先出现的必然是游戏菜单,不放在{}内放一个menu()函数调用,此函数的功能就是显示出菜单。先入为主,放上后我们再具体定义一下menu函数。顺序如下图:
#include <stdio.h>
int main()
{
do
{
menu();//游戏菜单
} while ();
return 0;
}
#include <stdio.h>
void menu(viod)
{
puts("*********************************");
puts("*********************************");
puts("******* 1.paly **********");
puts("******* 0.exit **********");
puts("*********************************");
}
int main()
{
do
{
menu();//游戏菜单
} while ();
return 0;
}
(3)看到菜单提示了,玩家就该进行选择了:
#include <stdio.h>
void menu(viod)
{
puts("*********************************");
puts("*********************************");
puts("******* 1.paly **********");
puts("******* 0.exit **********");
puts("*********************************");
}
int main()
{
int input;
do
{
menu();//游戏菜单
printf("是否开始游戏?【1…play/0…exit】");
scanf("%d", &input);//玩家选择
} while ();
return 0;
}
(4)根据玩家选择,计算机开始执行相应的流程:若玩家输入1则开始游戏,输入0则结束程序,输入其他值则重新选择,这种情况下使用switch语句是一个不错的选择。
#include <stdio.h>
void menu(viod)
{
puts("*********************************");
puts("*********************************");
puts("******* 1.paly **********");
puts("******* 0.exit **********");
puts("*********************************");
}
int main()
{
int input;
do
{
menu();//游戏菜单
printf("是否开始游戏?【1…play/0…exit】");
scanf("%d", &input);//玩家选择
switch (input)
{
case 1:game(); break;
case 0:puts("退出游戏");
default:puts("选择错误,请重新选择:");
}
} while (input);
return 0;
不难发现运用switch语句是非常巧妙的,在这里能够和do while语句相得益彰,我们来剖析一下:
当玩家输入1时,就会进入相应的游戏阶段即game()且结束一次后因为满足循环条件,可以进行下一次选择;而输入0时,玩家是想退出游戏的,电脑会显示“退出游戏”且不满足循环条件,程序不会进行下一次执行,真正地做到了结束游戏!输入0,1以外的数字,道理和输入1相同。这样,游戏的总体框架就完成了
(4)进入游戏,生成随机数:上面说到,玩家输入1后,会进入game()游戏阶段,下面我们就来完善game函数的游戏代码吧。
假定我们要猜一个1~100的数字,首先是要生成随机数,详细内容我已发布过,因此不做赘述,直接声明:
#include <stdio.h>
#include<stdlib.h>
#include<time.h>
void menu(void)
{
puts("*********************************");
puts("*********************************");
puts("******* 1.paly **********");
puts("******* 0.exit **********");
puts("*********************************");
}
//游戏1程序
void game(void)
{
int ret = rand() % 100 + 1;//随机数范围
int gusee;//玩家猜测的数字
}
int main()
{
int input;
srand((unsigned int)time(NULL));
do
{
menu();//游戏菜单
printf("是否开始游戏?【1…play/0…exit】");
scanf("%d", &input);//玩家选择
switch (input)
{
case 1:game(); break;
case 0:puts("退出游戏");
default:puts("选择错误,请重新选择:");
}
} while (input);
return 0;
}
将变量ret作为目标数,值得一提的是,并不是上来就能把所有相关变量都设出来的,而是能想到什么就设什么,有些没想到的在后面编写的过程中都会一一浮出水面,到时候再补上也不迟。
(5)边走边摸索:电脑要先提示我们输入范围数字,并且我们希望,在每次输入前都能提示玩家还有多少次机会,机会可以任意设定,为了方便修改,我们可以用宏定义次数。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<stdlib.h>
#include<time.h>
#define NUMBER 5
void menu(void)
{
puts("*********************************");
puts("*********************************");
puts("******* 1.paly **********");
puts("******* 0.exit **********");
puts("*********************************");
}
//游戏1程序
void game(void)
{
int ret = rand() % 100 + 1;//随机数范围
int guess;//玩家猜测的数字
int count = NUMBER;//机会次数
printf("请猜一个1~100的数字:");
}
游戏开始后,想要结束,只有两种原因:一是玩家猜对了;二是次数用尽了。想要做到这一点,可以用while循环实现,代码如下:
void game(void)
{
int ret = rand() % 100 + 1;//随机数范围
int guess;//玩家猜测的数字
int count = NUMBER;//机会次数
printf("请猜一个1~100的数字:");
while (count > 0)
{
printf("温馨提示:你还有%d次机会!",count--);
scanf("%d", &guess);
if (guess > ret)
puts("太大了,再小一点试试");
else if (guess < ret)
puts("有点子小了,要不再大点?");
else
{
puts("恭喜你,猜对了!");
break;
}
}
if (count == 0)
printf("很遗憾,你没有猜对,正确答案是%d.\n", ret);
}
此时,游戏就可以正常玩了
(5)保存输入记录并显示误差:上面在思路里说过,计算机能储存玩家的输入记录,回顾我们之前写的代码,是不能做到的,我们可以用数组来弥补这一缺陷,因为数组是可以存储数据的嘛,只需要把所有的变量guess变成数组guess[NUMBER]即可,相信聪明的你一定能看懂下面的代码:
void game(void)
{
int ret = rand() % 100 + 1;//随机数范围
int guess[NUMBER];//玩家猜测的数字
int count = NUMBER;//机会次数
int i = 0;
printf("请猜一个1~100的数字:");
while (count > 0)
{
printf("温馨提示:你还有%d次机会!",count--);
scanf("%d", &guess[i]);
if (guess[i]> ret)
puts("太大了,再小一点试试");
else if (guess[i] < ret)
puts("有点子小了,要不再大点?");
else
{
puts("恭喜你,猜对了!");
break;
}
i++;
}
if (count == 0)
printf("很遗憾,你没有猜对,正确答案是%d.\n", ret);
puts("输入记录 误差大小");
puts("-----------------------------");
for (i = 0; i < NUMBER - count; i++)
printf("%3d %+d\n", guess[i], ret - guess[i]);
}
游戏技巧
大家知道怎样才能提高游戏的成功率吗?不妨试试每次都取中间值,第一次猜50,后续再根据提示去中间值即可。
可见,虽然只有5次机会,我们依然能猜出非常接近答案的数字。只是我太菜了,相信聪明的你们肯定比我会猜,哈哈哈。
小结
蓝图在手,方可建高楼,房子是一点点盖成的,路是一步步探索出来的,程序也是如此!