数据结构课设 迷宫游戏

合集下载

迷宫游戏数据结构课程设计

迷宫游戏数据结构课程设计

计算机解迷宫问题通常用的是“穷举求解”方法,即从入口出发,顺着某一个方向进行探索,若能走通,则继续往前进;否则沿着原路退回,换一个方向继续探索,直至出口位置,求得一条通路。

假如所有可能的通路都探索到而未能到达出口,则所设定的迷宫没有通路。

迷宫的入口点的下标为(1,1),出口点的下标为(m,n)。

为处理方便起见,可在迷宫的四周加一圈障碍。

对于迷宫的任一位置,均可约定有东、南、西、北四个方向可通。

有一种简单走出迷宫的方法,把手放在右边的墙上开始前进,始终不要把手从墙上移开。

如果迷宫向右拐,你也顺着墙向右拐。

只要不把手从墙上移开,最终就会到达迷宫的出口。

当然这样得到的路径可能不是一个最短的路径,但它可以最终得到结果,换句话说,这种方法走不出迷宫的风险是最小的。

本设计是为了实现一个可视化迷宫,以及利用最短路径算法寻找迷宫的出路以及将最短路径打印在屏幕上,并且限制小老鼠不能穿越墙,只能在路径上移动。

而且可以根据自己的需要设计迷宫地图。

关键词迷宫;栈;VC++ 6.0目录1 课设题目 (1)1.1课设题目 (1)1.2基本要求: (1)1.3 需求分析 (1)2 程序总体设计 (2)2.1流程图: (2)2.2概要设计 (6)2.3 运行结果及分析 (7)总结 (9)源程序 (10)参考文献 (20)1 课设题目1.1课设题目编写一个程序求解迷宫问题。

迷宫由m行n列的二维数组设置,0表示无障碍,1表示有障碍。

设入口为(1,1),出口为(m,n),每次只能从一个无障碍单元移到周围四个方向上任一无障碍单元。

编程实现对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。

算法输入:代表迷宫入口的坐标算法输出:穿过迷宫的结果。

算法要点:创建迷宫,试探法查找路径,输出解1.2基本要求:1.求得的通路以三元组(i,j,d)的形式输出,其中:(i,j)指示迷宫中的一个坐标,d表示走到下一个坐标的方向。

2.输出迷宫示意图1.3 需求分析1、本程序实现迷宫的探索过程. 以用户和计算机对话的方式,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令,然后程序就探索路径并输出路径。

数据结构课程设计之迷宫

数据结构课程设计之迷宫

数据结构课程设计之迷宫迷宫是一种具有迷惑性和挑战性的游戏。

在数据结构课程设计中,迷宫也常常被用作一个有趣而且实用的案例。

在这篇文章中,我将探讨迷宫的设计和实现,以及如何利用数据结构来解决迷宫问题。

首先,让我们来思考一下迷宫的基本要素。

一个典型的迷宫由迷宫的墙壁、通道和出口组成。

墙壁是迷宫的边界,通道是迷宫的路径,而出口则是通往自由的大门。

在数据结构中,我们可以使用二维数组来表示迷宫的结构。

迷宫的墙壁可以用1表示,通道可以用0表示,而出口可以用特殊的标记来表示。

接下来,我们需要考虑如何生成一个随机的迷宫。

一种常见的方法是使用深度优先搜索算法。

该算法从一个起始点开始,不断地随机选择一个相邻的未访问过的格子,然后将当前格子和选择的格子之间的墙壁打通。

这个过程一直进行,直到所有的格子都被访问过为止。

这样,我们就可以生成一个随机的迷宫结构。

在迷宫的设计中,一个关键的问题是如何找到从起点到终点的路径。

这可以通过使用图的搜索算法来解决。

其中,广度优先搜索算法是一种常用的方法。

该算法从起点开始,逐层地向外搜索,直到找到终点为止。

在搜索过程中,我们需要使用一个队列来保存待访问的格子,以及一个数组来记录每个格子的访问状态。

当找到终点时,我们可以通过回溯的方式,从终点一直追溯到起点,得到一条路径。

除了寻找路径,我们还可以通过其他方式来解决迷宫问题。

例如,我们可以计算迷宫中每个格子到终点的最短距离。

