目录
本人纯萌新,如果有技术上的失误欢迎各位大佬来指导。
一.游戏描述
顾名思义,该程序让系统随机生成一个指定范围内的整数,让玩家来猜,玩家猜数字后,系统给予玩家回馈并且统计玩家猜的次数,直到玩家猜对为止。
但是其实,我们往往在输入的时候有输错的情形,在玩游戏时直接影响了愉悦的心情.
为此优化了一些输入
二游戏内容
1、生成游戏菜单 1. play(进入游戏) 0. exit (退出游戏)
2、使用循环语句,构建游戏框架,使玩家可以进行多次游戏,直到猜对为止。3、让用户输入想要使用的次数,并记录,防止非法输入影响游戏体验。
4、设计游戏具体思路,使系统生成一个随机数,让玩家输入一个数字,然后两个数字对比,根据系统反馈信息,逐渐锁定目标。
代码实现:
1.生成游戏菜单
此处应该不需要过多的解释吧!
//猜数游戏
void menu()
{
printf("****************\n");
printf("**** 1.play ****\n");
printf("**** 0.exit ****\n");
printf("****************\n");
}
2.定义限定输入的数据类型函数
//限定输入的数据类型
int Judge(int n)
{
while (scanf("%d", &n) == 0 || getchar() != '\n')
{
printf("输入的次数不为整数,请重新输入:");
while (getchar() != '\n'); // 清除缓存区
}
return n;
}
此处解释一下
我们输入的时候有可能会输入其他的字符,但是正常使用scanf时会出现以下情形:
可以看到这里我们没有一直输入数据,但是程序一直循环,因为在第一次输入数据时,我不小心输入了一个字符'a',但是scanf是读取要求的类型与输入的类型不符合,然而又被留在scanf的缓存区中了,故一直循环读取scanf缓存区的内容,形成了死循环!
为了解决这个问题,我写了一个函数去防止读取错误,具体可看拙作
3.构建游戏内容的函数
void game()
{
srand((unsigned int)time(NULL));
//如果 timer 是NULL,就只返回这个时间的差值。
//srand 用来初始化随机数的生成器的
int ret = rand() % 100 + 1;//1.生成随机数(1-100)
int count = 0;//想要猜的次数
int trueCount = 0;//实际猜的次数
int guess = 0;//2.要猜的数字
printf("请输入你想要猜的次数"); count = Judge(count);
while (count)
{
printf("猜猜数字"); guess = Judge(guess);
if (guess < ret)
{
printf("猜小了\n");
}
else if (guess > ret) {
printf("猜大了\n");
}
else {
printf("猜对了,恭喜你\n");
printf("你猜的次数是%d次\n", trueCount);
break;
}
count--;
trueCount++;
}
if (count == 0)
{
printf("次数用尽,正确答案是%d\n", ret);
}
}
此处解释一下
我个人认为游戏性是很重要的!!!为此我限定了用户希望猜的次数,并且能让用户在体验后知道自己使用的次数,为此我加上了count和trueCount这两个变量.此处的输入已经用Judge函数代替了!!!
4.实现效果如下
可以明显的看出不会因为输入错误而报错了!!!
如果使用二分法进行猜100以内的任何一个随机数,最多七次就可以正确猜对该随机数。
所以我建议使用二分法去猜数!
代码附上
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
//猜数游戏
void menu()
{
printf("****************\n");
printf("**** 1.play ****\n");
printf("**** 0.exit ****\n");
printf("****************\n");
}
//限定输入的数据类型
int Judge(int n)
{
while (scanf("%d", &n) == 0 || getchar() != '\n')
{
printf("输入的次数不为整数,请重新输入:");
while (getchar() != '\n'); // 清除缓存区
}
return n;
}
void game()
{
srand((unsigned int)time(NULL));
//如果 timer 是NULL,就只返回这个时间的差值。
//srand 用来初始化随机数的生成器的
int ret = rand() % 100 + 1;//1.生成随机数(1-100)
int count = 0;//想要猜的次数
int trueCount = 0;//实际猜的次数
int guess = 0;//2.要猜的数字
printf("请输入你想要猜的次数"); count = Judge(count);
while (count)
{
printf("猜猜数字"); guess = Judge(guess);
if (guess < ret)
{
printf("猜小了\n");
}
else if (guess > ret) {
printf("猜大了\n");
}
else {
printf("猜对了,恭喜你\n");
printf("你猜的次数是%d次\n", trueCount);
break;
}
count--;
trueCount++;
}
if (count == 0)
{
printf("次数用尽,正确答案是%d\n", ret);
}
}
int main()
{
int input = 0;
do
{
menu();
printf("请选择: >");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误\n");
break;
}
} while (input);
return 0;
}
今天就先到这了!!!
看到这里了还不给博主扣个:
⛳️ 点赞☀️收藏 ⭐️ 关注!
你们的点赞就是博主更新最大的动力!
有问题可以评论或者私信呢秒回哦。