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

本文实例为大家分享了C++利用循环和栈实现走迷宫的具体代码,供大家参考,具体内容如下

要求:

1、将地图的数组保存在文件中,从文件中读取行列数

2.、动态开辟空间保存地图

3.、运行结束后再地图上标出具体的走法

说明:

1、文件中第一行分别放置的是地图的行数和列数

2、其中1表示墙,即路不通,0表示路,即通路

3、程序运行结束后用2标记走过的路径

4、当走到“死胡同”时用3标记此路为死路

5、每到一个点,按照 左 上 右 下 的顺序去试探

6、没有处理入口就是"死胡同"的极端情况

地图文件截图:

代码示例:maze.h

#ifndef _MAZE_H_
#define _MAZE_H_ 

#include <stack>
#include <fstream>  // ifstream
#include <iostream>
#include <string>
using namespace std; 

// 坐标类
class Seat
{
public:
  Seat(int _x, int _y)
    :x(_x)
    ,y(_y)
  {  }
  int x;
  int y;
}; 

// 迷宫类 

class Maze
{
private:
  int** _map; // 指向地图的指针
  int _row; // 存放地图的行数
  int _col; // 存放地图的列数
public:
  // 构造函数 读取文件里的地图 和行数
  Maze(const string& filePath); 

private:
  // 判断是否是路
  bool IsPass(Seat& entry); 

public:
  // 开始走
  bool PassMaze(stack<Seat>& s, Seat& entry); 

  // 打印地图
  void PrintMap(); 

  // 析构 释放空间
  ~Maze();
};
#endif

maze.cpp

// 迷宫之递归实现
#include "maze.h" 

// 构造函数
Maze::Maze(const string& filePath)
{
  ifstream mapFile(filePath, ofstream::out);
  assert(mapFile); // 断言文件是否存在
  string str_row_col; //第一行 获取行和列
  string str_temp; // 临时字符串  

  // 获取行列的个数
  getline(mapFile,str_row_col);// 读取第一行
  str_temp = str_row_col.substr(0, str_row_col.find_first_of(','));// 取得字符串中的字串获取行数
  _row = atoi(str_temp.c_str()); // atoi将字符串转为数字
  str_temp = str_row_col.substr(str_row_col.find_first_of(',')+1); // 取得字符串中的列数
  _col = atoi(str_temp.c_str()); // atoi将字符串转为数字 

  // 分配空间
  _map = new int*[_row];
  for (int idx = 0; idx < _col; ++idx)
  {
    _map[idx] = new int[_col];
  } 

  // 填充地图
  int index_row = 0; // 放置地图 二维数组的行索引
  int index_col = 0; // 放置地图 二维数组的列索引
  while (!mapFile.eof())
  {
    getline(mapFile, str_temp);
    char* a_line = (char*)str_temp.c_str();
    // 遍历一行
    while (*a_line != '\0')
    {
      if (*a_line == '0' || *a_line == '1')
      {
        _map[index_row][index_col++] = *a_line - '0'; // 减0 是将字符'0'的 ASCII对应的十进制值减去
      }
      a_line++; // 向后移动指针
    }
    ++index_row;
    index_col = 0; // 每处理完一行后将列索引置0
  }
  mapFile.close();
} 

  // 判断是否是路
bool Maze::IsPass(Seat& entry)
{
  if (entry.x < 0 || entry.y < 0 || entry.y >= _col || entry.x >= _row)
  {
    return true;
  }
  if (_map[entry.x][entry.y] == 0)
  {
    return true;
  }
  return false;
} 

// 开始走
void Maze::PassMaze( Seat& entry)
{
  stack<Seat> s;
  if (IsPass(entry))
  {
    s.push(entry); // 压栈当前位置
    while (!s.empty()) // 栈不为空继续
    {
      Seat curSeat = s.top(); // 取得栈顶存储的位置
      // 走到边界
      if (curSeat.x < 0 || curSeat.y < 0 || entry.y >= _col || entry.x >= _row )
      {
        return;
      }
      _map[curSeat.x][curSeat.y] = 2; // 将走过的路标记为2 

      // 往左走
      Seat left(curSeat.x, curSeat.y-1);
      if (IsPass(left))
      {
        s.push(left);
        continue;
      }
      // 往上走
      Seat up(curSeat.x-1, curSeat.y);
      if (IsPass(up))
      {
        s.push(up);
        continue;
      }
      // 往右走
      Seat right(curSeat.x, curSeat.y+1);
      if (IsPass(right))
      {
        s.push(right);
        continue;
      }
      // 往下走
      Seat down(curSeat.x+1, curSeat.y);
      if (IsPass(down))
      {
        s.push(down);
        continue;
      } 

      // 运行到此处说明 每个方向都没有路可走 是死路标记为3
      _map[curSeat.x][curSeat.y] = 3;
      // 出栈这个“死路位置”
      s.pop();
    }
  }
} 

// 打印地图
void Maze::PrintMap()
{
  for (int index_row = 0; index_row < _row; ++index_row)
  {
    for (int index_col = 0; index_col < _col; ++index_col)
    {
      cout << _map[index_row][index_col] <<" ";
    }
    cout <<endl;
  }
  cout <<endl;
} 

// 析构
Maze::~Maze()
{
  for (int idx = 0; idx < _row; ++idx )
  {
    delete[] _map[idx];
  }
  delete[] _map;
  _map = NULL;
} 