这可以通过使用动态规划的方法来实现。

我们可以先将所有格子的距离初始化为一个很大的值,然后从终点开始,逐步更新每个格子的距离,直到到达起点为止。

这样,我们就可以得到每个格子到终点的最短距离。

此外,我们还可以利用数据结构来解决其他与迷宫相关的问题。

例如,我们可以使用并查集来判断迷宫中的两个格子是否连通。

我们可以使用堆来找到迷宫中的最短路径。

我们还可以使用哈希表来记录迷宫中每个格子的属性,如是否有陷阱或宝藏等。

在数据结构课程设计中,迷宫是一个非常有趣和实用的案例。

迷宫游戏数据结构课程设计

迷宫游戏数据结构课程设计

迷宫游戏数据结构课程设计
1、简介
本文档旨在设计一个迷宫游戏的数据结构课程项目,通过使用合适的数据结构和算法,实现一个能够自动和解决迷宫的程序。

本项目将使用C++语言来实现。

2、功能需求
本项目的主要功能如下:
- 自动一个迷宫地图
- 实现玩家在迷宫地图中的移动
- 实现迷宫的解决算法
3、技术方案
本项目将采用以下技术方案来实现功能:
3.1 迷宫算法
为了一个随机的迷宫地图,我们将采用深度优先搜索(DFS)算法或者随机Prim算法来迷宫。

这些算法可以保证的迷宫是连通的且没有死胡同。

3.2 玩家移动
玩家将使用键盘输入来控制移动,通过获取键盘输入来实现玩
家在迷宫中的移动。

游戏将使用图形界面来呈现迷宫和玩家的位置。

3.3 迷宫解决算法
迷宫解决算法将使用广度优先搜索(BFS)算法或者深度优先搜
索(DFS)算法来搜索迷宫的路径。

该算法将从起点出发,逐步搜索
迷宫的每个可达点,直到找到终点或者遍历完整个迷宫。

4、开发计划
本项目的开发计划如下:
1、确定项目需求和技术方案 - 2天
2、实现迷宫算法 - 3天
3、实现玩家移动功能 - 2天
4、实现迷宫解决算法 - 3天
5、创建图形界面 - 2天
6、进行测试和调试 - 3天
7、完善文档和准备演示 - 2天
5、附件
本文档没有附件。

6、法律名词及注释
本文档没有涉及任何法律名词及注释。

(完整word版)数据结构课程设计(迷宫问题)

(完整word版)数据结构课程设计(迷宫问题)

课程设计报告课程名称数据结构课程设计课题名称迷宫问题专业班级学号姓名指导教师2012年6月9日课程设计任务书课程名称数据结构课程设计课题迷宫问题专业班级学生姓名学号指导老师审批任务书下达日期:2012年6月9日任务完成日期: 2012年6月16日一、设计内容与设计要求1.设计内容:1)问题描述以一个M*N的长方阵表示迷宫,0和1分别表示迷宫中的通路和墙壁。

设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出米有通路的结论。

2)基本要求a.实现一个以链表作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。

求得的通路以三元组(i,j,d)的形式输出,其中:(i,j)指示迷宫中的一个坐标,d表示走到下一个坐标的方向。

b。

编写递归形式的算法,求得迷宫中所有可能的通路。

3)测试数据迷宫的测试数据如下:左上角(1,1)为入口,右下角(8,9)为出口。

4)实现提示计算机解迷宫通常用的是“穷举求解”方法,即从入口出发,顺着某一个方向进行探索,若能走通,则继续往前进;否则,沿着原路退回,换一个方向继续探索,直至出口位置,求得一条通路。

假如所有可能的通路都探索到而未能到达出口,则设定的迷宫没有通路。

可以二维数组存储迷宫数据,通常设定入口点的下标为(1,1),出口点的下标为(m,n)。

为处理方便起见,可在迷宫的四周加一圈障碍。

对于迷宫中任一位置,均可约定有东、南、西、北四个方向可通.2.设计要求:●课程设计报告规范1)需求分析a.程序的功能.b.输入输出的要求。

2)概要设计a.程序由哪些模块组成以及模块之间的层次结构、各模块的调用关系;每个模块的功能。

b.课题涉及的数据结构和数据库结构;即要存储什么数据,这些数据是什么样的结构,它们之间有什么关系等。

