实现迷宫游戏的实验准备

实验内容


1、迷宫游戏是非常经典的游戏,在该题中要求随机生成一个迷宫,并求解迷宫;
2、要求查找并理解迷宫生成的算法,尝试用不同的算法来生成随机的迷宫。
3、要求游戏支持玩家走迷宫,和系统走迷宫路径两种模式。玩家走迷宫,通过键盘
方向键控制,并在行走路径上留下痕迹;系统走迷宫路径要求基于 A*算法实现,输
出走迷宫的最优路径并显示。设计交互友好的游戏图形界面。

编程语言以及开发环境的选择
和之前的项目一样,开发环境依然选用PyCharm,编程语言选用Python。

实验思路(游戏设计)


一、迷宫地图的生成
在这个项目中,迷宫生成我采用了深度优先算法。

1、准备工作
1)定义NODES[][]迷宫单元数组;
2)定义两个类变量row和column来表示迷宫地图的行列:
3)定义两个类变量myx和myy放置玩家起始位置;
4)定义一个列表parent放置已访问的坐标;
5)定义一个列表maze_map放置地图坐标;

2、初始化地图
1)NODES=Maze.LabId(初始化迷宫单元为新生成的对应地图,把Maze2类里面生成的地图传给NODES);
2)Node startNode = new Node(1, 1)(起点);Node endNode = new Node(19, 19)(终点);Node parent = findPath(startNode, endNode)(父节点);
3)将地图列表变为横向1和0间隔的列表;
4)将地图列表变为纵向1和0间隔的列表;
5)打通起点和终点的墙。

3、深度优先算法生成迷宫
1)设置当前通路单元坐标,并标记为已访问;
2)遍历四个方向的邻居通路单元(打乱方向列表,并对乱序的方向列表中的方向进行依次遍历):

若该邻居单元出界了,则跳过;
否则,打通当前通路单元和其邻居通路单元中间的墙,即将迷宫地图中的1变为0。
二、玩家走迷宫
1、键盘事件
重写keyPressEvent。
1)1、2、3、4分别代表上下左右,可由WSAD和上下左右键触发来改变方向值;
2)空格键触发更新迷宫地图。

2、玩家移动
方向值为1、2、3、4时,玩家分别向对应的方向移动(下一个位置的坐标在地图中的值必须为0,表示是通路),并调用绘制事件。
当玩家坐标等于终点坐标时,游戏结束,玩家胜利。

三、A*算法迷宫寻路
1、准备工作
1)定义待访问列表open_list,和已访问列表close_list;
2)定义一个节点类,以及标记节点的父节点以及F值的方法。

2、A*算法寻路
1)把玩家所在节点作为寻路起点,创建节点类的对象,加入open_list;
2)创建终点的节点类对象;
3)遍历open_list,直到当前节点为终点:

遍历open_list,将F值最小的节点作为当前节点;
从open_list中移除当前节点;
在close_list中放入当前节点;
若当前节点为终点,返回终点;否则:
① 找到所有邻居节点,并放入邻居节点列表;
② 遍历邻居节点,若非墙结点未超界、且不在close_list中:
a. 若该邻居节点不在open_list中,则将当前节点标记为该邻居节点的父节点,并计算、标记其F值,再将该邻居节点放入open_list;
b. 若该邻居节点在open_list中,则将它的G值与open_list中相同位置的节点的G值相比,取小的那一个。
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值