本人纯萌新,如果有技术上的失误欢迎各位大佬来指导。
一.游戏描述
顾名思义,该程序让系统随机生成一个指定范围内的整数,让玩家来猜,玩家猜数字后,系统给予玩家回馈并且统计玩家猜的次数,直到玩家猜对为止。
但是其实,我们往往在输入的时候有输错的情形,在玩游戏时直接影响了愉悦的心情.
为此优化了一些输入
二游戏内容
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; }