迷宫游戏 堆栈实现
#include<iostream>
#include<string>
#include<stack>
using namespace std;
#define n 8stack <int *> s;int * createMaze(){//初始化迷宮int i,j;int * a;a=new int[n*n];for(i=0;i<n;i++){for(j=0;j<n;j++){*(a+n*i+j)=-1;//不設(shè)置為0的原因是超過矩陣范圍的位置} //系統(tǒng)默認的是0,會引起麻煩}*(a+n*0+1)=3;s.push(a+n*0+1);//當(dāng)前位置入棧*(a+n*1+1)=1;*(a+n*1+2)=1;*(a+n*1+3)=1;*(a+n*1+5)=1;*(a+n*2+3)=1;*(a+n*2+4)=1;*(a+n*2+5)=1;*(a+n*2+6)=1;*(a+n*3+1)=1;*(a+n*3+2)=1;*(a+n*3+3)=1;*(a+n*3+5)=1;*(a+n*4+1)=1;*(a+n*4+4)=1;*(a+n*5+1)=1;*(a+n*5+2)=1;*(a+n*5+4)=1;*(a+n*5+5)=1;*(a+n*5+6)=1;*(a+n*6+2)=1;*(a+n*6+3)=1;*(a+n*6+4)=1;*(a+n*6+6)=1;*(a+n*7+6)=1;return a;
}
//程序中標(biāo)記-1,1,2,3,4的值表示意義例如以下:
//-1:障礙物(方塊)
//1:可行走的通道且還未曾被五角星通過
//2:五角星走過的通道(這樣說不全然準(zhǔn)確)。更準(zhǔn)確的說是已經(jīng)壓棧的元素(地址)
//3:標(biāo)識五角星
//4:遇到再也走不通的位置,離開時所填充的障礙(與-1的作用同樣,可是不顯示出來)void printMaze(int * a){//打印迷宮int i,j;for(i=0;i<n;i++){for(j=0;j<n;j++){if(*(a+n*i+j)==1||*(a+n*i+j)==2||*(a+n*i+j)==4){cout<<" ";}else if(*(a+n*i+j)==3){cout<<"★";}else{//*(a+n*i+j)==-1cout<<"■";}}cout<<endl;}
}void run(int * a,char ch){int i,j;for(i=0;i<n;i++){for(j=0;j<n;j++){if(*(a+n*i+j)==3){switch(ch){case 'w':if(*(a+n*(i-1)+j)==1){*(s.top())=2;s.push(a+n*(i-1)+j);//入棧*(s.top())=3;}if(*(a+n*(i-1)+j)==2){*(s.top())=-1;s.pop();//出棧*(s.top())=3;}return;case 'a':if(*(a+n*i+j-1)==1){*(s.top())=2;s.push(a+n*i+j-1);//入棧*(s.top())=3;}if(*(a+n*i+j-1)==2){*(s.top())=-1;s.pop();//出棧*(s.top())=3;}return;case 's':if(*(a+n*(i+1)+j)==1){*(s.top())=2;s.push(a+n*(i+1)+j);//入棧*(s.top())=3;}if(*(a+n*(i+1)+j)==2){*(s.top())=-1;s.pop();//出棧*(s.top())=3;}return;case 'd':if(*(a+n*i+j+1)==1){*(s.top())=2;s.push(a+n*i+j+1);//入棧*(s.top())=3;}if(*(a+n*i+j+1)==2){*(s.top())=-1;s.pop();//出棧*(s.top())=3;}return;}}}}
}char getDirection(int * a){//得到方向int i,j;for(i=0;i<n;i++){for(j=0;j<n;j++){if(*(a+n*i+j)==3){//必須按優(yōu)先級排列if(*(a+n*i+j+1)==1){return 'd';}if(*(a+n*(i+1)+j)==1){return 's';}if(*(a+n*i+j-1)==1){return 'a';}if(*(a+n*(i-1)+j)==1){return 'w';}if(*(a+n*i+j+1)==2){return 'd';}if(*(a+n*(i+1)+j)==2){return 's';}if(*(a+n*i+j-1)==2){return 'a';}if(*(a+n*(i-1)+j)==2){return 'w';}else{cout<<"無效按鍵"<<endl;}}}}
}int handle(){int * a;int count=1;string step;//用string是為了避免用戶多輸入字符而引起錯誤a=createMaze();printMaze(a);cout<<"請按隨意鍵進行下一步!"<<endl;while(*(a+n*7+6)!=3){cout<<"第"<<count<<"步:";cin>>step;run(a,getDirection(a));printMaze(a);count++;}cout<<"恭喜你,順利到達終點!"<<endl;return 0;
}int main(){handle();return 0;
}
版權(quán)聲明:本文博主原創(chuàng)文章,博客,未經(jīng)同意不得轉(zhuǎn)載。
轉(zhuǎn)載于:https://www.cnblogs.com/blfshiye/p/4936551.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
- 上一篇: cordova 项目添加splash启动
- 下一篇: 小旭的互联网营销之微信营销