迷宫

用Python编写迷宫游戏 文章目录1、 项目概述1.1 项目目标和主要内容1.2 项目的主要功能2、 项目设计2.1项目总体框架2.2 关键算法分析3、设计步骤3.1导入模块3.2定义颜色变量3.3定义游戏结束函数3.4定义主函数3.5执行主函数3.6将.py文件转为.exe文件4、运行结果 1、 项目概述 1.1 项目目标和主要内容 迷宫游戏是非常经典的游戏,在该项目要求随机生成一个迷宫,并求解迷宫 1.2 项目的主要功能 随机生成迷宫并求解 2、 项目设计 2.1项目总体框架 通过 Prim 算法随机创建迷宫 阅读详情
#ifndef _SQSTACK_H_
#define _SQSTACK_H_

//定义顺序栈类
template <class ElemType>//声明一个类模板
class SqStack
{
public:                     //顺序栈类的各成员函数
	SqStack(int m = 100);     
	~SqStack(); 
   	void Clear();
	bool Empty() const;
   	int Length() const;
   	ElemType & Top() const;
   	void Push(const ElemType &e);
   	void Pop();
private:		           	//顺序栈类的数据成员
    ElemType *m_base;     //基地址指针
    int m_top;            //栈顶指针
	int m_size;           //向量空间大小
};

//构造函数,分配m个结点的顺序空间,构造一个空的顺序栈。
template <class ElemType>
SqStack <ElemType>::SqStack(int m)
{
	m_top = 0;
	m_base = new ElemType[m];
	m_size = m;
}//SqStack

//析构函数,将栈结构销毁。
template <class ElemType>
SqStack <ElemType>::~SqStack()
{
	if (m_base != NULL) delete[] m_base;
}//~SqStack

//清空栈。
template <class ElemType>
void SqStack <ElemType>::Clear()
{
	m_top = 0;
}//Clear

//判栈是否为空,若为空,则返回true,否则返回false。
template <class ElemType>
bool SqStack <ElemType>::Empty() const
{
	return m_top == 0;
}//Empty

//求栈的长度。
template <class ElemType>
int SqStack <ElemType>::Length() const
{
	return m_top;
}//Length

//取栈顶元素的值。先决条件是栈不空。
template <class ElemType>
ElemType & SqStack <ElemType>::Top() const
{
	return m_base[m_top - 1];
}//Top

//入栈,若栈满,则先扩展空间。插入e到栈顶。
template <class ElemType>
void SqStack <ElemType>::Push(const ElemType &e)
{
    if(m_top >= m_size){			//若栈满,则扩展空间。 
		ElemType *newbase;
        newbase = new ElemType[m_size + 10];
        for(int j = 0; j < m_top; j++) 
            newbase[j] = m_base[j];   
        delete[] m_base;
        m_base = newbase;
		m_size += 10;
    }
	m_base[m_top++] = e;
}//Push

//出栈,弹出栈顶元素。先决条件是栈非空。
template <class ElemType>
void SqStack <ElemType>::Pop()
{
	m_top--;
}//Pop

#endif

#include <iostream>
using namespace std;

#include "SqStack.h"

#define MAXSIZE 30 //设迷宫的最大行列为30

struct PosType //迷宫坐标位置类型
{
	int x; //行值
	int y; //列值
};

struct DataType   //栈的元素类型
{
	PosType seat; //点在迷宫中的"坐标位置"
	int di;       //从此点走向下一点的"方向"(0~3表示东~北)
};

class Maze
{
public:
	Maze(int, int);
	~Maze();
	bool MazePath(PosType, PosType);
	void Input();
	void Print();
private:
	PosType NextPos(PosType, int);
	int **m_maze; //迷宫数组
	int m_row;    //迷宫的行数
	int m_col;    //迷宫的列数
};

//构造函数
Maze::Maze(int m, int n)
{
	m_row = m + 2;
	m_col = n + 2;
	m_maze = new int * [m_row];
	for (int i = 0; i < m_row; i++)
		m_maze[i] = new int [m_col];
}//Maze

