• 大小: 5.67KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2024-04-14
  • 语言: C/C++
  • 标签: 推箱子  C语言  

资源简介

输入WASD控制人物移动方向,R重置本关卡。

用函数得到人物在输入方向前的第一个和第二个元素的坐标,隐去了在判断是否可以移动时有关WASD的具体细节。

资源截图

代码片段和文件信息

#include
#include
#include
//三个全局变量,ij代表人物坐标,n代表剩余箱子(目标点)的个数。
//每进入一个关卡,给ijn赋初值。wasd控制人物移动,ijn相应地变化。
//n变为0,代表箱子全部就位,关卡结束。
//优点是,每次移动后,不用全部遍历。
int ijn;
//用二维数组表示地图,枚举类型定义地图的元素。
enum item{SPAWALDESROLBOXBADRAD};
//==output
//设置光标可见与否
void visible_cursor(int para){
HANDLE h=GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO CInfo;
GetConsoleCursorInfo(h&CInfo);
CInfo.bVisible=para;
SetConsoleCursorInfo(h&CInfo);
}
//设置控制台颜色
void color(int c){
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE)c);
}
//设置控制台光标位置,目的是根据wasd的操作,有选择地改变
//输出,而不是遍历输出
void setCP(int xint y){
COORD coord;
coord.X=2*y;
coord.Y=x;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE)coord);
}
//根据元素输出控制台字符
void itemout(enum item i){
switch(i){
case SPA:color(7);printf(“  “);break;
case WAL:color(8);printf(“■“);break;
case DES:color(14);printf(“○“);break;
case BOX:color(4);printf(“■“);break;
case BAD:color(4);printf(“●“);break;
case RAD:color(10);printf(“RR“);break;
case ROL:color(10);printf(“PP“);break;
}
}
//==output=end
//==control=to=mov
//根据人物的当前位置,输入的按键,计算出按键方向上,第n个元素的坐标
int getx(char chint a){
switch(ch){
case ‘w‘:return i-a;
case ‘s‘:return i+a;
case ‘a‘:
case ‘d‘:return i;
}
return 0;
}
int gety(char chint a){
switch(ch){
case ‘w‘:
case ‘s‘:return j;
case ‘a‘:return j-a;
case ‘d‘:return j+a;
}
return 0;
}
//如果输入一个wasd,判断可以移动,则用此函数改变全局变量ij
void chij(char ch){
if(ch==‘a‘)j-=1;
else if(ch==‘d‘)j+=1;
else if(ch==‘w‘)i-=1;
else i+=1;
}
//根据输入的wasd按键,判断是否可以移动,并且改变相应的地图元素
int change(enum item map[][10]char ch){
if(ch==‘r‘)return 1;//r键可以重置本关卡
else if(ch!=‘a‘&&ch!=‘d‘&&ch!=‘s‘&&ch!=‘w‘)return 0;
int x1=getx(ch1)x2=getx(ch2)y1=gety(ch1)y2=gety(ch2);//得到人物在按键方向前的第一个和第二个元素的坐标
enum item *this=&map[i][j]*next1=&map[x1][y1]*next2=&map[x2][y2];//用指针指向人物在按键方向前的第一个和第二个元素,以备使用和修改
if(*next1==SPA||*next1==DES){//人物的下一个位置是空或目标位置,可以移动
if(*next1==SPA)*next1=ROL;//修改地图元素
else *next1=RAD;
setCP(x1y1);itemout(*next1);//输出修改后的元素
if(*this==ROL)*this=SPA;//修改地图元素
else *this=DES;
setCP(ij);itemout(*this);//输出修改后的元素
chij(ch);//人物已经移动,遂修改ij
}
else if(*next1==BOX||*next1==BAD)//人物前方是箱子
if(*next2==SPA||*next2==DES){//箱子前方是空白
if(*next2==SPA)*next2=BOX;
else{*next2=BAD;n-=1;}
setCP(x2y2);itemout(*next2);
if(*next1==BAD){*next1=RAD;n+=1;}

评论

共有 条评论