哪位大神帮我看看为什么我的推箱子里的小人按一次上下左右键会跑很多格子 没查出问题 没有多少分给 只求高手帮忙 自己写的代码 可能比较垃圾 谢谢帮助

jack521101 2012-09-11 05:38:27
#include<stdio.h>
#include<windows.h>
#include<conio.h>
#include<iostream>
using namespace std;
void gotoxy(int x,int y)
{
COORD coord;
coord.X=x;
coord.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);
}
struct AIM
{
int x1,y1,x2,y2;
}a={10,2,20,5};
int key_value()
{

if(GetKeyState(VK_UP)<0) return 1; //1表示按下上键
if(GetKeyState(VK_DOWN)<0) return 2; //2表示按下下键
if(GetKeyState(VK_LEFT)<0) return 3; //3表示按下左键
if(GetKeyState(VK_RIGHT)<0)return 4; //4表示按下右键
return 0;
}
void display1()
{
gotoxy(0,0);
printf("################################\n");
printf("## ## ## --------------------------\n");
printf("## ## ## ********************\n");
printf("######## ## ## ## 欢迎来到推箱子小游戏\n");
printf("######## ## ## 按键盘上的上下左右控制小人M的运动\n");
printf("## ## ## #是墙壁\n");
printf("## ###### ## ## $是目的地\n");
printf("## ###### ## @是箱子\n");
printf("## ## ## 祝您游戏愉快!!!\n");
printf("## ## ## ## 制作者:GXY\n");
printf("## ## ## ## 日期:2012.9.11\n");
printf("## ## ## ## ********************\n");
printf("## ## ## ## --------------------------\n");
printf("################################\n");
gotoxy(a.x1,a.y1);
printf("$");
gotoxy(a.x2,a.y2);
printf("$");

}


struct PERSON
{
int x,y;
int vx,vy;
};
struct BOX
{
int x,y;
int vx,vy;
};