//析构函数
Maze::~Maze()
{
	for (int i = 0; i < m_row; i++)
		if (m_maze[i] != NULL)
			delete [] m_maze[i];
	if (m_maze != NULL)
		delete[] m_maze;
}//~Maze

//若迷宫m_maze中存在从入口start到出口end的通路,则求得一条路径
//存放在栈中(从栈底到栈顶),并返回true;否则返回false。通过路径为足迹(以路径上的序号表示)
bool Maze::MazePath(PosType start, PosType end)
{ 
	SqStack<DataType> path(MAXSIZE);   //创建栈
	PosType curpos;
	DataType e;
	curpos = start;
	int curstep = 1;  //当前足迹,初值为1
	do {
		if (m_maze[curpos.x][curpos.y] == 0) { //当前位置可以通过,即是未曾走到过的点
			m_maze[curpos.x][curpos.y]=curstep; //留下足迹,迷宫m_maze的curpos点变为序号curstep
			e.seat.x = curpos.x;
			e.seat.y = curpos.y;
			e.di = 0;
			path.Push(e); //入栈当前位置及方向
			curstep++; //足迹加1
			if(curpos.x == end.x && curpos.y == end.y) //到达终点(出口)
				return true;
			curpos = NextPos(curpos, e.di);
		}
		else { //当前位置不能通过
			if (!path.Empty()) {
				e = path.Top(); //退栈到前一位置
				path.Pop(); 
				curstep--;
				while (e.di == 3 && !path.Empty()) { //该位置已到最后一个方向(北)
					m_maze[e.seat.x][e.seat.y] = -1; //留下不能通过的标记(-1)
					e = path.Top();  //退回一步
					path.Pop(); 
					curstep--;
				}
				if (e.di < 3) { //没到最后一个方向(北)
					e.di++;   //换下一个方向探索
					path.Push(e);
					curstep++;
					curpos = NextPos(e.seat, e.di); //设定当前位置是该新方向上的相邻点
				}
			}
		}
	} while (!path.Empty());
	return false;
}//MazePath

//输入迷宫
void Maze::Input()
{
	int i, j;

	cout << "请输入" << m_row - 2 << "*" << m_col - 2 << "的迷宫:" << endl;
	for (i = 1; i <= m_row - 2; i++)
		for (j = 1; j <= m_col - 2; j++)
			cin >> m_maze[i][j];

	//周边设围墙,定义周边值为1(墙)
	for (i = 0; i < m_row; i++) { 
		m_maze[i][0] = 1; //行周边
		m_maze[i][m_col - 1] = 1;
	}
	for (j = 1; j < m_col - 1;j++) {
		m_maze[0][j] = 1; //列周边
		m_maze[m_row - 1][j] = 1;
	}
}//Input

//输出迷宫的解
void Maze::Print()
{
	int i,j;
	for (i = 1; i < m_row - 1; i++) {
		for (j = 1; j < m_col - 1; j++)
			if (m_maze[i][j] >= 0 && m_maze[i][j] < 10)  //输出对齐
				cout << "   " << m_maze[i][j] ;
			else
				cout << "  " << m_maze[i][j] ;
		cout << endl;
	}
}//Print

//根据当前点的位置c及移动方向d,返回下一位置,移动方向,依次为东南西北
PosType Maze::NextPos(PosType c, int d)
{ 
	PosType direct[4] = {{0,1}, {1,0}, {0,-1}, {-1,0}}; //{行增量,列增量}
	c.x += direct[d].x;
	c.y += direct[d].y;
	return c;
}//NextPos

int main()
{
	PosType begin, end;
	int m, n;
	cout << "请输入迷宫的行数,列数:";
	cin >> m >> n;
	Maze maze(m, n);
	maze.Input();
	cout << "请输入入口位置(行数,列数):" ;
	cin >> begin.x >> begin.y;
	cout << "请输入出口位置(行数,列数):";
	cin >> end.x >> end.y;
	if (maze.MazePath(begin,end)) { //求得一条通路
		cout << "此迷宫从入口到出口的一条路径如下:" << endl;
		maze.Print(); //输出此通路
	}
	else
		cout << "此迷宫没有从入口到出口的路径" << endl;
	system("pause");
	return 0;
}

