骑士漫游的一个小的C程序,有点问题,求助~~~~

AVE缌念 2013-07-01 09:47:33
在运行完一遍,重玩游戏的时候,还没输入就直接出来一个“输入错误”这是怎莫回事?是我input()函数有问题吗?
...全文
120 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
shen_wei 2013-07-02
  • 打赏
  • 举报
回复
gets(str); 你可以换成Scanf 这样来获取。。
AVE缌念 2013-07-02
  • 打赏
  • 举报
回复
引用 2 楼 adlay 的回复:
gets 是读入一行, 有回车就算. 而之前输入 y 的那句 scanf(" %c",&judge); 并不会读入回车, 但是你输如的时候是需要输入回车的. 所有缓冲去就留了一个回车, 后面的 gets 就读入了一个空行了. 如果你输入一个 y3 在回车的话, gets 就会获得 3 的输入. 修改建议: scanf(" %c",&judge); 改成: judge =(char)getch(); 需要头文件 conio.h
恩,已经改好了,谢谢啦^_^
www_adintr_com 2013-07-01
  • 打赏
  • 举报
回复
gets 是读入一行, 有回车就算. 而之前输入 y 的那句 scanf(" %c",&judge); 并不会读入回车, 但是你输如的时候是需要输入回车的. 所有缓冲去就留了一个回车, 后面的 gets 就读入了一个空行了. 如果你输入一个 y3 在回车的话, gets 就会获得 3 的输入. 修改建议: scanf(" %c",&judge); 改成: judge =(char)getch(); 需要头文件 conio.h
AVE缌念 2013-07-01
  • 打赏
  • 举报
回复
]#include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <time.h> #define N 50 ////////////////////////////////////////////// int n,m; int count=0,t=1; int num[N+1][N+1],point1[N+1],point2[N+1]; int input(); void evaluat(); void knight(int x1,int y1,int x2,int y2); double number(int x1,int y1,int x2,int y2 ); ////////////////////////////////////////////// void main() { int i,x1,y1,x2,y2,times=1; char judge; clock_t start, finish; double duration; do { system("cls"); printf("\n****************骑士巡游游戏****************\n"); printf("\n开始第>>>>>>>>>> %d <<<<<<<<<<次游戏\n",times); printf("\n输入棋盘大小,长宽均大于2小于50\nn="); n=input(2,N); printf("m="); m=input(2,N); count=0; t=1; evaluat(); start = clock(); knight(1,1,n,m); if(count==0) { printf("\n从(1,1)->(%d,%d)之间无路径",n,m); } else { count=number(2,3,n,m)+number(3,2,n,m)+number(3,0,n,m)+number(2,-1,n,m); printf("\n从(1,1)->(%d,%d)之间有%d条路径,\n其中一条为:",n,m,count); for(i=1;i<t;i++) { printf("(%d,%d)",point1[i],point2[i]); if(i<t-1) printf("->"); } } finish = clock(); duration = (double)(finish/1000 - start/1000); printf( "\n用时%.0f seconds\n", duration ); printf("\n下面请输入\n\n骑士起点:x1="); x1=input(1,n); printf("y1="); y1=input(1,m); printf("\n骑士终点:x2="); x2=input(1,n); printf("y2="); y2=input(1,m); count=0; evaluat(); count=number(x1+1,y1+2,x2,y2)+number(x1+2,y1+1,x2,y2)+number(x1+2,y1-1,x2,y2)+number(x1+1,y1-2,x2,y2); printf("\n从(%d,%d)->(%d,%d)之间有%d条路径。\n",x1,y1,x2,y2,count); printf("\n是否重玩?Y(是),其他键退出\n"); scanf(" %c",&judge); times++; }while(judge=='Y'||judge=='y'); printf("游戏结束!"); } //骑士遍历所有路径,并记录第一条路径 void knight(int x1,int y1,int x2,int y2) { if(count==0) //当路径数为0时,记录点的坐标 { point1[t]=x1; point2[t]=y1; t++; } if((x1==x2)&&(y1==y2)) { count=1; //找到一条路径,hw=false; return; } if((y1>=1)&&(y1<=m)&&(x1<x2)) //以当前点作为起点,遍历下面的点 { knight(x1+1,y1+2,x2,y2); if(count==0)t=t-1; else return; knight(x1+2,y1+1,x2,y2); if(count==0)t=t-1; else return; knight(x1+2,y1-1,x2,y2); if(count==0)t=t-1; else return; knight(x1+1,y1-2,x2,y2); if(count==0)t=t-1; else return; } return; } double number(int x1,int y1,int x2,int y2 ) { double nn=0; if(num[x1][y1]!=-1) { return num[x1][y1]; } if(y1>=1&&y1<=m&&x1<=x2) { if((x1==x2)&&(y1==y2)) { num[x1][y1]=1; return 1; } else { nn=number(x1+1,y1+2,x2,y2)+number(x1+2,y1+1,x2,y2)+number(x1+2,y1-1,x2,y2)+number(x1+1,y1-2,x2,y2); num[x1][y1]=nn; } } return nn; } //判断输入的字符是否合法 int input(int lim1,int lim2) { char str[10]; int x; gets(str); while(1) { x=atoi(str); if(strlen(str)==1&&isdigit(str[0])) { if(x>=lim1) return x; } if(strlen(str)==2&&isdigit(str[0])&&isdigit(str[1])) { if(x<=lim2) return x; } printf("\n输入错误,请重新输入!\n"); gets(str); } } void evaluat() { int i,j; for(i=0;i<=N;i++) { for(j=0;j<N;j++) { num[i][j]=-1; } }

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