int main()
{

int choice,number;
system("color B5");
char map1[][100]={"################################",
"## ## ##",
"## ## ##",
"######## ## ## ##",
"######## ## ##",
"## ## ##",
"## ###### ## ##",
"## ###### ##",
"## ## ##",
"## ## ## ##",
"## ## ## ##",
"## ## ## ##",
"## ## ## ##",
"################################\n"};
char map2[][100]={"################################",
"## ## ##",
"## ## ## ##",
"#### ## ## ##",
"######## ## ##",
"## ## ## ##",
"## ## ## ## ## ##",
"## ###### ##",
"## # ## ##",
"## # ## ##",
"## ## # ## ## ##",
"## # ## ##",
"## ## ## ## ##",
"################################"};



struct PERSON p={2,2,1,1};
struct BOX b={10,6,1,1};
gotoxy(5,5);
printf("---------------------------------------------------------\n");
gotoxy(5,6);
printf(" *************************************************\n");
gotoxy(5,7);
printf(" 欢迎来到推箱子小游戏\n");
gotoxy(5,8);
printf(" 按键盘上的上下左右控制小人M的运动\n");
gotoxy(5,9);
printf(" #是墙壁 请选择关卡(可供选择的有:2)\n");
gotoxy(5,10);
printf(" $是目的地 请输入关卡并按enter键\n");
gotoxy(5,11);
printf(" @是箱子 输入:\n");
gotoxy(5,12);
printf(" 祝您游戏愉快!!!\n");
gotoxy(5,13);
printf(" 制作者:GXY\n");
gotoxy(5,14);
printf(" 日期:2012.9.11\n");
gotoxy(5,15);
printf(" *************************************************\n");
gotoxy(5,16);
printf("---------------------------------------------------------\n");
gotoxy(35,11);
scanf("%d",&number);
if(number==1)
goto state1;
else if(number==2)
goto state2;
state1:
system("cls");
gotoxy(0,0);
display1();
gotoxy(2,2);
printf("M");
gotoxy(10,6);
printf("@");
while(1)
{
choice=key_value();

switch(choice)
{
case 1:
if(map1[p.y-p.vy][p.x]!='#')
{
if(b.x==p.x&&(b.y+1)==p.y)
{
if(map1[p.y-2*p.vy][p.x]!='#')
{
gotoxy(p.x,p.y);
printf(" ");
gotoxy(b.x,b.y);
printf(" ");
p.y-=p.vy;
b.y-=b.vy;
gotoxy(p.x,p.y);
printf("M");
gotoxy(b.x,b.y);
printf("@");
}
}
else
{
gotoxy(p.x,p.y);
printf(" ");
p.y-=p.vy;
gotoxy(p.x,p.y);
printf("M");
}
}

if(b.x==a.x1&&b.y==a.y1)
{
gotoxy(a.x1,a.y1);
printf("☆");
}
else if(b.x==a.x2&&b.y==a.y2)
{
gotoxy(a.x2,a.y2);
printf("☆");
}


break;
case 2:
if(map1[p.y+p.vy][p.x]!='#')
{
if(b.x==p.x&&b.y-1==p.y)
{
if(map1[p.y+2*p.vy][p.x]!='#')
{
gotoxy(p.x,p.y);
printf(" ");
gotoxy(b.x,b.y);
printf(" ");
p.y+=p.vy;
b.y+=b.vy;
gotoxy(p.x,p.y);
printf("M");
gotoxy(b.x,b.y);
printf("@");
}
}
else
{
gotoxy(p.x,p.y);
printf(" ");
p.y+=p.vy;
gotoxy(p.x,p.y);
printf("M");

}
}


if(b.x==a.x1&&b.y==a.y1)
{
gotoxy(a.x1,a.y1);
printf("☆");
}
else if(b.x==a.x2&&b.y==a.y2)
{
gotoxy(a.x2,a.y2);
printf("☆");
}
break;
case 3:
if(map1[p.y][p.x-p.vx]!='#')
{
if((b.x+1)==p.x&&b.y==p.y)
{
if(map1[p.y][p.x-2*p.vx]!='#')
{
gotoxy(p.x,p.y);
printf(" ");
gotoxy(b.x,b.y);
printf(" ");
p.x-=p.vx;
b.x-=b.vx;
gotoxy(p.x,p.y);
printf("M");
gotoxy(b.x,b.y);
printf("@");
}
}
else
{

gotoxy(p.x,p.y);
printf(" ");
p.x-=p.vx;
gotoxy(p.x,p.y);
printf("M");

}
}


if(b.x==a.x1&&b.y==a.y1)
{
gotoxy(a.x1,a.y1);
printf("☆");
}
else if(b.x==a.x2&&b.y==a.y2)
{
gotoxy(a.x2,a.y2);
printf("☆");
}
break;
case 4:
if(map1[p.y][p.x+p.vx]!='#')
{
if(b.x-1==p.x&&b.y==p.y)
{
if(map1[p.y][p.x+2*p.vx]!='#')
{
gotoxy(p.x,p.y);
printf(" ");
gotoxy(b.x,b.y);
printf(" ");
p.x+=p.vx;
b.x+=b.vx;
gotoxy(p.x,p.y);
printf("M");
gotoxy(b.x,b.y);
printf("@");
}
}
else
{
gotoxy(p.x,p.y);
printf(" ");
p.x+=p.vx;
gotoxy(p.x,p.y);
printf("M");
}
}
if(b.x==a.x1&&b.y==a.y1)
{
gotoxy(a.x1,a.y1);
printf("☆");
}
else if(b.x==a.x2&&b.y==a.y2)
{
gotoxy(a.x2,a.y2);
printf("☆");
}
break;
}

}
//太长了 只能把state1放进去


return 0;

}

...全文
130 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuriarthas 2012-09-15
  • 打赏
  • 举报
回复
你应该测试GetKeydown和GetKeyup,
建立数组bool Key[4] ;
通过GetKeydown的保存,
if(Keydown(VK_LEFT))
{
key[LEFT]=1 ;
}
...
然后在测试Keyup,
if(Keyup(VK_LEFT))
{
if(key[LEFT]==1)
{
key[LEFT=0 ;
Dosth() ;
}
}
就行了
qjzl2008 2012-09-15
  • 打赏
  • 举报
回复
刚修改地图,测试了下 果然出现了你所说的问题,

测试了下,我猜测原因可能是这样的。GetKeyState()读取到虚拟键的消息后,这个获取的值会缓存一段时间,然而你的while循环执行速度太快,所以,这个消息还没来得及清除信息,所以就重复读取了很多次,所以就会出现一次走N步的情况。我添了个变量进去测试了下,的确那条语句进行了多遍,

所以,相当于是在缓存清除的那个时间片当中重复执行多次,假如你设置断点,或者 while循环执行一次就sleep一段时间的话就不会出现这个情况。

至于解决方案, 你试下换一个监听键盘的函数看看,我记得还有几个函数都可以的。。
qjzl2008 2012-09-15
  • 打赏
  • 举报
回复
我把代码copy过去测试了下。没发现这个问题,每次按一下只走一步,但是你的地图被封的只能上下两格动 = =

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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