資源簡介
輸入WASD控制人物移動(dòng)方向,R重置本關(guān)卡。
用函數(shù)得到人物在輸入方向前的第一個(gè)和第二個(gè)元素的坐標(biāo),隱去了在判斷是否可以移動(dòng)時(shí)有關(guān)WASD的具體細(xì)節(jié)。
代碼片段和文件信息
#include
#include
#include
//三個(gè)全局變量,ij代表人物坐標(biāo),n代表剩余箱子(目標(biāo)點(diǎn))的個(gè)數(shù)。
//每進(jìn)入一個(gè)關(guān)卡,給ijn賦初值。wasd控制人物移動(dòng),ijn相應(yīng)地變化。
//n變?yōu)?,代表箱子全部就位,關(guān)卡結(jié)束。
//優(yōu)點(diǎn)是,每次移動(dòng)后,不用全部遍歷。
int?ijn;
//用二維數(shù)組表示地圖,枚舉類型定義地圖的元素。
enum?item{SPAWALDESROLBOXBADRAD};
//==output
//設(shè)置光標(biāo)可見與否
void?visible_cursor(int?para){
HANDLE?h=GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO?CInfo;
GetConsoleCursorInfo(h&CInfo);
CInfo.bVisible=para;
SetConsoleCursorInfo(h&CInfo);
}
//設(shè)置控制臺顏色
void?color(int?c){
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE)c);
}
//設(shè)置控制臺光標(biāo)位置,目的是根據(jù)wasd的操作,有選擇地改變
//輸出,而不是遍歷輸出
void?setCP(int?xint?y){
COORD?coord;
coord.X=2*y;
coord.Y=x;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE)coord);
}
//根據(jù)元素輸出控制臺字符
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
//根據(jù)人物的當(dāng)前位置,輸入的按鍵,計(jì)算出按鍵方向上,第n個(gè)元素的坐標(biāo)
int?getx(char?chint?a){
switch(ch){
case?‘w‘:return?i-a;
case?‘s‘:return?i+a;
case?‘a(chǎn)‘:
case?‘d‘:return?i;
}
return?0;
}
int?gety(char?chint?a){
switch(ch){
case?‘w‘:
case?‘s‘:return?j;
case?‘a(chǎn)‘:return?j-a;
case?‘d‘:return?j+a;
}
return?0;
}
//如果輸入一個(gè)wasd,判斷可以移動(dòng),則用此函數(shù)改變?nèi)肿兞縤j
void?chij(char?ch){
if(ch==‘a(chǎn)‘)j-=1;
else?if(ch==‘d‘)j+=1;
else?if(ch==‘w‘)i-=1;
else?i+=1;
}
//根據(jù)輸入的wasd按鍵,判斷是否可以移動(dòng),并且改變相應(yīng)的地圖元素
int?change(enum?item?map[][10]char?ch){
if(ch==‘r‘)return?1;//r鍵可以重置本關(guān)卡
else?if(ch!=‘a(chǎn)‘&&ch!=‘d‘&&ch!=‘s‘&&ch!=‘w‘)return?0;
int?x1=getx(ch1)x2=getx(ch2)y1=gety(ch1)y2=gety(ch2);//得到人物在按鍵方向前的第一個(gè)和第二個(gè)元素的坐標(biāo)
enum?item?*this=&map[i][j]*next1=&map[x1][y1]*next2=&map[x2][y2];//用指針指向人物在按鍵方向前的第一個(gè)和第二個(gè)元素,以備使用和修改
if(*next1==SPA||*next1==DES){//人物的下一個(gè)位置是空或目標(biāo)位置,可以移動(dòng)
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);//人物已經(jīng)移動(dòng),遂修改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;}
評論
共有 條評論