继连连看连接算法Python版后,我将该算法移植到了Javascript上,为在浏览器版连连看做准备。
功能及使用方法参照另外一篇:连连看连接算法Python版。
值得一提的是由于Javascript语言没有Java中Map那样的<k,v>对应的数据结构,所以在实现这样的结构时就要另辟蹊径了,通用的方法应该是构建一个相关的类,并提供相应的方法操作。不过我发现一个简易的方法,适合将字符串(String)与任意类型数据相关联。具体方法是使用Javascript中类的属性可以使用数组存取方式(L[index]来访问),可以使用属性名的字符串访问属性,还可以使用delete删除属性,当需要新建或修改一个对应关系的时候,就直接使用O[String]=Object新建或修改指定属性保存对应对象,当删除对应关系时使用delete O[String]即可,当这样就可以实现Map的功能了。
下面代码没有注释,注释可参见连连看连接算法Python版。
- function_index(_value){
-
for(varvinthis){
-
if(this[v]==_value){
-
returnnewNumber(v)
- }
- }
-
return-1;
- }
- function_remove(_value){
-
var_index=this.index(_value);
-
this.splice(_index,1);
- }
- function_insert(_position,_value){
-
this.splice(_position,0,_value);
- }
- Array.prototype.index=_index;
- Array.prototype.insert=_insert;
- Array.prototype.remove=_remove;
- functionPoint(_x,_y,_value){
-
this.x=_x;
-
this.y=_y;
-
this.value=_value;
-
this.directs=null;
-
this.changed=0;
- }
- function_createDirect(_pre,_target){
-
this.directs=newArray();
-
varstx=_target.x-this.x;
-
varsty=_target.y-this.y;
-
if(stx>=0){
-
this.directs.push("right");
-
this.directs.push("left");
- }
-
else{
-
this.directs.push("left");
-
this.directs.push("right");
- }
-
if(sty>=0){
-
this.directs.insert(1,"up");
-
this.directs.push("down");
- }
-
else{
-
this.directs.insert(1,"down");
-
this.directs.push("up");
- }
-
if(_pre==null){
-
return;
- }
-
varspx=_pre.x-this.x;
-
varspy=_pre.y-this.y;
-
if(spx==0){
-
if(spy==1){
-
this.directs.remove("up");
- }
-
else{
-
this.directs.remove("down");
- }
- }
-
else{
-
if(spx==1){
-
this.directs.remove("right");
- }
-
else{
-
this.directs.remove("left");
- }
- }
- }
- function_forward(_pre,_target){
-
if(this.directs==null){
-
this.createDirect(_pre,_target);
- }
-
if(this.directs.length==0){
-
returnnull;
- }
-
vardirect=null;
-
vartmpDirect=null;
-
varx=null;
-
vary=null;
-
varp=null;
-
while(true){
-
if(this.directs.length==0){
-
break;
- }
-
tmpDirect=this.directs.shift();
-
switch(tmpDirect){
-
case"up":
-
x=this.x;
-
y=this.y+1;
-
break;
-
case"down":
-
x=this.x;
-
y=this.y-1;
-
break;
-
case"left":
-
x=this.x-1;
-
y=this.y;
-
break;
-
case"right":
-
x=this.x+1;
-
y=this.y;
-
break;
-
default:
-
thrownewError("errordirect");
-
break;
- }
- p=points[x][y];
-
if(p.value>0&&p!=_target){
-
continue;
- }
-
else{
- direct=tmpDirect;
-
if(_pre==null){
-
this.changed=1;
- }
-
else{
-
if((_pre.x-this.x)==0&&(p.x-this.x)==0){
-
this.changed=0;
- }
-
else{
-
if((_pre.y-this.y)==0&&(p.y-this.y)==0){
-
this.changed=0;
- }
-
else{
-
this.changed=1;
- }
- }
- }
-
break;
- }
- }
-
returndirect;
- }
- function_equals(_point){
-
if(_point==null){
-
returnfalse;
- }
-
if(this.x==_point.x&&this.y==_point.y){
-
returntrue;
- }
-
else{
-
returnfalse;
- }
- }
- Point.prototype.createDirect=_createDirect;
- Point.prototype.forward=_forward;
- Point.prototype.equals=_equals;
-
varpoints=newArray();
-
varvalueStack=newArray();
- functioncreatePoints(w,h){
- vartemp;
- vartempValue;
- pointStack(w,h);
-
for(var_x=0;_x<w;_x++){
-
temp=newArray();
-
for(var_y=0;_y<h;_y++){
-
if(_x==0||_x==(w-1)||_y==0||_y==(h-1)){
- tempValue=9;
- }
-
else{
-
if(_x==1||_x==(w-2)||_y==1||_y==(h-2)){
- tempValue=0;
- }
-
else{
- tempValue=valueStack.pop();
- }
- }
-
temp[_y]=newPoint(_x,_y,tempValue);
- }
- points[_x]=temp;
- }
- }
- functionpointStack(w,h){
- varsize=(w*h-(w*4+h*4-16))/2;
- varpointValue;
-
for(vari=0;i<size;i++){
-
while(true){
- pointValue=Math.floor(Math.random()*9);
-
if(pointValue!=0){
-
break;
- }
- }
- valueStack.insert(Math.floor(Math.random()*valueStack.length),pointValue);
- valueStack.insert(Math.floor(Math.random()*valueStack.length),pointValue);
- }
- }
- functionlinkPoints(_source,_target){
-
varpath=newArray();
-
varfail=newObject();
- varchange=0;
- var_current=_source;
-
vardirect=null;
- var_x,_y;
-
while(true){
-
-
if(_current==_target&&change<4){
-
for(varpinpath){
-
path[p].directs=null;
- }
-
returnpath;
- }
-
if(change==4){
-
_current.directs=null;
-
fail[(_current.x+"_"+_current.y)]=change;
- _current=path.pop();
- change=change-_current.changed;
-
continue;
- }
-
if(_current==_source){
-
direct=_current.forward(null,_target);
- }
-
else{
- direct=_current.forward(path[path.length-1],_target);
- }
-
if(direct!=null){
-
if(direct=="up"){
- _x=_current.x;
- _y=_current.y+1;
- }
-
if(direct=="down"){
- _x=_current.x;
- _y=_current.y-1;
- }
-
if(direct=="left"){
- _x=_current.x-1;
- _y=_current.y;
- }
-
if(direct=="right"){
- _x=_current.x+1;
- _y=_current.y;
- }
-
if(fail[(_x+"_"+_y)]!=null){
-
if(change>=fail[(_x+"_"+_y)]){
-
continue;
- }
-
else{
-
deletefail[(_x+"_"+_y)];
- }
- }
- change=change+_current.changed;
- path.push(_current);
- _current=points[_x][_y];
- }
-
else{
-
if(_current==_source){
-
_source.directs=null;
-
returnfalse;
- }
-
else{
-
_current.directs=null;
-
fail[(_current.x+"_"+_current.y)]=change;
- _current=path.pop();
- change=change-_current.changed;
- }
- }
- }
- }
-
-
分享到:
相关推荐
连连看核心算法.rar 连连看核心算法.rar 连连看核心算法.rar 连连看核心算法.rar 连连看核心算法.rar 连连看核心算法.rar
java版连连看算法java版连连看算法java版连连看算法
连连看的核心算法,基于集合形式搜索路径。
改变A*寻路算法中的估价函数打造连连看的寻路算法 源码
C++实现的连连看算法,一个例子可以明白C++语法和开发 的基础
易语言源码连连看核心算法.rar 易语言源码连连看核心算法.rar 易语言源码连连看核心算法.rar 易语言源码连连看核心算法.rar 易语言源码连连看核心算法.rar 易语言源码连连看核心算法.rar
android 连连看算法android 连连看算法android 连连看算法
连连看核心算法
连连看 java算法 基于安卓手机开发的游戏程序
连连看算法 一 连连看的要求 二 任意两点能否连通 三 地图无解提示 四 连接提示功能 五 道具问题 六 地图问题
连连看游戏里边涵盖了:随机分布算法;遍历查找算法;时间进度控制; 这些算法全部是设计并完成的,感觉比别人的算法要简单易懂!
易语言连连看核心算法源码,连连看核心算法,初始化画板,画编号图片,画连通块通路线,计算块相对坐标,计算块绝对坐标,计算相对坐标块号,计算绝对坐标块号,画块边框,画连通块清除动画,自动提示有效块,建立四边留空布局,...
小游戏连连看的详细算法介绍,供大家参考学习,是doc格式。
功能:为连连看游戏提供连接算法 说明:模块中包含一个Point类,该类是游戏的基本单元“点”,该类包含属性:x,y,value。 其中x,y代表了该点的坐标,value代表该点的特征:0代表没有被填充,1-8代表被填充为游戏图案...
自已做的连连看里面附加我的小算法
连连看算法的JAVA实现,使用递归,可达到无限拐点
主要为大家详细介绍了JavaScript实现连连看连线算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
Android游戏开发之连连看算法,看看
功能较为齐全,算法简单,只需判断第一次和第二次按键左右位置
仅供VC程序分析,请不要肆意疯传或用做外挂,破坏游戏本身的乐趣!