猜过数或者看了数据之后再回到主菜单,就无法退出了,还有如果输入多个非法字符,输入几个就会返回几行输入错误,要如何改成只返回一行输入错误呢?
代码如下
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void Guessnumber(void);
void choosedifficulty(void);
void menu(void);
void changecolor(void);
void grade(void);
void start(void);
int maxnum(int x,int y);
int minnum(int x,int y);
int t;//选择难度的全局变量
int max,min=1;//猜数范围的全局变量
int countall=0,countsuccess=0,countfail=0;
double success=0;
int main()
{
system("color E0");
menu();//调用输入菜单函数
start();
system("pause");
return 0;}
void start(void)
{
int a,n; //n是从菜单进入程序的选项,a是判断输入是否合法的变量
for(;;)//输入并判断输入的数是否为0或1
{
a=scanf("%d",&n);
if(a==0)
{
getchar();
printf("输入错误,请重新输入:\n");
}
else
{
if(n!=0 && n!=1 &&n!=2 &&n!=3)
{
getchar();
printf("输入错误,请重新输入:\n");
}
else if(n==1)
{
system("cls");//清屏
Guessnumber();
}
else if(n==2)
{
changecolor();
system("cls");//清屏
menu();//调用输入菜单函数
}
else if(n==3)
{
system("cls");//清屏
grade();
}
else if(n==0)
{
break;
}
}
}}
void menu(void)//定义输入菜单函数
{
printf("\n");
printf("欢迎来到猜数字游戏!\n");
printf("1---游戏开始\n");
printf("2---更换颜色\n");
printf("3---统计数据\n");
printf("0---退出游戏\n");
printf("\n");
printf("请输入您的选择>\n");
}
void grade(void)
{
if(countall!=0)
{
success=(double)countsuccess/(double)countall;
}
printf("您已经玩了%d次,其中%d次成功,%d次失败\n成功率为%.2f%%\n",countall,countsuccess,(countall-countsuccess),success*100);
printf("回到主菜单--1\n退出--0\2\n>>");
int a,n;
for(;;)//输入并判断输入的数是否为0或1
{
a=scanf("%d",&n);
if(a==0)
{
getchar();
printf("输入错误,请重新输入:\n");
}
else
{
if(n!=0 && n!=1)
{
getchar();
printf("输入错误,请重新输入:\n");
}
else if(n==1)
{
system("cls");//清屏
menu();
start();
}
else if(n==0)
{
break;
}
}
}
}
void changecolor(void)
{
printf("\n");
printf("1---红色\n");
printf("2---蓝色\n");
printf("3---绿色\n");
printf("4---黑色\n");
printf("5---黄色\n");
printf("\n");
printf("请输入您的选择>\n");
int a,n;
for(;;)//输入并判断输入的数是否合法
{
a=scanf("%d",&n);
if(a==0)
{
getchar();
printf("输入错误,请重新输入:\n");
}
else
{
if(n!=1 && n!=2 &&n!=3 &&n!=4 &&n!=5)
{
getchar();
printf("输入错误,请重新输入:\n");
}
else if(n==1)
{
system("color 40");
break;
}
else if(n==2)
{
system("color 10");
break;
}
else if(n==3)
{
system("color 20");
break;
}
else if(n==4)
{
system("color 07");
break;
}
else if(n==5)
{
system("color E0");
break;
}
}
}
}
void choosedifficulty(void)
{
int a;//判断输入的数是否合法的变量
printf("请选择难度\n1为简单,范围1-10\n2为中等,范围1-100\n3为困难,范围1-200\n");
for(;;)//输入并判断输入的数是否合法
{
a=scanf("%d",&t);
if(a==0)
{
getchar();
printf("输入错误,请重新输入:\n");
}
else
{
if(t!=1 && t!=2 && t!=3)
{
getchar();
printf("输入错误,请重新输入:\n");
}
else if(t==1)
{
max=10;
break;
}
else if(t==2)
{
max=100;
break;
}
else if(t==3)
{
max=200;
break;
}
}
}
}
void Guessnumber(void)
{
countall++;
int n,a;//n是猜的数字 ,a是判断输入是否为数字的变量 ,t是选择难度的变量
char begin;//判断是否继续的变量
int count = 1;//猜的次数
srand((int)time(NULL));//取随机数
choosedifficulty();
system("cls");//清屏
int m = (rand() % max) + 1;//m是要猜的随机数
printf("游戏开始,请输入您猜的数字:\n范围1-%d,共有10次机会\n",max);
while (1)
{
for(;;)//输入并判断输入的数是否为数字
{
a=scanf("%d",&n);
if(a==0)
{
getchar();
printf("您输入的不是数字,重新输入:\n");
}
else
{
break;
}
}
if (n == m)//猜中的情况
{
countsuccess++;
printf("恭喜您猜中了,使用了 %d 次!\n", count);
getchar();
printf("您还继续玩吗?输入Y或y继续玩,输入N或n回到主菜单,输入其他退出 \n");
scanf("%c", &begin);
if (begin == 'Y' || begin == 'y') //判断是否继续玩
{
system("cls");//清屏
Guessnumber();
}
else if (begin == 'N' || begin == 'n') //判断是否继续玩
{
system("cls");//清屏
menu();
start();
}
else
{
printf("游戏结束,再见!\n");
}
}
else if (n < m)//猜小的情况
{
countfail++;
if(count<10)
{
min=maxnum(min,n);
system("cls");//清屏
if(count<5){
printf("太小了!敢不敢再大点?还剩%d次机会\n",(10-count));
printf("范围为%d-%d,请重新输入:",min,max);
}
if(count>=5){
printf("太小了!就这?能不能行啊?还剩%d次机会,好好把握啊老铁!\n",(10-count));
printf("范围为%d-%d,请重新输入:",min,max);
}
}
else if(count==10)
{
system("cls");//清屏
printf("不好意思!您又猜错了,游戏结束\n");
printf("继续玩请按1,回到主菜单请按2,0退出");
int a,n; //n是从菜单进入程序的选项,a是判断输入是否合法的变量
for(;;)//输入并判断输入的数是否为0或1
{
a=scanf("%d",&n);
if(a==0)
{
getchar();
printf("输入错误,请重新输入:\n");
}
else
{
if(n!=0 && n!=1 &&n!=2)
{
getchar();
printf("输入错误,请重新输入:\n");
}
else if(n==1)
{
system("cls");//清屏
Guessnumber();
}
else if(n==2)
{
system("cls");//清屏
menu();
start();
}
else if(n==0)
{
break;
}
}
}
}
}
else//猜大的情况
{
if(count<10)
{
max=minnum(max,n);
system("cls");//清屏
if(count<5){
printf("太大了!加油小老弟,还剩%d次机会\n",(10-count));
printf("范围为%d-%d,重新输入:",min,max);
}
if(count>=5){
printf("太大了!不会吧!不会吧!不会真的有人猜不对吧!还剩%d次机会,再加把油!\n",(10-count));
printf("范围为%d-%d,重新输入:",min,max);
}
}
else if(count==10)
{
system("cls");//清屏
printf("不好意思!您又猜错了,游戏结束\n");
printf("继续玩请按1,回到主菜单请按2,退出请按0");
int a,n; //n是从菜单进入程序的选项,a是判断输入是否合法的变量
for(;;)//输入并判断输入的数是否为0或1
{
a=scanf("%d",&n);
if(a==0)
{
getchar();
printf("输入错误,请重新输入:\n");
}
else
{
if(n!=0 && n!=1 &&n!=2)
{
getchar();
printf("输入错误,请重新输入:\n");
}
else if(n==1)
{
system("cls");//清屏
Guessnumber();
}
else if(n==2)
{
system("cls");//清屏
menu();
start();
}
else if(n==0)
{
break;
}
}
}
}
}
count++;//次数+1
}}
int maxnum(int x,int y)
{
int z;
if(x>y)
{
z=x;
}
else
{
z=y;
}
return(z);
}
int minnum(int x,int y)
{
int z;
if(x<y)
{
z=x;
}
else
{
z=y;
}
return(z);
}