/*
9 8 
0 0 1 0 0 0 1 0
0 0 1 0 0 0 1 0
0 0 0 0 1 1 0 1
0 1 1 1 0 0 1 0
0 0 0 1 0 0 0 0
0 1 0 0 0 1 0 1
0 1 1 1 1 0 0 1
1 1 0 0 0 1 0 1
1 1 0 0 0 0 0 0
*/


C++ 迷宫算法(迷宫老鼠)      题目:   迷宫是一个矩形区域,它有一个入口和一个出口。在迷宫的内部包含不能穿越的墙或障碍。在图5 - 8所示的迷宫中,障碍物沿着行和列放置,它们与迷宫的矩形边界平行。迷宫的入口在左上角,出口在右下角    以下是自己根据题目要求写的算法: 功能有:1 自动生成10*10迷宫图             2 判断是否有迷宫出口,并且画出路线图   /********** 阅读详情

相关推荐

JFET放大电路实例设计仿真

参照《晶体管电路设计》中的例子 JFET 2SK184 JFET 2SK184 数据手册如下 电路设计 共源放大 步骤:1、静态工作点 2N4416 1ma 2、RD和RS A=5 5:1 RS 2V /1m=2k RD 5k 3、偏压VG 根据传输特性 VGS-ID vgs=-0.7 vg=2-0.7=1.3 400k^2/50k...

f的博客 7441

EGE示例程序——迷宫

EGE专栏:EGE专栏 目录示例程序百度网盘(示例二 2048)优快云(示例二 2048)迷宫样式格子型围墙型分析存储形式迷宫生成功能移动查找路径路径显示/隐藏切换样式切换路径跟踪改变难度示例程序按F1查看帮助完整代码 示例程序 百度网盘(示例二 2048) 源代码分享于百度网盘,用到的资源也在里面,可以查看下载,双击EXE文件可直接运行: 优快云(示例二 2048) 有时我会作一些修改,...

依稀_yixy的博客 6102

ArduPilot 的 RTOS 选择:为何 ChibiOS 成为现代飞控的首选

本文深入探讨了ArduPilot选择ChibiOS作为现代飞控首选RTOS的原因。通过对比FreeRTOS和NuttX,ChibiOS凭借其50ns中断响应、1.2μs上下文切换时间和高效的资源管理脱颖而出,特别适合处理无人机飞控中的高频传感器融合和实时控制任务。文章还详细分析了ChibiOS在STM32硬件上的优化实践及其在无人机开发中的显著优势。

weixin_29161719的博客 570

数据结构(2)--用栈实现迷宫问题的求解

数据结构--用栈实现迷宫问题的求解目录问题概述程序思路代码实现过程反思 目录 问题概述 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 全新的界面设计 ,将会带来全新的写作体验; 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示; 增加了 图片拖拽 功能,你可以...

IRVINGOS的博客 4594

C# 上位机开发完全指南:从零开始构建工业控制系统

摘要: 本文详细介绍了使用C#开发工业自动化上位机系统的关键技术和方法。上位机作为工业控制的核心枢纽,负责与PLC、传感器等设备通信,实现数据采集、监控和控制。开发基于C#的上位机需掌握Windows Forms/WPF界面设计、Modbus/OPC等通信协议,以及SQL数据库存储。文章分步讲解了环境搭建、界面设计、设备通信(以Modbus和TCP/IP为例)、数据存储与展示等关键环节,并强调多线程优化与异常处理的重要性。通过C#和.NET技术栈,开发者能够构建高效稳定的工业控制系统,未来可扩展至云平台和物

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1018

rv1126 读取sensor输入,输出到屏幕显示【RK_MPI API接口】

rv1126 libdrm VO

学习记录 1万+

迷宫算法

<br /> 迷宫问题 1设计目的、要求 以一个m*n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。 基本要求: 首先实现一个以链表作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。求得的通路以三元组(i,j,d)的形式输出,其中:(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向,如:对于下列数据的迷宫,输出的一条通路为:(1,1,1),(1,2,2),(3,2,3),(3,1,2),…。 (1)编

Andrew Shaw|失的猛 1万+

三相电路小白必看:正弦量向量表示法保姆级教程(附欧拉公式推导)

本文为电气工程初学者详细解析了三相电路中正弦量的向量表示法,即相量法。通过几何直观和欧拉公式推导,阐明如何将时变正弦量转化为静态复平面向量进行运算,并利用平行四边形法则简化同频正弦量的加减计算。文章结合Python代码进行可视化验证,帮助读者牢固掌握这一分析交流电路的核心工具。

linux6sysadmin的博客 996

Maze

#include #include #define STACK_INIT_SIZE 10 #define STACK_INCREMENT 2 #define MAXLENGTH 25 #define OVERFLOW 0 #define FALSE 0 #define TRUE 1 #define ERROR -1 #define OK 1 typedef int MazeType[M

欢迎关注我的新浪微博:@挨踢实习生 907

Simulink仿真状态空间中状态变量时域响应

起因 今天老师留了一道关于状态空间变量响应的题,于是想用simulink仿真,一开始使用state-space模块,但是发现它只能输出y,没办法显示状态变量的变化情况。然而状态变量之间的关系都可以表示为一阶微分方程组,因此我们考虑在Simulink中搭建微分方程组来求解这个问题。 微分方程组 x1˙=x2x2˙=−4x1−5x2+1(1)\dot{x_1}=x_2\\ \dot{x_2}=-4x_...

ZYunfei的博客 7452

Plant Simulation 快速建模与布局(3)——自动生成的对象 代码“安全”删除管理

《PlantSimulation快速布局建模课程》教授利用SimTalk语言实现高效建模的技术要点,包括批量对象创建、阵列布局、属性管理及自动连接功能。重点讲解对象安全删除机制,通过existsObject检查对象存在性后使用deleteObject方法删除,避免程序报错。课程提供完整代码示例,展示如何通过循环结构实现矩阵布局对象的创建与安全删除,确保代码健壮性,显著提升建模效率。

qq_31964455的博客 119

11H:迷宫入口(dfs)

总时间限制:1000ms 内存限制:65536kB 描述 你现在身处一个R*C的迷宫中,你的位置用"S"表示,迷宫的出口用"E"表示。 迷宫中有一些石头,用"#"表示,还有一些可以随意走动的区域,用"."表示。 初始时间为0时,你站在地图中标记为"S"的位置上。你每移动一步(向上下左右方向移动)会花费一个单位时间。你必须一直保持移动,不能停留在原地不走。 当前时间是K的倍数时,迷宫中的石头就会消失,此时你可以走到这些位置上。在其余的时间里,你不能走到石头所在的位置。 求你从...

w112348的博客 982

YOLOv8 道路病害检测全栈工程|22 类路面裂缝坑洞 VOC&YOLO 数据集、PyQt 精美 GUI、ONNX 量化、全套训练评估曲线落地

城市道路、国省道、高速公路路面长期受车辆碾压、雨水侵蚀,衍生纵向 / 横向裂纹、坑洼、车辙、接缝剥落等二十余种路面病害。传统人工道路巡检存在致命行业痛点:人工徒步 / 乘车目视巡检效率极低,单日有效巡查里程不足 20 公里;毫米级细微线性裂纹肉眼极易漏检,雨水冲刷后微小病害快速扩张为大坑槽,养护成本翻倍;强光暴晒、阴雨积水、路面油污场景人工分辨难度大;海量巡检图片人工分类统计病害台账耗时数天,养护决策缺乏量化数据支撑。传统阈值、边缘检测图像处理仅能识别大面积坑洞,无法区分二十余种细分裂纹类型,泛化能力极差。

getusushu的博客 122

用C语言解决迷宫问题

迷宫问题是栈这一块很经典的问题。 迷宫大致可分为三种,简单迷宫、多通路迷宫:通路间不带环、多通路迷宫:通路间带环,其中带环多通路迷宫是最复杂的,解决它,要把栈与递归结合起来,下来我们来一个一个分析吧,先从简单迷宫开始。 简单迷宫 要解决这个问题并不难,我们只要从入口进入,当然要先检测这个入口是不是合法并且能不能走的通,如果走的通,把当前这一步的位置入栈,并且把它标记为2,然后继续向当前这...

Calm的博客 5万+

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

迷宫算法 之 迷宫生成和迷宫寻路

本文讲解迷宫生成和迷宫寻路算法。 //////////////////////////////////////////////////////////////////////////////////////////////////// 一、三种迷宫生成算法     1、 DFS(即深度优先)算法生成,分为递归和非递归方法。     2、 十字分割算法生成,分为递归和非递归方法。     3、随机 Prim 算法生成,一种非递归方法。 二、两种迷宫寻路算法     1、DFS 寻路,采用非...

Globalizationa的博客 5490

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

基于java的迷宫游戏

文章目录前言一,生成迷宫二,设置键盘响应及操作对象的移动三,A*算法走迷宫四,绘制迷宫结果图 前言 这个程序需要学习prime算法,A*算法。 一,生成迷宫 迷宫是一个布尔型二维数组mg,true代表有路,false代表有墙,并且我用的是prime算法生成,代码如下 //20x20的迷宫,false为有墙, boolean mg[][]=new boolean[20][20]; //随机创造迷宫 public boolean[][] createmg(boolean arr[][]){ //数组开

m0_50687157的博客 3370

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

迷宫问题

介绍 迷宫问题一般深度优先遍历或者广度优先遍历解决,辅助数据结构使用栈或者队列。使用栈解决该问题时,将栈顶能达到的一个位置入栈,若发现该路不通,则退栈,通过栈顶元素继续访问其他可达到的位置,直到走完整个迷宫。若使用非循环队列,将队头能到达的所有位置入队,并记录该位置的前驱为队头元素,最后通过队列的元素的前驱记录可得到整个迷宫的路线。 问题描述 ...

qq_25956141的博客 4826

迷宫问题,迷宫最优路径——(C语言)

定义一个二维数组 N*M ,如 5 × 5 数组下所示:它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从的路线。入口点为[0,0],既第一格是可以走的路。数据范围: 2≤n,m≤10 2≤n,m≤10 , 输入的内容只包含 0≤val≤1。

2401_83456040的博客 2781

迷宫求解--迷宫游戏课程设计

总结1. 实现的功能1.将迷宫通过可视化方法直观的显示出来,直观的显示路和墙的位置2.随机生成迷宫, 采用Prime算法生成随机迷宫,保证了迷宫的随机性3.玩家可以通过键盘上的方向键控制位置,直到走到终点4.DFS寻找答案, 当玩家无法不知道从哪走的时候可以通过DFS寻找路径5.BFS寻找答案, 当玩家无法不知道从哪走的时候也可以通过BFS寻找路径6.延时函数,直观的显示BFS和DFS的遍历过程7.清空答案,重新游玩2.遇到的问题1. Prime算法生成迷宫2. 迷宫可视化操作,不知道如何将图数组转化成可视

JdiLfc的博客 3049

java迷宫

学完java,需要做一个迷宫设计,我想着好不容易写出来了,也得记录一下。 一、迷宫生成 采用递归分割法随机生成迷宫地图,我们需要先确定迷宫的大小,高度和宽度必须是奇数。为了保证一行墙壁一行通路,大小只能是奇数。最外层墙壁不属于迷宫,是在给定高和宽基础上添加的两行两列。根据给定的高和宽生成一个初始迷宫,初始迷宫只是在没有任何阻碍的迷宫外侧添加一圈墙壁 在初始迷宫的基础上,随机选择一行和一列,将其置成墙壁,将迷宫分成独立的四部分。这里需要注意一点,为了满足一行墙壁一行通路的条件,我们需要在偶数行置墙壁(忽略外部

study_way的博客 1343

迷宫生成算法

迷宫生成算法、深度优先、随机普里姆、递归分割

Decayboy的博客 2552
下一篇: 回文判断
ktaurus
博客等级 码龄15年 1粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值