3)详细设计a。

采用C语言定义相关的数据类型.b。

写出各模块的类C码算法.c.画出各函数的调用关系图、主要函数的流程图.4)调试分析以及设计体会a.测试数据:准备典型的测试数据和测试方案,包括正确的输入及输出结果和含有错误的输入及输出结果。

数据结构课程设计之迷宫游戏

数据结构课程设计之迷宫游戏

数据结构课程设计之迷宫游戏##大学数据结构课程设计报告题目: 走迷宫游戏院(系): 计算机工程学院学生姓名:班级: 学号:起迄日期: 2011-6-21 至 2011-6-30 指导教师:2010—2011年度第 2 学期一、需求分析1 问题描述走迷宫游戏程序开始运行时显示一个迷宫地图,迷宫中央有一只老鼠,迷宫的右下方有一个粮仓。

游戏的任务是使用键盘上的方向键操纵老鼠在规定的时间内走到粮仓处。

2 基本功能1) 老鼠形象可辨认,可用键盘操纵老鼠上下左右移动;2) 迷宫的墙足够结实,老鼠不能穿墙而过;3) 正确检测结果,若老鼠在规定时间内走到粮仓处,提示成功,否则提示失败;4) 添加编辑迷宫功能,可修改当前迷宫,修改内容:墙变路、路变墙;5) 找出走出迷宫的所有路径,以及最短路径。

利用序列化功能实现迷宫地图文件的存盘和读出等功能 3 输入输出输入为字符型:1, 2, 3 分别实现功能选择w(上),s(下),a(左),d(右)控制迷宫的走向y表示确定 n表示否定二、概要设计1. 设计思路:实现走迷宫game()对迷宫地图进行修改实现自动搜路change()Mathpath()对搜寻的路径进行输对修改的地图数组进行保存出edit()print()对修改的地图进行保存savemap()2.数据结构设计:采用的是栈来存储数据,进栈实际是在栈中插入三元组,出栈则只数组的个数进行操作抽象数据类型线性表的定义如下:ADT SqStack{数据对象:D={a| a ?SElemType,i=1,2,3……,n,n?0} ii数据关系:R1={<a,a>| a,a ?D,i=1,2,3,……,n} i-1ii-1i基本操作:SqStack *InitStack()操作结果:创建一个空栈void Push(SqStack *S,SElemType data)初始条件:栈S已存在操作结果:插入一个元素,并且使数据个数加一(top++)void Pop(SqStack *S)初始条件:栈S已存在。

c迷宫游戏课程设计

c迷宫游戏课程设计

c迷宫游戏课程设计一、课程目标知识目标:1. 让学生掌握迷宫游戏的规则与基本概念,理解坐标和方向在迷宫中的作用。

2. 学会运用算法设计并实现迷宫的路径搜索,理解递归与迭代在迷宫问题中的应用。

3. 了解计算机编程中常用的数据结构,如列表和栈,并运用到迷宫游戏中。

技能目标:1. 培养学生运用计算机编程解决问题的能力,通过编写迷宫游戏代码,提高逻辑思维和编程技巧。

2. 培养学生的团队协作能力,学会在小组合作中共同分析问题、解决问题。

3. 提高学生动手实践能力,通过实际操作,熟练使用编程工具和调试技巧。

情感态度价值观目标:1. 培养学生对计算机科学的兴趣,激发学习编程的热情,提高自信心。

2. 培养学生面对问题时的耐心和毅力,勇于克服困难,善于寻求解决方案。

3. 增强学生的创新意识,鼓励学生在编程过程中发挥想象,创造出独特的迷宫游戏。

本课程针对的学生特点为具有一定的编程基础和逻辑思维能力,对计算机科学感兴趣。

课程性质为实践性较强的学科,注重培养学生的动手能力和团队协作能力。

在教学过程中,要求教师关注学生的学习进度,及时调整教学策略,确保学生能够达到预设的课程目标。

通过本课程的学习,学生将能够独立设计并实现迷宫游戏,提高编程技能,培养良好的学习态度和价值观。

二、教学内容本章节教学内容紧密结合课程目标,依据教材中关于算法与编程的相关章节展开。

主要内容包括:1. 迷宫游戏基础知识:介绍迷宫游戏的基本概念、规则以及构成元素,如墙壁、路径、起点和终点等。

2. 坐标与方向:讲解坐标和方向在迷宫问题中的表示方法,如何用二维数组表示迷宫,以及方向数组的使用。

3. 算法原理:详细阐述深度优先搜索(DFS)和广度优先搜索(BFS)算法在迷宫路径搜索中的应用,以及递归与迭代的实现方法。

4. 数据结构:介绍列表和栈在迷宫游戏中的运用,如何存储路径和回溯过程。

5. 编程实践:指导学生运用所学知识,使用编程工具编写迷宫游戏的代码,实现路径搜索和游戏运行。

数据结构课程设计之迷宫游戏

数据结构课程设计之迷宫游戏

数据结构课程设计之迷宫游戏##大学数据结构课程设计报告题目: 走迷宫游戏院(系): 计算机工程学院学生姓名:班级: 学号:起迄日期: 2011-6-21 至 2011-6-30 指导教师:2010—2011年度第 2 学期一、需求分析1 问题描述走迷宫游戏程序开始运行时显示一个迷宫地图,迷宫中央有一只老鼠,迷宫的右下方有一个粮仓。

游戏的任务是使用键盘上的方向键操纵老鼠在规定的时间内走到粮仓处。

2 基本功能1) 老鼠形象可辨认,可用键盘操纵老鼠上下左右移动;2) 迷宫的墙足够结实,老鼠不能穿墙而过;3) 正确检测结果,若老鼠在规定时间内走到粮仓处,提示成功,否则提示失败;4) 添加编辑迷宫功能,可修改当前迷宫,修改内容:墙变路、路变墙;5) 找出走出迷宫的所有路径,以及最短路径。