test.cpp
[cpp] view plain copy
int main()
{
  Maze m1("map.txt"); // 构造一个迷宫对象
  m1.PrintMap();  // 走之前打印
  m1.PassMaze(Seat(9, 4)); //开始走 传递迷宫入口点
  m1.PrintMap(); // 结束后再次打印
  return 0;
}

截图:

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

您可能感兴趣的文章:

  • C++实现简单走迷宫的代码
  • C++控制台实现随机生成路径迷宫游戏
  • 迷宫游戏控制台版C++代码
  • C++基于prim实现迷宫生成
  • C++ 自定义栈实现迷宫求解
  • C++ 迷宫游戏实现代码
  • 使用C/C++语言生成一个随机迷宫游戏
  • C++实现随机生成迷宫地牢
  • C++实现迷宫算法实例解析
(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++实现随机生成迷宫地牢

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

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

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

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

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

  • C++实现迷宫算法实例解析

    本文以实例形式描述了C++实现迷宫算法.本例中的迷宫是一个矩形区域,它有一个入口和一个出口.在迷宫的内部包含不能穿越的墙或障碍.障碍物沿着行和列放置,它们与迷宫的矩形边界平行.迷宫的入口在左上角,出口在右下角 本实例迷宫算法的功能主要有: 1.自动生成10*10迷宫图 2.判断是否有迷宫出口,并且画出路线图 具体实现代码如下: # include <iostream> # include <list> # include <sys/timeb.h> # include

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

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

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

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

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

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

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

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

  • 如何利用JAVA实现走迷宫程序

    本Demo使用三个类 一个Test类 一个自定义的Stack类 一个自定义的Queue类 可以实现的功能: 1.对于一个写在文本文件中的迷宫,能够将其转换为二维数组用广度优先搜索实现查找最短路径 2.可以不定义迷宫的入口和出口,能自动查找到出入口 前提是要有一个对应路径的.txt文件 这里举个例子吧,我的是"F:/1号迷宫(0,18).txt"路径下 运行结果 示例代码 注释写的很详细,这里就不多赘述了 package com; import java.io.BufferedReade

  • C++利用递归实现走迷宫

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

  • C语言通过栈实现小人走迷宫

    本文实例为大家分享了C语言通过栈实现小人走迷宫的具体代码,供大家参考,具体内容如下 新建stack.h #include "Data.h" #ifndef _STACK_H #define _STACK_H #define INIT_SIZE 10 #define INIT_INCREM 10 typedef struct _STACK{     ElemType *Base;     ElemType *Top;     int size; } STACK; STACK* InitS

  • 用Q-learning算法实现自动走迷宫机器人的方法示例

    项目描述: 在该项目中,你将使用强化学习算法,实现一个自动走迷宫机器人. 如上图所示,智能机器人显示在右上角.在我们的迷宫中,有陷阱(红色×××)及终点(蓝色的目标点)两种情景.机器人要尽量避开陷阱.尽快到达目的地. 小车可执行的动作包括:向上走 u.向右走 r.向下走 d.向左走l. 执行不同的动作后,根据不同的情况会获得不同的奖励,具体而言,有以下几种情况. 撞到墙壁:-10 走到终点:50 走到陷阱:-30 其余情况:-0.1 我们需要通过修改 robot.py 中的代码,来实现一个 Q

  • C++ 基于BFS算法的走迷宫自动寻路的实现

    1.效果图 其中正方形代表障碍物,实心菱形代表移动者(人),空心菱形代表目标位置(都是可以在代码中修改的) 本例使用队列(链表实现),以广度优先进行自动寻路. 2.实现代码 1.队列方法类 coolQueue.h #pragma once #include <iostream> using namespace std; //队列 //坐标结构体 struct Point { int x; int y; Point() { x = 0; y = 0; } Point(int in_x, int

  • 基于C语言实现简单的走迷宫游戏

    本文实例讲述了C语言实现简单的走迷宫游戏的方法,代码完整,便于读者理解. 学数据结构时用"栈"写的一个走迷宫程序,实际上用到双向队列,方便在运行完毕后输出经过的点. #include <cstdio> #include <deque> #include <windows.h> using namespace std; class node { public: int x,y; int lastOpt; }; deque<node> sta

  • C++ DFS算法实现走迷宫自动寻路

    C++ DFS算法实现走迷宫自动寻路,供大家参考,具体内容如下 深度优先搜索百度百科解释: 事实上,深度优先搜索属于图算法的一种,英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次. 运行效果: 说明: 深度优先搜索算法是在我在图的部分接触到的,后来才发现它也可以不用在图的遍历上,它是一个独立的算法,它也可以直接用在一个二维数组上. 其算法原理和实现步骤在代码中已经有了很好的体现了,这里就不再赘述. 在程序

  • 详解Go语言运用广度优先搜索走迷宫

    目录 一.理解广度优先算法 1.1.分析如何进行广度优先探索 1.2.我们来总结一下 1.3.代码分析 二.代码实现广度优先算法走迷宫 一.理解广度优先算法 我们要实现的是广度优先算法走迷宫 比如,我们有一个下面这样的迷宫 这个迷宫是6行5列 其中0代表可以走的路, 1代表一堵墙. 我们把墙标上言责, 就如右图所示. 其中(0,0)是起点, (6, 5)是终点. 我们要做的是, 从起点走到终点最近的路径. 这个例子是抛转隐喻, 介绍广度优先算法, 广度优先算法的应用很广泛, 所以, 先来看看规律

随机推荐