首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

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

2012-09-17 
哪位大神帮我看看为什么我的推箱子里的小人按一次上下左右键会跑很多格子 没查出问题 没有多少分给 只求高

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

 

[解决办法]
多半是按键逻辑的问题.
按键判断应该是 [按下 + 弹起] 或 [弹起 + 按下]判定为一次按下或者弹起.
如果只用按下状态判定,事实上你没每按键一次,在你手指放开之前,已经有多个"按下",
除非你用系统封装的API(如Windows的VK_*)来判定.
[解决办法]
推箱子游戏VC6源代码
http://download.csdn.net/detail/zhao4zhong1/3230945

热点排行