資源簡介
輸入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;}
- 上一篇:LVGL 英文參考手冊
- 下一篇:銀行家算法分配資源的模擬實現(main.cpp)
評論
共有 條評論