- 浏览: 613567 次
- 来自: ...
-
文章分类
最新评论
-
lgh1992314:
相同的元素呢
一种离散化方法 -
HelloSummerR:
圆心的位置是随机的,于是圆的部分会落到canvas外,那样就显 ...
HTML5 Canvas学习笔记(1)处理鼠标事件 -
hlstudio:
好久没见到sokuban了,这有个java版的,带源码,可以参 ...
求推箱子的最小步数(java) -
肖泽文:
太好了,谢谢你。。有中文注释!
HTML5 推箱子游戏过关演示动画 -
swm8023:
删除操作,将最后一个叶子节点插入后也有可能上浮吧
彻底弄懂最大堆的四种操作(图解+程序)(JAVA)
用JS写了一个“广度优先搜索法”自动推箱子,理论上无论多少箱子都可以求解,但事实上箱子多了以后,就。。。;
有需要的拿出发挥,修改,高手就可以跳过了。。。
代码随后给出,先看运行效果:
第一关:http://www.108js.com/article/article5/zip/50059/Test-1.html
第四关:http://www.108js.com/article/article5/zip/50059/Test-4.html
第五关:http://www.108js.com/article/article5/zip/50059/Test-5.html
欢迎访问博主的网站:http://www.108js.com
效果图:
上图是最初状态:S代表推箱子的人,#表示墙,有五个箱子B要推到目标点T,其中有一个箱子已经到了目标点,用Y表示。
下图是程序最后给出的解答:
R,D,L,U 表示箱子向某个方向移动
r,d,l,u 表示人向某个方向移动
代码分两部分:
第一部分:Storehouse.js
/*仓库类,表示推箱子过程中的一种状态*/
(function(){
function Storehouse(playerPos,map,parent,path,step){
this.playerPos=playerPos;//人的位置
this.map=map;//地图
this.parent=parent;//父状态
this.path=path;//从最初状态来到此状态的路径
this.step=step; //来到此状态的步数
}
//获取人的位置
Storehouse.prototype.getPlayerPos=function() {
return this.playerPos;
}
//获取地图
Storehouse.prototype.getMap=function() {
return this.map;
}
//获取路径
Storehouse.prototype.getPath=function() {
return this.path;
}
//获取步数
Storehouse.prototype.getStep=function() {
return this.step;
}
Storehouse.prototype.getBoxList=function() {//获取此状态中的所有箱子
var boxlist=[];
for(var i=0;i<this.map.length;i++){
for(var j=0;j<this.map[i].length;j++){
if (this.map[i][j] == 'B'||this.map[i][j]=="Y")//箱子在目标上
boxlist.push({x:i,y:j});//箱子坐标
}
}
return boxlist.sort(order);
}
//位置是否越界http://www.108js.com
Storehouse.prototype.isOk=function(pos){
if(pos.x<0||pos.x>=map.length) return false;
if(pos.y<0||pos.y>=map[0].length) return false;
return true;
}
Storehouse.prototype.getEndList=function() {//获取此状态中的所有目标点
var endlist=[];
for(var i=0;i<this.map.length;i++){
for(var j=0;j<this.map[i].length;j++){
if (this.map[i][j] == "T"||this.map[i][j]=="Y"||this.map[i][j]=="Z")//箱子在目标上,人在目标点
endlist.push({x:i,y:j});//目标坐标
}
}
return endlist.sort(order);
//return endlist;
}
//剪枝函数,玩家的阻碍点,箱子的死点,用递归进行分析http://www.108js.com
Storehouse.prototype.isBlock=function(array,row,col) {
var b=false;
if ((this.map[row][col] == '.') || (this.map[row][col]=="T")||this.map[row][col]=="S"){
b=false;
}else if ((this.map[row][col] == '#') || contains(array,{x:row,y:col})!=-1) {
b = true;
array.push({x:row,y:col});
} else if (this.map[row][col]=="B") {
array.push({x:row,y:col});
b = (((this.isBlock(array, row + 1, col) || this.isBlock(array, row - 1, col))
&& (this.isBlock(array, row, col + 1) || this.isBlock(array, row, col - 1))));
if (!b) {
var index=contains(array,{x:row,y:col});
array.splice(index,1);
}
}
return b;
}
Storehouse.prototype.toString=function(){
var s="";
for(var i=0,lenx=this.map.length;i<lenx;i++){
s=s+this.map[i].join(" ")+"<br>";
}
return s;
}
Storehouse.prototype.isWin=function() {//是否赢了,比较此状态中的所有箱子和目标点
var boxl=this.getBoxList();
var endl=this.getEndList();
for (var i = 0; i < boxl.length; i++) {
if ((boxl[i].x !=endl[i].x)||(boxl[i].y!=endl[i].y))
return false;
}
return true;
}
//比较两个状态是否相等
Storehouse.prototype.equals=function(other){
if((this.playerPos.x!=other.playerPos.x)||(this.playerPos.y!=other.playerPos.y))
return false;
for(var i=0;i<this.map.length;i++){
for(var j=0;j<this.map[i].length;j++){
if (this.map[i][j] !=other.map[i][j])
return false;
}
}
return true;
}
//判断数组是否包含某一点
function contains(arr,p){
for(var i=0,len=arr.length;i<len;i++){
if(arr[i].x==p.x&&arr[i].y==p.y)
return i;
}
return -1;
}
//箱子排序函数
function order(s1,s2){
if (s1.x > s2.x){
return 1;
}
else if (s1.x == s2.x) { //在同一行,比较列
if (s1.y>s2.y) {
return 1;
}else if(s1.y==s2.y){
return 0;
}else
return -1;
}else
return -1;
}
window.Storehouse=Storehouse;
})()
请继续阅下文:javaScript 广度优先搜索法"自动推箱子"(二)http://128kj.iteye.com/blog/2078631
有需要的拿出发挥,修改,高手就可以跳过了。。。
代码随后给出,先看运行效果:
第一关:http://www.108js.com/article/article5/zip/50059/Test-1.html
第四关:http://www.108js.com/article/article5/zip/50059/Test-4.html
第五关:http://www.108js.com/article/article5/zip/50059/Test-5.html
欢迎访问博主的网站:http://www.108js.com
效果图:

