推箱子自动求解(java实现):广度搜索。

本文介绍了使用Java实现的推箱子游戏自动求解算法,主要采用广度优先搜索。作者详细阐述了算法设计、程序结构、数据结构以及优化尝试,同时分享了程序实现过程中遇到的问题和解决方案。程序已上传至GitHub,适用于小规模地图,但对于大型地图可能存在内存消耗过大的问题。
摘要由CSDN通过智能技术生成

首先:

算法思路完全来自博客:  推箱子游戏自动求解算法设计(四)https://blog.csdn.net/prsniper/article/details/44265537

以及参考了:推箱子游戏中AI的实现https://www.ixueshu.com/document/c8b6be6a31949cab318947a18e7f9386.html

箱子死锁的判断:

http://xueshu.baidu.com/swd=paperuri%3A%283774c5f1c2a5f03e548a6a29d62ec070%29&filter=sc_long_sign&tn=SE_xueshusource_2kduw22v&sc_vurl=http%3A%2F%2Fwww.docin.com%2Fp-1029714671.html&ie=utf-8&sc_us=5163338367532313513

GUI的图片来自:https://github.com/MoRanQingChen/pushBox

再次感谢博主 孤胆游侠 的分享讲解。

虽然原博已经有了详细的算法讲解,可我还是想写一个博客来记录我的完成过程。

前言:

本程序的实现效果:

操作:上下左右键移动,点击帮助按钮会自动寻路,点击选择关卡可以选关(只添加了5个关卡,喜欢可以按格式自己添加)。

(不过对于第5关(如图)的结果跑不出来,会抛出内存不够用的异常。不过如果

具有自动寻路功能的推箱子算法 使用A 寻路算法 效果并非最优 但是希望可以给大家一些启发 有问题或建议欢迎站内联系 或电邮chenc9410@gmail com 希望对大家学习人工智能或者C#有帮助 附:算法简介 忽略了小人的移动状态 以箱子的位置作为状态变量 在大多数情况下 通过仅仅移动小人可以达到的地图(状态)我们认为是相同的 当然 有时小人的状态不同但是箱子的位置相同时 也可能属于两种不同的状态 因此我规定了有效连通域的概念:在不移动箱子的情况下小人可以达到的位置都属于这个有效连通域 我们通过宽度优先搜索来处理一个原始的地图 来得到一个标记了有效连通域的地图(这两个地图绑定在一起) 我的方法本质上属于A 方法 评价函数的h n 指的是“不在位”的箱子个数(这个和“八数码”问题类似) 当然 由于有6种对应关系 我们需要计算然后取出最小的值作为h n 我们通过检查不在位的箱子个数是否为0来判断是否移动成功 如果成功我们通过记录在每一个状态中的它的前一个状态来获得正确的搜索路线 然后可以对每两个相邻的状态分别作为宽度优先搜索的起点和终点来获得小人的具体路线 ">具有自动寻路功能的推箱子算法 使用A 寻路算法 效果并非最优 但是希望可以给大家一些启发 有问题或建议欢迎站内联系 或电邮chenc9410@gmail com 希望对大家学习人工智能或者C#有帮助 附:算法简介 忽略了小人的移动 [更多]
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值