C++实现迷宫小游戏
介绍
本程序是根据广度优先遍历算法的思想设计的一款迷宫游戏,游戏设计了两种模式一种自动游戏模式,一种手动模式。因为项目在 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 30
bool 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;
}
以上是 C++实现迷宫小游戏 的全部内容, 来源链接: utcz.com/z/356220.html