上图是最初状态:S代表推箱子的人,#表示墙,有五个箱子B要推到目标点T,其中有一个箱子已经到了目标点,用Y表示。
下图是程序最后给出的解答:
R,D,L,U 表示箱子向某个方向移动
r,d,l,u 表示人向某个方向移动
代码分两部分:
第一部分:Storehouse.js
/*仓库类,表示推箱子过程中的一种状态*/
(function(){
function Storehouse(playerPos,map,parent,path,step){
this.playerPos=playerPos;//人的位置
this.map=map;//地图
this.parent=parent;//父状态
this.path=path;//从最初状态来到此状态的路径
this.step=step; //来到此状态的步数
}
//获取人的位置
Storehouse.prototype.getPlayerPos=function() {
return this.playerPos;
}
//获取地图
Storehouse.prototype.getMap=function() {
return this.map;
}
//获取路径
Storehouse.prototype.getPath=function() {
return this.path;
}
//获取步数
Storehouse.prototype.getStep=function() {
return this.step;
}
Storehouse.prototype.getBoxList=function() {//获取此状态中的所有箱子
var boxlist=[];
for(var i=0;i<this.map.length;i++){
for(var j=0;j<this.map[i].length;j++){
if (this.map[i][j] == 'B'||this.map[i][j]=="Y")//箱子在目标上
boxlist.push({x:i,y:j});//箱子坐标
}
}
return boxlist.sort(order);
}
//位置是否越界http://www.108js.com
Storehouse.prototype.isOk=function(pos){
if(pos.x<0||pos.x>=map.length) return false;
if(pos.y<0||pos.y>=map[0].length) return false;
return true;
}
Storehouse.prototype.getEndList=function() {//获取此状态中的所有目标点
var endlist=[];
for(var i=0;i<this.map.length;i++){
for(var j=0;j<this.map[i].length;j++){
if (this.map[i][j] == "T"||this.map[i][j]=="Y"||this.map[i][j]=="Z")//箱子在目标上,人在目标点
endlist.push({x:i,y:j});//目标坐标
}
}
return endlist.sort(order);
//return endlist;
}
//剪枝函数,玩家的阻碍点,箱子的死点,用递归进行分析http://www.108js.com
Storehouse.prototype.isBlock=function(array,row,col) {
var b=false;
if ((this.map[row][col] == '.') || (this.map[row][col]=="T")||this.map[row][col]=="S"){
b=false;
}else if ((this.map[row][col] == '#') || contains(array,{x:row,y:col})!=-1) {
b = true;
array.push({x:row,y:col});
} else if (this.map[row][col]=="B") {
array.push({x:row,y:col});
b = (((this.isBlock(array, row + 1, col) || this.isBlock(array, row - 1, col))
&& (this.isBlock(array, row, col + 1) || this.isBlock(array, row, col - 1))));
if (!b) {
var index=contains(array,{x:row,y:col});
array.splice(index,1);
}
}
return b;
}
Storehouse.prototype.toString=function(){
var s="";
for(var i=0,lenx=this.map.length;i<lenx;i++){
s=s+this.map[i].join(" ")+"<br>";
}
return s;
}
Storehouse.prototype.isWin=function() {//是否赢了,比较此状态中的所有箱子和目标点
var boxl=this.getBoxList();
var endl=this.getEndList();
for (var i = 0; i < boxl.length; i++) {
if ((boxl[i].x !=endl[i].x)||(boxl[i].y!=endl[i].y))
return false;
}
return true;
}
//比较两个状态是否相等
Storehouse.prototype.equals=function(other){
if((this.playerPos.x!=other.playerPos.x)||(this.playerPos.y!=other.playerPos.y))
return false;
for(var i=0;i<this.map.length;i++){
for(var j=0;j<this.map[i].length;j++){
if (this.map[i][j] !=other.map[i][j])
return false;
}
}
return true;
}
//判断数组是否包含某一点
function contains(arr,p){
for(var i=0,len=arr.length;i<len;i++){
if(arr[i].x==p.x&&arr[i].y==p.y)
return i;
}
return -1;
}
//箱子排序函数
function order(s1,s2){
if (s1.x > s2.x){
return 1;
}
else if (s1.x == s2.x) { //在同一行,比较列
if (s1.y>s2.y) {
return 1;
}else if(s1.y==s2.y){
return 0;
}else
return -1;
}else
return -1;
}
window.Storehouse=Storehouse;
})()
请继续阅下文:javaScript 广度优先搜索法"自动推箱子"(二)http://128kj.iteye.com/blog/2078631
发表评论
-
HTML5 Canvas 旋转的“金字塔”
2015-12-24 13:25 10153效果图: 效果链接:http://www.108js.co ... -
HTML5 canvas 飘扬的五星红旗
2015-12-21 08:56 2556效果图: 效果链接: http://www.108js.co ... -
简单HTML5 Canvas Arrow旋转动画
2015-05-22 08:38 13004效果图: 效果链接: http://www.108js.c ... -
HTML5 Canvas简单透明文字动画
2015-05-22 08:17 7493效果图: 效果链接: http://www.108js.c ... -
一个非常好的HTML5 Canvas焰火效果
2014-12-28 15:56 1650效果图: 点击观看效果:http://www.108js. ... -
《HTML5 Canvas学习笔记(10)》数钱数到手抽筋
2014-12-21 14:01 3338网上看到一个游戏《数钱数到手抽筋》简单的模仿一下。 鼠标拖动或 ... -
HTML5 Canvas学习笔记(9)俄罗斯方块游戏之三(游戏面板)
2014-07-05 07:13 1430接上一遍《HTML5 Canvas学习笔记(8)俄罗斯方块游戏 ... -
HTML5 Canvas学习笔记(8)俄罗斯方块游戏之二(方块)
2014-07-04 13:08 1760接上一遍《HTML5 Canvas学习笔记(7)俄罗斯方块游戏 ... -
HTML5 Canvas学习笔记(7)俄罗斯方块游戏之一(色块)
2014-07-04 10:53 2449在网上看到一个俄罗斯方块游戏: http://www.108j ... -
HTML5 Canvas学习笔记(6)拼图游戏(数字版)
2014-06-28 17:38 2622今天网上发现了一段代码,只有界面,很不错,学习了并完成了逻辑。 ... -
HTML5 Canvas学习笔记(5)游戏得分动画
2014-06-26 17:11 1151效果图: 点击查看效果: http://www.108js ... -
HTML5 Canvas学习笔记(4)游戏界面的淡入淡出
2014-06-26 11:26 2030效果图: 点击看效果: http://www.108js. ... -
HTML5 Canvas学习笔记(3)加载游戏/动画音乐
2014-06-25 11:20 1729先要准备应付各种浏览器的声音文件,什么.mp3,.ogg ... -
HTML5 Canvas学习笔记(2)菜单高亮显示与像素字体
2014-06-23 23:13 2039看到哪,学到哪,记到哪。见谅,这些笔记就没有顺序和知识上的连贯 ... -
HTML5 Canvas学习笔记(1)处理鼠标事件
2014-06-21 17:48 3034一直在学习HTML5 Canvas相关内容,游戏,动画 ... -
javaScript 广度优先搜索法"自动推箱子"(二)
2014-06-12 09:57 1391接上文: javaScript 广度优先搜索法"自动 ... -
HTML5 Canvas简单淡入淡出游戏启动界面
2014-06-05 12:22 2289欢迎访问博主的网站:http://www.108js.com ... -
HTML5 Canvas贝塞尔曲线动画
2014-05-22 08:35 1528点击这里可以查看动画效果: http://www.108js. ... -
javascript for语句最佳实践
2014-05-22 08:22 659当执行冗长的for语句时,要保持语句块的尽量简洁,例如: 糟 ... -
获取鼠标在HTML5 Canvas中的坐标
2014-05-21 16:43 2471<!DOCTYPE HTML> <html& ...
相关推荐
JavaScript 广度优先搜索法(BFS)是一种在图或树结构中寻找最短路径的算法,常用于解决像“推箱子”这类基于网格的问题。在这个案例中,开发者使用JavaScript实现了一个自动推箱子的程序,它能理论上解决任意数量的...
总的来说,通过JavaScript实现的广度优先搜索法在"自动推箱子"问题中起到了关键作用,它能够系统性地遍历所有可能的玩家和箱子的移动组合,找到最短的解决方案。理解并掌握这种算法对于提升编程能力,解决类似问题...
- **路径查找**:可能用到简单的搜索算法,如深度优先搜索(DFS)或广度优先搜索(BFS),来辅助判断游戏是否可解。 - **回溯法**:当用户尝试无效操作时,需要撤销上一步,这可以通过保存历史状态并进行回溯来...
这些逻辑的实现需要通过编写相应的算法来完成,比如广度优先搜索(BFS)或A*搜索算法可以用于路径寻找。 界面设计是提升用户体验的关键。在微信小程序平台上,需要结合微信的设计指南和视觉规范来设计游戏的界面。...
内容概要:本文详细介绍了基于MATLAB GUI界面和卷积神经网络(CNN)的模糊车牌识别系统。该系统旨在解决现实中车牌因模糊不清导致识别困难的问题。文中阐述了整个流程的关键步骤,包括图像的模糊还原、灰度化、阈值化、边缘检测、孔洞填充、形态学操作、滤波操作、车牌定位、字符分割以及最终的字符识别。通过使用维纳滤波或最小二乘法约束滤波进行模糊还原,再利用CNN的强大特征提取能力完成字符分类。此外,还特别强调了MATLAB GUI界面的设计,使得用户能直观便捷地操作整个系统。 适合人群:对图像处理和深度学习感兴趣的科研人员、高校学生及从事相关领域的工程师。 使用场景及目标:适用于交通管理、智能停车场等领域,用于提升车牌识别的准确性和效率,特别是在面对模糊车牌时的表现。 其他说明:文中提供了部分关键代码片段作为参考,并对实验结果进行了详细的分析,展示了系统在不同环境下的表现情况及其潜在的应用前景。
嵌入式八股文面试题库资料知识宝典-计算机专业试题.zip
嵌入式八股文面试题库资料知识宝典-C and C++ normal interview_3.zip
内容概要:本文深入探讨了一款额定功率为4kW的开关磁阻电机,详细介绍了其性能参数如额定功率、转速、效率、输出转矩和脉动率等。同时,文章还展示了利用RMxprt、Maxwell 2D和3D模型对该电机进行仿真的方法和技术,通过外电路分析进一步研究其电气性能和动态响应特性。最后,文章提供了基于RMxprt模型的MATLAB仿真代码示例,帮助读者理解电机的工作原理及其性能特点。 适合人群:从事电机设计、工业自动化领域的工程师和技术人员,尤其是对开关磁阻电机感兴趣的科研工作者。 使用场景及目标:适用于希望深入了解开关磁阻电机特性和建模技术的研究人员,在新产品开发或现有产品改进时作为参考资料。 其他说明:文中提供的代码示例仅用于演示目的,实际操作时需根据所用软件的具体情况进行适当修改。
少儿编程scratch项目源代码文件案例素材-剑客冲刺.zip
少儿编程scratch项目源代码文件案例素材-几何冲刺 转瞬即逝.zip
内容概要:本文详细介绍了基于PID控制器的四象限直流电机速度驱动控制系统仿真模型及其永磁直流电机(PMDC)转速控制模型。首先阐述了PID控制器的工作原理,即通过对系统误差的比例、积分和微分运算来调整电机的驱动信号,从而实现转速的精确控制。接着讨论了如何利用PID控制器使有刷PMDC电机在四个象限中精确跟踪参考速度,并展示了仿真模型在应对快速负载扰动时的有效性和稳定性。最后,提供了Simulink仿真模型和详细的Word模型说明文档,帮助读者理解和调整PID控制器参数,以达到最佳控制效果。 适合人群:从事电力电子与电机控制领域的研究人员和技术人员,尤其是对四象限直流电机速度驱动控制系统感兴趣的读者。 使用场景及目标:适用于需要深入了解和掌握四象限直流电机速度驱动控制系统设计与实现的研究人员和技术人员。目标是在实际项目中能够运用PID控制器实现电机转速的精确控制,并提高系统的稳定性和抗干扰能力。 其他说明:文中引用了多篇相关领域的权威文献,确保了理论依据的可靠性和实用性。此外,提供的Simulink模型和Word文档有助于读者更好地理解和实践所介绍的内容。
嵌入式八股文面试题库资料知识宝典-2013年海康威视校园招聘嵌入式开发笔试题.zip
少儿编程scratch项目源代码文件案例素材-驾驶通关.zip
小区开放对周边道路通行能力影响的研究.pdf
内容概要:本文探讨了冷链物流车辆路径优化问题,特别是如何通过NSGA-2遗传算法和软硬时间窗策略来实现高效、环保和高客户满意度的路径规划。文中介绍了冷链物流的特点及其重要性,提出了软时间窗概念,允许一定的配送时间弹性,同时考虑碳排放成本,以达到绿色物流的目的。此外,还讨论了如何将客户满意度作为路径优化的重要评价标准之一。最后,通过一段简化的Python代码展示了遗传算法的应用。 适合人群:从事物流管理、冷链物流运营的专业人士,以及对遗传算法和路径优化感兴趣的科研人员和技术开发者。 使用场景及目标:适用于冷链物流企业,旨在优化配送路线,降低运营成本,减少碳排放,提升客户满意度。目标是帮助企业实现绿色、高效的物流配送系统。 其他说明:文中提供的代码仅为示意,实际应用需根据具体情况调整参数设置和模型构建。
少儿编程scratch项目源代码文件案例素材-恐怖矿井.zip
内容概要:本文详细介绍了基于STM32F030的无刷电机控制方案,重点在于高压FOC(磁场定向控制)技术和滑膜无感FOC的应用。该方案实现了过载、过欠压、堵转等多种保护机制,并提供了完整的源码、原理图和PCB设计。文中展示了关键代码片段,如滑膜观测器和电流环处理,以及保护机制的具体实现方法。此外,还提到了方案的移植要点和实际测试效果,确保系统的稳定性和高效性。 适合人群:嵌入式系统开发者、电机控制系统工程师、硬件工程师。 使用场景及目标:适用于需要高性能无刷电机控制的应用场景,如工业自动化设备、无人机、电动工具等。目标是提供一种成熟的、经过验证的无刷电机控制方案,帮助开发者快速实现并优化电机控制性能。 其他说明:提供的资料包括详细的原理图、PCB设计文件、源码及测试视频,方便开发者进行学习和应用。
基于有限体积法Godunov格式的管道泄漏检测模型研究.pdf
嵌入式八股文面试题库资料知识宝典-CC++笔试题-深圳有为(2019.2.28)1.zip
少儿编程scratch项目源代码文件案例素材-几何冲刺 V1.5.zip