C++实现迷宫小游戏

时间:2021-05-20

介绍

本程序是根据广度优先遍历算法的思想设计的一款迷宫游戏,游戏设计了两种模式一种自动游戏模式,一种手动模式。因为项目在 Linux 开发,需要在 Windows 开发的,请查看源代码中需要修改地方的备注。

截图

代码

#include <iostream>#include <cstdlib> //标准库#include <unistd.h> //延时函数#include <stdio.h> //getchar #include <ctime> #include <termios.h> //终端设置#define MAX_X 20#define MAX_Y 30bool flag = false;bool slow = false;bool autogame = true;using namespace std;int maze[MAX_X][MAX_Y]; //迷宫//路线栈class stack_of_maze{private: //记录迷宫坐标 struct node { int x; int y; char direction; //上一步路径(如何来的) node* next; }; node* head;public: stack_of_maze(){ head = NULL; } ~stack_of_maze(){ node* p = head; while(head!=NULL){ head = head->next; delete p; p = head; } } //压栈 void push(int xx,int yy,char ddirection){ node* new_node = new node; if(new_node!=NULL){ new_node->x = xx; new_node->y = yy; new_node->direction = ddirection; new_node->next = NULL; if(head==NULL) head = new_node; else{ new_node->next = head; head = new_node; } } else cout<<"内存分配失败"<<endl; } //出栈 node* pop(int& xx,int& yy){ if(head!=NULL){ node* p = head; head = head->next; xx = p->x; yy = p->y; delete p; } return head; } void print(){ if(head!=NULL){ node* p = head; while(p!=NULL){ cout<<" "<<p->x<<" "<<p->y<<" "<<p->direction<<endl; p = p->next; } } else cout<<"栈为空,打印失败"<<endl; }};//创建迷宫void createMaze(){ int maxway = MAX_X * MAX_Y; //最大通路 int x,y; for(x=0;x<MAX_X;x++) for(y=0;y<MAX_Y;y++) maze[x][y] = 1; //先填充迷宫 srand((unsigned)time(NULL)); //随机函数种子,以时间为参数 for(int i=0;i<maxway;i++) //随机构建迷宫通路 { x = rand() % (MAX_X-2) + 1; y = rand() % (MAX_Y-2) + 1; maze[x][y] = 0; } maze[1][1] = 0; //入口 maze[MAX_X-2][MAX_Y-2] = 0; //出口 maze[0][1] = 3; maze[MAX_X-1][MAX_Y-2] = 0;}//输出迷宫void printMaze(){ int x,y; system("clear"); //windows下使用system("cls") //cout<<endl; for(x=0;x<MAX_X;x++) { for(y=0;y<MAX_Y;y++) { if(maze[x][y]==0){cout<<" ";continue;} //通路 if(maze[x][y]==1){cout<<"■";continue;} //墙 if(maze[x][y]==2){cout<<"×";continue;} //死胡同 if(maze[x][y]==3){cout<<"↓";continue;} //向下走 if(maze[x][y]==4){cout<<"→";continue;} if(maze[x][y]==5){cout<<"←";continue;} if(maze[x][y]==6){cout<<"↑";continue;} if(maze[x][y]==7){cout<<"※";continue;} //当前站立位置 } cout<<endl; } if(slow){ sleep(1); //延时函数 }}void check(stack_of_maze &s){ int temp[MAX_X][MAX_Y]; for(int x=0;x<MAX_X;x++) for(int y=0;y<MAX_Y;y++) temp[x][y] = maze[x][y]; int x=1,y=1; //出发点 while(1){ temp[x][y] = 2; //向下 if(temp[x+1][y]==0){ s.push(x,y,'D'); temp[x][y] = 3; //在当前位置做一个向下的标志 x = x + 1; temp[x][y] = 7; //当前位置 if((x==MAX_X-1)&&(y==MAX_Y-2)){ flag = true; return; } else continue; } //向右 if(temp[x][y+1]==0){ s.push(x,y,'R'); temp[x][y] = 4; //在当前位置做一个向右的标志 y = y + 1; temp[x][y] = 7; if((x==MAX_X-1)&&(y==MAX_Y-2)){ flag = true; return; } else continue; } //向上 if(temp[x-1][y]==0){ s.push(x,y,'U'); temp[x][y] = 6; //在当前位置做一个向上的标志 x = x - 1; temp[x][y] = 7; if((x==MAX_X-1)&&(y==MAX_Y-2)){ flag = true; return; } else continue; } //向左 if(temp[x][y-1]==0){ s.push(x,y,'L'); temp[x][y] = 5; //在当前位置做一个向右的标志 y = y - 1; temp[x][y] = 7; if((x==MAX_X-1)&&(y==MAX_Y-2)){ flag = true; return; } else continue; } //上下左右不通,则回退 if(s.pop(x,y)==NULL && temp[x-1][y]!=0 && temp[x][y-1]!=0 && temp[x][y+1]!=0 && temp[x+1][y]!=0){ temp[0][1] = 7; if(temp[1][1]!=1) temp[1][1] = 2; return; } }}//输入,windows下可以使用#incldue<conio.h>替代此函数char getch(){ char ch; static struct termios oldt, newt; //保存原有终端属性和新设置的终端属性 tcgetattr( STDIN_FILENO, &oldt); //获得终端原有属性并保存在结构体oldflag //设置新的终端属性 newt = oldt; newt.c_lflag &= ~(ICANON); tcsetattr( STDIN_FILENO, TCSANOW, &newt); //取消回显 system("stty -echo"); ch = getchar(); system("stty echo"); tcsetattr( STDIN_FILENO, TCSANOW, &oldt); //让终端恢复为原有的属性 return ch;}void move(){ int x=1,y=1; //出发点 while(1){ switch(getch()){ case 's': if(maze[x+1][y]==0){ maze[x][y] = 0; x = x + 1; maze[x][y] = 7; //当前位置 printMaze(); if((x==MAX_X-1)&&(y==MAX_Y-2)){ cout<<"\n\n 成功走出"<<endl; return; } } break; case 'd': if(maze[x][y+1]==0){ if(maze[x][y+1]==0){ maze[x][y] = 0; y = y + 1; maze[x][y] = 7; printMaze(); if((x==MAX_X-1)&&(y==MAX_Y-2)){ cout<<"\n\n 成功走出"<<endl; return; } } } break; case 'w': if(maze[x-1][y]==0){ maze[x][y] = 0; x = x - 1; maze[x][y] = 7; printMaze(); if((x==MAX_X-1)&&(y==MAX_Y-2)){ cout<<"\n\n 成功走出"<<endl; return; } } break; case 'a': if(maze[x][y-1]==0){ maze[x][y] = 0; y = y - 1; maze[x][y] = 7; printMaze(); if((x==MAX_X-1)&&(y==MAX_Y-2)){ cout<<"\n\n 成功走出"<<endl; return; } } break; } }}void autoMove(stack_of_maze &s){ int x=1,y=1; //出发点 while(1){ maze[x][y] = 2; //向下 if(maze[x+1][y]==0){ s.push(x,y,'D'); maze[x][y] = 3; //在当前位置做一个向下的标志 x = x + 1; maze[x][y] = 7; //当前位置 if(slow) printMaze(); if((x==MAX_X-1)&&(y==MAX_Y-2)){ s.push(x,y,'*'); cout<<"\n\n 成功走出"<<endl; return; } else continue; } //向右 if(maze[x][y+1]==0){ s.push(x,y,'R'); maze[x][y] = 4; //在当前位置做一个向右的标志 y = y + 1; maze[x][y] = 7; if(slow) printMaze(); if((x==MAX_X-1)&&(y==MAX_Y-2)){ s.push(x,y,'*'); cout<<"\n\n 成功走出"<<endl; return; } else continue; } //向上 if(maze[x-1][y]==0){ s.push(x,y,'U'); maze[x][y] = 6; //在当前位置做一个向上的标志 x = x - 1; maze[x][y] = 7; if(slow) printMaze(); if((x==MAX_X-1)&&(y==MAX_Y-2)){ s.push(x,y,'*'); cout<<"\n\n 成功走出"<<endl; return; } else continue; } //向左 if(maze[x][y-1]==0){ s.push(x,y,'L'); maze[x][y] = 5; //在当前位置做一个向右的标志 y = y - 1; maze[x][y] = 7; if(slow) printMaze(); if((x==MAX_X-1)&&(y==MAX_Y-2)){ s.push(x,y,'*'); cout<<"\n\n 成功走出"<<endl; return; } else continue; } //上下左右不通,则回退 if(s.pop(x,y)==NULL && maze[x-1][y]!=0 && maze[x][y-1]!=0 && maze[x][y+1]!=0 && maze[x+1][y]!=0){ cout<<"\n\n 没有找到合适的路径"<<endl; maze[0][1] = 7; if(maze[1][1]!=1) maze[1][1] = 2; return; } }}void menu();void gamestart(){ flag = false; while(!flag){ stack_of_maze stack; //定义一个栈的对象,用来记录行走路线 createMaze(); check(stack); system("clear"); cout<<"\t* loading. *"<<endl; system("clear"); cout<<"\t* loading.. *"<<endl; system("clear"); cout<<"\t* loading... *"<<endl; } printMaze(); //输出当前迷宫的初始状态 cout<<"\n\n 输入enter键继续"<<endl; getchar(); if(!autogame){ move(); cout<<"\n\n 输入enter键继续"<<endl; getchar(); menu(); } else{ stack_of_maze stack1; autoMove(stack1); //行走中…… } printMaze(); //输出迷宫的最终状态 cout<<"\n\n 输入enter键继续"<<endl; getchar(); menu();}void menu(){ system("clear"); int num; cout<<"\t****************************************"<<endl; cout<<"\t* *"<<endl; cout<<"\t* 1.查看路径 *"<<endl; cout<<"\t* *"<<endl; cout<<"\t* 2.自动进行 *"<<endl; cout<<"\t* *"<<endl; cout<<"\t* 3.自行游戏 *"<<endl; cout<<"\t* *"<<endl; cout<<"\t* 4.退出游戏 *"<<endl; cout<<"\t* *"<<endl; cout<<"\t****************************************"<<endl; slow = false; switch(getch()){ case '1': autogame = true; gamestart();break; case '2': autogame = true; slow = true; gamestart(); break; case '3': autogame = false; gamestart(); break; case '4': exit(1);break; default: cout<<"\n\n 错误操作,输入enter返回!"<<endl; getchar(); menu(); } getchar();}int main(int argc,char** argv){ menu(); return 0;}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章