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

jack521101 2012-09-11 05:38:42
#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;

}

...全文
149 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2012-09-12
  • 打赏
  • 举报
回复
jack521101 2012-09-12
  • 打赏
  • 举报
回复
该怎么弄按下弹起呢?我不会啊,
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;
}这个是我抄的 不是太懂就用了 麻烦指点
jack521101 2012-09-12
  • 打赏
  • 举报
回复
该怎么弄按下弹起呢?我不会啊,
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;
}这个是我抄的 不是太懂就用了 麻烦指点
JiMoKuangXiangQu 2012-09-11
  • 打赏
  • 举报
回复
多半是按键逻辑的问题.
按键判断应该是 [按下 + 弹起] 或 [弹起 + 按下]判定为一次按下或者弹起.
如果只用按下状态判定,事实上你没每按键一次,在你手指放开之前,已经有多个"按下",
除非你用系统封装的API(如Windows的VK_*)来判定.

69,382

社区成员

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

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