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

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;

}

...全文
139 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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过去测试了下。没发现这个问题,每次按一下只走一步,但是你的地图被封的只能上下两格动 = =
在Windows 10或Windows 11操作系统中,用户经常会遇到共享打印机时出现的一系列错误代码,这些错误代码可能会阻碍打印机共享功能的正常使用。常见的错误代码包括0x00000057、0x00000709和0x0000011b,这些代码通常指出了不同的问题,比如权限不足、服务未运行或配置错误等。除此之外,还有一些故障提示如“连接失败”或“内存不足”,这些都可能影响到打印机共享的稳定性。 要解决这些故障,首先要确保打印机已经正确地连接到网络,并且在需要共享的电脑上进行了设置。确保打印机驱动程序是最新的,并且在共享设置中错误配置。对于权限问题,需要检查网络上的用户账户是否具有足够的权限来访问共享打印机。同时,也要确保打印机服务正在运行,特别是“Print Spooler”服务,因为这是打印机共享服务的核心组件。 在某些情况下,问题可能与操作系统的更新有关,如升级到最新版的Windows 10或Windows 11后可能出现的兼容性问题。这时,可能需要查看微软的官方支持文档来获取特定的解决方案或更新。 对于错误代码0x00000057,这通常是由于足够的权限来访问网络打印机或其共享资源,解决方法是确保网络打印机的权限设置正确,包括在组策略中设置相应的访问权限。而0x00000709错误可能是由于打印机驱动问题或打印机端口配置错误,可以尝试重新安装或更新打印机驱动来解决。至于0x0000011b错误,这往往是因为打印机队列服务的问题,检查并重启“Print Spooler”服务通常是解决这类问题的常见手段。 至于“连接失败”或“内存不足”这类故障,通常与客户端和打印机之间的网络连接以及打印机本地资源的使用情况有关。检查网络连接,确保打印机所在的网络段故障或中断。同时,如果打印机的打印队列长时间得不到处理,可能会导致内存不足的情况,这时可能需要清理打印队列或增加打印机的内存配置。 为了助用户更快速地解决这些问题,市面上出现了各种打印机共享错误修复工具。这些工具往往通过预设的修复程序来自动检测和修正打印机共享中常见的问题。它们可以快速检查打印机驱动、网络连接以及共享设置,并且能够提供一键修复功能,大幅减少了用户自行排查和解决问题的难度。 然而,在使用这些修复工具之前,用户应确保这些工具的来源是安全可靠的,避免因使用不当的修复工具而引发其他系统安全或隐私问题。用户可以到官方平台或者信誉良好的软件提供商处下载这些工具。通过细心检查打印机的共享设置,及时更新驱动程序和服务,以及合理使用修复工具,大多数共享打印机的问题都可以得到有效的解决。

70,023

社区成员

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

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