利用序列化功能实现迷宫地图文件的存盘和读出等功能 3 输入输出输入为字符型:1, 2, 3 分别实现功能选择w(上),s(下),a(左),d(右)控制迷宫的走向y表示确定 n表示否定二、概要设计1. 设计思路:实现走迷宫game()对迷宫地图进行修改实现自动搜路change()Mathpath()对搜寻的路径进行输对修改的地图数组进行保存出edit()print()对修改的地图进行保存savemap()2.数据结构设计:采用的是栈来存储数据,进栈实际是在栈中插入三元组,出栈则只数组的个数进行操作抽象数据类型线性表的定义如下:ADT SqStack{数据对象:D={a| a ?SElemType,i=1,2,3……,n,n?0} ii数据关系:R1={<a,a>| a,a ?D,i=1,2,3,……,n} i-1ii-1i基本操作:SqStack *InitStack()操作结果:创建一个空栈void Push(SqStack *S,SElemType data)初始条件:栈S已存在操作结果:插入一个元素,并且使数据个数加一(top++)void Pop(SqStack *S)初始条件:栈S已存在。

java迷宫小游戏的课程设计

java迷宫小游戏的课程设计

java迷宫小游戏的课程设计一、课程目标知识目标:1. 理解Java基本语法,掌握面向对象编程的基本概念;2. 学会使用数组管理迷宫地图数据;3. 掌握使用条件语句和循环结构控制程序流程;4. 了解二维数组在图形界面表示中的应用。

技能目标:1. 能够设计并实现一个简单的迷宫小游戏;2. 能够运用所学知识解决迷宫路径查找问题;3. 能够编写清晰、简洁、高效的代码,具有良好的编程习惯;4. 能够在团队协作中发挥自己的作用,与他人共同完成项目。

情感态度价值观目标:1. 培养学生对编程的兴趣,激发学习积极性;2. 培养学生的逻辑思维能力和解决问题的能力;3. 培养学生团队协作精神,学会共同解决问题;4. 引导学生认识到编程在现实生活中的应用,提高对信息技术的认识。

本课程针对高年级学生,已具备一定的编程基础,通过设计Java迷宫小游戏,将所学知识应用于实际项目中,提高学生的编程实践能力。

课程注重培养学生的逻辑思维、团队协作和创新能力,使学生在完成项目的过程中,掌握Java编程技巧,提升解决实际问题的能力。

课程目标分解为具体学习成果,便于后续教学设计和评估。

二、教学内容1. 迷宫游戏基本概念与设计思路- 迷宫地图的数据结构设计- 迷宫路径查找算法简介2. Java编程基础- 面向对象编程基本概念- 类与对象的关系- 数组的使用3. 迷宫游戏的实现- 创建迷宫地图的二维数组表示- 实现玩家移动与迷宫路径查找- 游戏界面与用户交互设计4. 编程实践与团队协作- 代码编写规范与调试技巧- 团队协作分工与项目进度管理- 项目展示与评价教学内容依据课程目标,结合课本章节,系统地组织与安排。

教学大纲包括以下部分:1. 导入与基础知识回顾(1课时)- 复习面向对象编程基本概念- 引入迷宫游戏,激发学生兴趣2. 迷宫游戏设计与实现(3课时)- 讲解迷宫地图数据结构设计- 指导学生编写代码实现迷宫游戏3. 编程实践与团队协作(3课时)- 学生分组进行编程实践- 教师辅导,解答学生疑问4. 项目展示与评价(1课时)- 学生展示迷宫游戏项目- 教师与学生共同评价,总结经验教训教学内容科学系统,注重理论与实践相结合,引导学生通过实际操作掌握Java 编程技巧,提高解决实际问题的能力。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构课程设计设计题目:迷宫旅行游戏目录一、课程设计题目 (1)二、需求分析 (1)三、测试数据 (1)四、概要设计 (1)五、调用关系图 (2)六、程序代码 (2)七、测试结果 (11)八、心得体会及总结 (12)数据结构课程设计一、课程设计题目迷宫旅行游戏二、需求分析1、迷宫旅行游戏的功能是:1.1 自动生成迷宫;1.2 找出离开迷宫的路线;1.3 用键盘控制角色走迷宫;1.4 游戏结束可选择重新生成一局;2、设计思路:用Java语言实现游戏编程。

用Prim算法生成迷宫,用深度优先搜索找到离开迷宫的路线,在JPanel画迷宫,然后挂载到JFrame;3、设计思路分析:3.1 Java的GUI图形界面较容易实现;3.2 JPanel() 创建具有双缓冲和流布局的新 JPanel。

因为需要经常更新角色在迷宫的位置,画面会有卡顿现象,因此用JPanel 就可以解决UI更新问题 ;三、测试数据boolean map[][]=new PMap().prim(0, 0, 20, 19, true)PaintMap p=new PaintMap(map,new EMap(map).exitmap())四、概要设计PMap类:随机Prim算法实现用于生成迷宫public boolean[][] prim(int startX,int startY,int widthLimit,int heightLimit,boolean haveBorder)EMap类:DSF算法实现用于求解离开迷宫路线算法实现方法:private void dfs(int x,int y,int c)离开迷宫实现方法:public ArrayList<Integer> exitmap()判断边界方法:private boolean ise(int dx,int dy)PaintMap类:绘制迷宫,实现角色移动更新画迷宫方法:public void paint(Graphics g)向上移动方法:public void moveUp()向下移动方法:public void moveDown()向左移动方法:public void moveLeft()向右移动方法:public void moveRight()空格按下显示路线方法:public void PressSp()判断边界方法:private boolean IsEdge(int x,int y)判断胜利方法:private void Win(int x,int y)Text类:主函数类键盘监听回调方法:public void keyPressed(KeyEvent key)五、调用关系图六、程序代码package kcsj;import java.util.ArrayList;import javax.swing.JPanel;@SuppressWarnings("serial")/*让迷宫全都是墙.。

选一个格,作为迷宫的通路,然后把它的邻墙放入列表。

当列表里还有墙时:从列表里随机选一个墙,如果它对面的格子不是迷宫的通路:把墙打通,让对面的格子成为迷宫的通路。

把那个格子的邻墙加入列表。

如果对面的格子已经是通路了,那就从列表里移除这面墙。

*/public class PMap extends JPanel {public boolean[][] prim(int startX,int startY,int widthLimit,int heightLimit,boolean haveBorder){final boolean block=false,unblock=true;if(widthLimit<1)widthLimit=1;if(heightLimit<1)heightLimit=1;if(startX<0||startX>=widthLimit)startX=(int)Math.round(Math.random()*(widthLimit-1));if(startY<0||startY>=heightLimit)startY=(int)Math.round(Math.random()*(heightLimit-1));if(!haveBorder) {--widthLimit;--heightLimit;}//迷宫尺寸换算成带墙尺寸widthLimit*=2;heightLimit*=2;//迷宫起点换算成带墙起点startX*=2;startY*=2;if(haveBorder) {++startX;++startY;}//初始化迷宫boolean[][]mazeMap=new boolean [widthLimit+1][heightLimit+1]; for(int i=0;i<=widthLimit;i++)for(int j=0;j<=heightLimit;j++)mazeMap[i][j]=block;mazeMap[0][1]=unblock;//入口mazeMap[widthLimit][heightLimit-1]=unblock;//出口ArrayList<Integer> blockPos = new ArrayList<Integer>();int targetX=startX,targetY=startY;mazeMap[targetX][targetY]=unblock;if(targetY>1) {blockPos.add(targetX);blockPos.add(targetY-1);blockPos.add(0); }if (targetX < widthLimit){blockPos.add(targetX+1);blockPos.add(targetY);blockPos.add(1); }if (targetY < heightLimit){blockPos.add(targetX);blockPos.add(targetY+1);blockPos.add(2);}if (targetX > 1){blockPos.add(targetX-1);blockPos.add(targetY);blockPos.add(3);}while(!blockPos.isEmpty()) {int blockIndex=(int)Math.round(Math.random()*(blockPos.size()/3-1))*3;if(blockIndex+2<blockPos.size()) {if(blockPos.get(blockIndex+2).equals(0)) {targetX= blockPos.get(blockIndex);targetY= blockPos.get(blockIndex+1)-1;}else if(blockPos.get(blockIndex+2).equals(1)) {targetX= blockPos.get(blockIndex)+1;targetY= blockPos.get(blockIndex+1);}else if(blockPos.get(blockIndex+2).equals(2)) {targetX= blockPos.get(blockIndex);targetY= blockPos.get(blockIndex+1)+1;}else if(blockPos.get(blockIndex+2).equals(3)) {targetX= blockPos.get(blockIndex)-1;targetY= blockPos.get(blockIndex+1);}}if(mazeMap[targetX][targetY]==block) {//打通墙if(blockIndex+1<blockPos.size())mazeMap[blockPos.get(blockIndex)][blockPos.get(blockIndex+1)]=unblock;elseSystem.out.println("error");mazeMap[targetX][targetY]=unblock;//添加当前目标的邻墙if (targetY > 1 && mazeMap[targetX][targetY -1] == block && mazeMap[targetX][targetY - 2] == block){blockPos.add(targetX);blockPos.add(targetY-1);blockPos.add(0);}if (targetX < widthLimit -1&& mazeMap[targetX + 1][targetY] == block && mazeMap[targetX + 2][targetY] == block){blockPos.add(targetX+1);blockPos.add(targetY);blockPos.add(1);}if (targetY < heightLimit-1 && mazeMap[targetX][targetY + 1] == block && mazeMap[targetX][targetY + 2] == block){blockPos.add(targetX);blockPos.add(targetY+1);blockPos.add(2);}if (targetX > 1 && mazeMap[targetX -1][targetY] == block && mazeMap[targetX - 1][targetY] == block){blockPos.add(targetX-1);blockPos.add(targetY);blockPos.add(3);}}for(int l=blockIndex,k=0;k<3;k++) {blockPos.remove(l);}}return mazeMap;}}package kcsj;import java.util.ArrayList;public class EMap {private ArrayList<Integer> blockPos = new ArrayList<Integer>();private int d[][]= {{0,-1},{1,0},{0,1},{-1,0}};private boolean a[][];private int width;private int height;private boolean fl=false;public EMap(boolean b[][]) {width=(b.length-1)/2;height=(b[0].length-1)/2;a=new boolean [b.length][b[0].length];for(int i=0;i<b.length;i++)for(int j=0;j<b[0].length;j++)a[i][j]=b[i][j];}private void dfs(int x,int y,int c) {if(x==(width*2)&&y==(height*2-1)) {fl=true;return ;}for(int i=0;i<4;i++) {if(c==i)continue;int dx=x+d[i][0];int dy=y+d[i][1];if(ise(dx,dy)&&a[dx][dy]) {if(fl)break;blockPos.add(dx);blockPos.add(dy);a[dx][dy]=false;dfs(dx,dy,(i+2)%4);}}if(!fl) {blockPos.remove(blockPos.size()-1);blockPos.remove(blockPos.size()-1);}}@SuppressWarnings("unused")public ArrayList<Integer> exitmap() {blockPos.add(0);blockPos.add(1);//初始位置dfs(0,1,3);return blockPos;}private boolean ise(int dx,int dy) {return (0 <= dx && dx <= width*2 && 0 <= dy && dy <= height*2);}}package kcsj;import java.awt.Color;import java.awt.Graphics;import java.util.ArrayList;import javax.swing.JOptionPane;import javax.swing.JPanel;@SuppressWarnings("serial")public class PaintMap extends JPanel{final int unitSize =10;private int width;private int height;private int startX;private int startY;private boolean block;private boolean b[][];private boolean IsDisplay;private ArrayList<Integer> ToExit = new ArrayList<Integer>();public PaintMap(boolean b[][],ArrayList<Integer>a) {ToExit=a;this.b=b;width=b.length;height=b[0].length;startX=0; //初始位置startY=1;block=true;IsDisplay=false;}public void paint(Graphics g) {//墙的颜色g.setColor(Color.green);for(int i=0;i<width;i++)for(int j=0;j<height;j++)if(!b[i][j])g.fill3DRect(30+i*unitSize, 30+j*unitSize, unitSize, unitSize, true);//出口路线颜色if(IsDisplay) {g.setColor(Color.red);for(int i=0;i<ToExit.size();i+=2) {g.fill3DRect(30+ToExit.get(i)*unitSize, 30+ToExit.get(i+1)*unitSize, unitSize, unitSize, true);}}//控制格子颜色g.setColor(Color.yellow);if(IsEdge(startX, startY)) {g.fill3DRect(30+startX*unitSize, 30+startY*unitSize, unitSize, unitSize, true);}elseg.fill3DRect(30+unitSize,30, unitSize, unitSize, true);}public void moveUp() {startY-=1;if(IsEdge(startX, startY)) {if(!b[startX][startY]) {block=false;startY+=1;}if(block)repaint();elseblock=true;Win(startX,startY);}elsestartY+=1;}public void moveDown() {startY+=1;if(IsEdge(startX, startY)) {if(!b[startX][startY]) {block=false;startY-=1;}if(block)repaint();elseblock=true;Win(startX,startY);}elsestartY-=1;}public void moveLeft() {startX-=1;if(IsEdge(startX, startY)) {if(!b[startX][startY]) {block=false;startX+=1;}if(block)repaint();elseblock=true;Win(startX,startY);}elsestartX+=1;}public void moveRight() {startX+=1;if(IsEdge(startX, startY)) {if(!b[startX][startY]) {block=false;startX-=1;}if(block)repaint();elseblock=true;Win(startX,startY);}elsestartX-=1;}public void PressSp() {if(IsDisplay)IsDisplay=false;elseIsDisplay=true;repaint();}private boolean IsEdge(int x,int y) {return (x<width&&y<height&&x>=0&&y>=0) ;}private void Win(int x,int y) {if(x==width-1&&y==height-2) {Object[] options = {"再来一局","退出"};int response=JOptionPane.showOptionDialog ( this, "出来了","Game Over",JOptionPane.YES_OPTION ,JOptionPane.PLAIN_MESSAGE, null,options, options[0] ) ;if (response == 0){b=new PMap().prim(0, 0, (width-1)/2,(height-1)/2, true);ToExit=new EMap(b).exitmap();startX=0;startY=1;block=true;IsDisplay=false;repaint();}elseSystem.exit(0);}}}package kcsj;import java.awt.EventQueue;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import javax.swing.JFrame;@SuppressWarnings("serial")public class Test extends JFrame implements ActionListener ,KeyListener{ boolean map[][]=new PMap().prim(10, 20, 20, 19, true);PaintMap p=new PaintMap(map,new EMap(map).exitmap());public Test() {this.setTitle("Prim迷宫");this.add(p);this.setSize(500,500);this.setVisible(true);this.setLocationRelativeTo(null);addKeyListener(this);//监听键盘}public static void main(String[] args) {//Swing 不是线程安全的。

相关文档
最新文档