- 浏览: 583741 次
- 来自: ...
文章分类
最新评论
-
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 10023效果图: 效果链接:http://www.108js.co ... -
HTML5 canvas 飘扬的五星红旗
2015-12-21 08:56 2366效果图: 效果链接: http://www.108js.co ... -
简单HTML5 Canvas Arrow旋转动画
2015-05-22 08:38 12895效果图: 效果链接: http://www.108js.c ... -
HTML5 Canvas简单透明文字动画
2015-05-22 08:17 7385效果图: 效果链接: http://www.108js.c ... -
一个非常好的HTML5 Canvas焰火效果
2014-12-28 15:56 1579效果图: 点击观看效果:http://www.108js. ... -
《HTML5 Canvas学习笔记(10)》数钱数到手抽筋
2014-12-21 14:01 3200网上看到一个游戏《数钱数到手抽筋》简单的模仿一下。 鼠标拖动或 ... -
HTML5 Canvas学习笔记(9)俄罗斯方块游戏之三(游戏面板)
2014-07-05 07:13 1371接上一遍《HTML5 Canvas学习笔记(8)俄罗斯方块游戏 ... -
HTML5 Canvas学习笔记(8)俄罗斯方块游戏之二(方块)
2014-07-04 13:08 1661接上一遍《HTML5 Canvas学习笔记(7)俄罗斯方块游戏 ... -
HTML5 Canvas学习笔记(7)俄罗斯方块游戏之一(色块)
2014-07-04 10:53 2333在网上看到一个俄罗斯方块游戏: http://www.108j ... -
HTML5 Canvas学习笔记(6)拼图游戏(数字版)
2014-06-28 17:38 2487今天网上发现了一段代码,只有界面,很不错,学习了并完成了逻辑。 ... -
HTML5 Canvas学习笔记(5)游戏得分动画
2014-06-26 17:11 1075效果图: 点击查看效果: http://www.108js ... -
HTML5 Canvas学习笔记(4)游戏界面的淡入淡出
2014-06-26 11:26 1931效果图: 点击看效果: http://www.108js. ... -
HTML5 Canvas学习笔记(3)加载游戏/动画音乐
2014-06-25 11:20 1660先要准备应付各种浏览器的声音文件,什么.mp3,.ogg ... -
HTML5 Canvas学习笔记(2)菜单高亮显示与像素字体
2014-06-23 23:13 1901看到哪,学到哪,记到哪。见谅,这些笔记就没有顺序和知识上的连贯 ... -
HTML5 Canvas学习笔记(1)处理鼠标事件
2014-06-21 17:48 2917一直在学习HTML5 Canvas相关内容,游戏,动画 ... -
javaScript 广度优先搜索法"自动推箱子"(二)
2014-06-12 09:57 1292接上文: javaScript 广度优先搜索法"自动 ... -
HTML5 Canvas简单淡入淡出游戏启动界面
2014-06-05 12:22 2216欢迎访问博主的网站:http://www.108js.com ... -
HTML5 Canvas贝塞尔曲线动画
2014-05-22 08:35 1398点击这里可以查看动画效果: http://www.108js. ... -
javascript for语句最佳实践
2014-05-22 08:22 542当执行冗长的for语句时,要保持语句块的尽量简洁,例如: 糟 ... -
获取鼠标在HTML5 Canvas中的坐标
2014-05-21 16:43 2409<!DOCTYPE HTML> <html& ...
相关推荐
用JS写了一个“广度优先搜索法”自动推箱子,理论上无论多少箱子都可以求解,但事实上箱子多了以后,就 有需要的拿出发挥,修改,高手就可以跳过了
NULL 博文链接:https://128kj.iteye.com/blog/2078631
深度优先与广度优先搜索法.doc,超级实用,希望对学数据结构与算法的人有所帮助!
当然 有时小人的状态不同但是箱子的位置相同时 也可能属于两种不同的状态 因此我规定了有效连通域的概念:在不移动箱子的情况下小人可以达到的位置都属于这个有效连通域 我们通过宽度优先搜索来处理一个原始的地图 ...
用c/c++语言描述,n^2级别的广度优先搜索,能够自动实现对任意地图的推箱子动态演示,绝对经典
易语言源码易语言广度优先搜索实现漫水法源码.rar 易语言源码易语言广度优先搜索实现漫水法源码.rar 易语言源码易语言广度优先搜索实现漫水法源码.rar 易语言源码易语言广度优先搜索实现漫水法源码.rar 易语言...
2,再用广度搜索法反向标记每个步骤的逆向步骤层号。 3,用深度算法结合逆向步骤层号进行整体分析。 4,对目标点的到达顺序进行了分析。最终步骤近乎是最短步骤。 5,用线程技术实现了分析过程的暂停与继续。分析后...
广度优先搜索(也称宽度优先搜索,缩写BFS,以下采用广度来描述)是连通图的一种遍历策略。本程序用Matlab语言实现广度优先算法
②使用广度优先搜索来解决八数码问题 ③使用过程式表示和实现八数码问题 以及相关代码详细注释 过程式知识表示是将有关某一问题领域的知识, 连同如何使用这些知识的方法,均隐式的表达为 一个求解问题的过程,每个...
BFS DFS 深度优先搜索 广度优先搜索 图 输出所有路径 输出最短路径 随便输出一条可能的路径
人工智能实验 宽度优先搜索 人工智能实验 宽度优先搜索
采用宽度优先搜索算法,编程实现八数码问题的求解。初始状态和目标状态可自定;采用宽度优先搜索算法,编程实现八数码问题的求解。初始状态和目标状态可自定采用宽度优先搜索算法,编程实现八数码问题的求解。初始...
MATLAB源码集锦-基于BFS广度优先搜索算法代码
邻接表表示的图的深度优先搜索和广度优先搜索程序
二叉树的深度优先搜索与广度优先搜索的非递归方法实现
代码 基于BFS广度优先搜索算法代码代码 基于BFS广度优先搜索算法代码代码 基于BFS广度优先搜索算法代码代码 基于BFS广度优先搜索算法代码代码 基于BFS广度优先搜索算法代码代码 基于BFS广度优先搜索算法代码代码 ...
广度优先搜索和宽度优先搜索的动画演示,均为gif图,大家可以自行看看,理解思路或者放Ppt里很好用,怎么分数是5分,编辑不了了? 请管理员修改为1分,谢谢
广度优先搜索例题及代码详解 通过广度优先搜索的题目练习初步掌握广度优先搜索的机理
推箱子游戏的源代码(VC编译,可以自动演示走法)。很好玩的一个小型智力游戏。程序可以自动的搜索算法,并演示。有几千个关卡可以选择,也可以自己编辑地图增加关卡。
1,用广度搜索法用走迷宫的方式模拟搜索,不快。超过六个箱子的你可以亲自去玩了。 2,采用java可变树TreeNode+集合TreeSet法解决网状数据结构中的节点重复搜索问题。 3,对凹形区域进行了专门的分析,就是凹形区域...