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;
}

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

(0)

相关推荐

  • C++控制台实现随机生成路径迷宫游戏

    本程序是在控制台下随机生成迷宫路径的一个C++程序,可以通过修改宏定义 M 和 N 的值来修改迷宫的长度和宽度,运行程序后 按1开始游戏 按2退出游戏,游戏入口在左上角,出口在右下角,人物(星星)到达右下角出口提示成功闯关. #include<stdio.h> #include<stdlib.h> #include<string.h> #include<conio.h> #include<iostream.h> #include<ctime

  • C++实现简单走迷宫的代码

    本文实例为大家分享了C++实现走迷宫的具体代码,供大家参考,具体内容如下 用n*n个小方格代表迷宫,每个方格上有一个字符0或1,0代表这个格子不能走,1代表这个格子可以走.只能一个格子一个走,而且只能从一个格子向它的上.下.左.右四个方向走,且不能重复.迷宫的入口和出口分别位于左上角和右下角,存在唯一的一条路径能够从入口到达出口,试着找出这条路径. 例如,下图是一个迷宫,红色表示走出迷宫的一条路径 输入:入口坐标(startX,startY),出口坐标(endX,endY) 输出:如果存在这样一

  • C++ 迷宫游戏实现代码

    C++ 迷宫游戏实现代码 题目 通过让游戏角色自动寻找迷宫出口,走出迷宫,来练习C++面向对象之封装的基础知识.迷宫图如下所示,其中X表示墙. 1.程序分析 走出去的原理:遵循右手规则或左手规则.右手扶墙走,就会走出迷宫,反之,亦然. step1 创建迷宫类,打印出迷宫地图. step2 创建走迷宫的人的类. 2.程序实现 MazeMap.h #ifndef MAZEMAP_H #define MAZEMAP_H #include <iostream> #include <Windows

  • C++基于prim实现迷宫生成

    本文实例为大家分享了C++实现迷宫生成的具体代码,供大家参考,具体内容如下 只用到了c++中的vector,其余的和纯C差别不大,纯C可能需要手动弄一个vector太繁琐了不太想弄. 看了迷宫的一些算法,prim还是比较好看的,网上的代码python c#居多,而且不太容易搞懂,那我在这里用C++(大部分C)实现了这个目的 prim算法:随机Prim算法生成的迷宫岔路较多,整体上较为自然而又复杂,算法核心为(根据维基百科). 1.让迷宫全是墙. 2.选一个单元格作为迷宫的通路(我一般选择起点),

  • C++实现随机生成迷宫地牢

    可以用这个地图核心做成一个无限迷宫类的游戏 main.cpp // Author: FreeKnight 2014-09-02 #include "stdafx.h" #include <iostream> #include <string> #include <random> #include <cassert> /* 简单逻辑流程描述: 将整个地图填满土 在地图中间挖一个房间出来 选中某一房间(如果有多个的话)的墙壁 确定要修建某种新

  • C++利用循环和栈实现走迷宫

    本文实例为大家分享了C++利用循环和栈实现走迷宫的具体代码,供大家参考,具体内容如下 要求: 1.将地图的数组保存在文件中,从文件中读取行列数 2..动态开辟空间保存地图 3..运行结束后再地图上标出具体的走法 说明: 1.文件中第一行分别放置的是地图的行数和列数 2.其中1表示墙,即路不通,0表示路,即通路 3.程序运行结束后用2标记走过的路径 4.当走到"死胡同"时用3标记此路为死路 5.每到一个点,按照 左 上 右 下 的顺序去试探 6.没有处理入口就是"死胡同&quo

  • 迷宫游戏控制台版C++代码

    本文实例分享了C++设计的一个可以调整大小的迷宫游戏,给定迷宫的入口.如果存在出口,程序能够显示行走的路径,并最终到达出口,并输出"成功走出迷宫":如果不存在出口,程序也能够显示行走的过程,并最终回退到入口,并输出"回退到入口". //这是一个迷宫游戏 #include<iostream> #include<ctime> #include<cstdlib>/*用于生成随机数,形成随机变化的迷宫*/ #include<ioma

  • C++实现迷宫游戏

    本文实例为大家分享了C++实现迷宫游戏的具体代码,供大家参考,具体内容如下 #include<iostream> using namespace std; //点为2表示迷宫图为"█",点为0表示迷宫图为" " int migo[9][9]= { {2, 2, 2, 2, 2, 2, 2, 2, 2}, {2, 0, 0, 0, 0, 0, 0, 0, 2}, {2, 0, 2, 2, 0, 2, 2, 0, 2}, {2, 0, 2, 0, 0, 2,

  • 使用C/C++语言生成一个随机迷宫游戏

    迷宫相信大家都走过,毕竟书本啊啥啥啥的上面都会有迷宫,主要就是考验你的逻辑思维.那么我们学习C/C++也是需要学习到逻辑思维方式的,那今天我就来分享一下,如何用C/C++打造一个简单的随机迷宫游戏.(代码的话我只截取了如何创建迷宫的代码,如果想要全套代码的话可以加群:558502932,群内有很多C/C++学习资料提供学习,大家一起交流进步) 完整版的迷宫游戏效果如下: 代码如下: //创建迷宫 void CreateMaze(int x,int y) { //定义4个方向 int dir[4]

  • C++ 自定义栈实现迷宫求解

    C++ 自定义栈实现迷宫求解 一:迷宫求解 是一个锻炼我们的算法求解能力的问题,它的实现方法有很多:今天我们就介绍其中的用栈求解的方法. 二:什么是栈: 大家应该都有往袋子里装东西的经历,在往袋子里装满东西之后,当我们去取的时候,总是先从最后放进去的东西的地方去取.也就是后进先出(FILO).虽然栈的单向性用起来会没有链表那样可以在任意位置对数据进行操作,但是正因为如此栈也带来了很大的方便. 三:迷宫求解 现在我们要在下面的迷宫寻找一条可行的路径 1 1 1 1 1 1 1 1 1 1 1 0

随机推荐