JavaScript实现连连看连线算法

  

本文实例为大家分享了JavaScript实现连连看连线算法的多种情况,供大家参考,具体内容如下

  

<强>第一种情况为两个精灵能通过一条直线连接,如下图

  

 JavaScript实现连连看连线算法

  

代码如下:

        var自我=;//用自我变量来保存当下的这个这个,以免在其他函数域中这指向不同对象而调用错误//直线连接的两个对象   函数isDirectLink (_begin _end) {//若传入的是同一对象,连线的长度为0,返回假行坳分别表示精灵的行号和列号   如果(_begin。行==_end.row&, _begin.col==_end.col) {   m_line。长度=0;   返回错误;   }//行号相等时   如果(_begin。行==_end.row) {   var=_begin步骤。col - _end.col;   var=步骤/Math.abs方向(步骤);   var行=_begin.row;//判断两个对象直线距离上是否存在精灵   (var i=1; i< Math.abs(步骤);+ + i)   {   var=_begin上校。上校,我*方向;//获取连线中间的精灵   var雪碧=self.m_sprites[行* m_col +坳];//若不为空,连线的长度为0,返回错误的   如果(雪碧!=null)   {   m_line。长度=0;   返回错误;   }   }   m_line。推动(新M_Segment (_begin _end));   返回true;   }//列号相等时   如果(_begin。坳==_end.col) {   var步骤=_begin.row -_end.row;   var=步骤/Math.abs方向(步骤);   var坳=_begin.col;   (var i=1; i< Math.abs(步骤);+ + i) {   var=_begin行。行,我*方向;   var雪碧=self.m_sprites[行* m_col +坳];   如果(雪碧!=null) {   m_line。长度=0;   返回错误;   }   }   m_line。推动(新M_Segment (_begin _end));   返回true;   }   返回错误;   };      

<强>第二种情况为只需一个转角就能连接两个精灵,如下图

  

 JavaScript实现连连看连线算法

        函数isOneCornerLink (_begin _end) {   如果(_begin。行==_end.row& _begin。坳==_end.col) {   m_line。长度=0;   返回错误;   }//第一种拐点M_Point()是自定义的一个函数   var point_1=new M_Point (_begin.row _end.col);//用拐点分别连接两个精灵   var islink_1=(isDirectLink (_begin point_1),和isDirectLink (point_1 _end));//若连接成功   如果(islink_1) {//若拐点上无精灵,则返回现实   如果(self.m_sprites [point_1.row * m_col + point_1.col]==null) {   返回true;   }   }   m_line.length=0;//第二种拐点   var point_2=new M_Point (_end.row _begin.col);   var islink_2=(isDirectLink (_begin point_2),和isDirectLink (point_2 _end));   如果(islink_2) {   如果(self.m_sprites [point_2.row * m_col + point_2.col]==null) {   返回true;   }   }   m_line。长度=0;   返回错误;   };      

<强>第三种情况是需要两个拐点才能相连,,这种情况比较多,列出两种的图,供理解代码的时候参考,

  

 JavaScript实现连连看连线算法

        函数isTwoCornerLink (_begin _end) {   函数setSegment (point_1 point_2、point_3 point_4) {   m_line。长度=0;   m_line。推动(新M_Segment (point_1 point_2));   m_line。推动(新M_Segment (point_2 point_3));   m_line。推动(新M_Segment (point_3 point_4));   }   如果(_begin.row==_end.row&, _begin.col==_end.col) {   m_line。长度=0;   返回错误;   }//若两个对象在同一行,且在边框最外的两行   如果(_begin。行==_end.row&及(_begin。行==0 | | _begin.row==m_row-1)) {   var addline=1;//若在第一行,则在下面划线,否则在上面   如果(_begin。行==0){   addline=1;   }   var p_1=new M_Point (_begin.row-addline _begin.col);   var p_2=new M_Point (_begin.row-addline _end.col);   setSegment (_begin p_1、p_2 _end);   返回true;   }   m_line。长度=0;//若两个对象在同一列,且在边框最外的两行   如果(_begin。坳==_end.col&及(_begin.col==0 | | _begin.col==m_col-1)) {   var addline=1;   如果(_begin。坳==0){   addline=1;   }   var p_1=new M_Point (_begin.row _begin.col-addline);   var p_2=new M_Point (_end.row _end.col-addline);   setSegment (_begin p_1、p_2 _end);   返回true;   }   m_line。长度=0;//向上画线   (var _row=_begin.row + 1, _row<=m_row; + + _row) {      如果(_row==m_row) {//如果开始点在最外一行,判断结束点对应边框上的点是否存在,再判断是否能连接   如果(行- 1==_begin.row) {   如果(自我。m_sprites [(_row - 1) * m_col + _end。坳]==null) {   var链接=isDirectLink (_end,新的M_Point ((_end.col _row - 1)));   如果(链接){   m_line。长度=0;   var p_1=new M_Point (_row _begin.col);   var p_2=new M_Point (_row _end.col);   setSegment (_begin p_1、p_2 _end);   返回true;   }   }   }   m_line。长度=0;//若结束点在第八行   如果(_row - 1==_end.row) {   如果(self.m_sprites [(_row-1) * m_col + _end.col]==null) {   var链接=isDirectLink (_begin,新的M_Point ((_begin.col _row-1)));   如果(链接){   m.line。长度=0;   var p_1=new M_Point (_row _begin.col);   var p_2=new M_Point (_row _end.col);   setSegment (_begin p_1、p_2 _end);   返回true;   }   }   }   m_line。长度=0;//若开始点和结束点列对应的第八行上是否为空   如果(self.m_sprites [(_row-1) * m_col + _begin.col] !=null | | self.m_sprites [(_row-1) * m_col + _end.col] !=null) {   打破;   }   var link_1=isDirectLink (_begin,新的M_Point (_begin.col _row - 1));   var link_2=isDirectLink (_end,新的M_Point (_row _end.col));   如果(link_1&, link_2)   {   m_line。长度=0;   var p_1=new M_Point (_row _begin.col);   var p_2=new M_Point (_row _end.col);   setSegment (_begin p_1、p_2 _end);   返回true;   }   }   其他{   m_line。长度=0;   var point_1=new M_Point (_row _begin.col);//若连线第一个拐点为空   如果(self.m_sprites [point_1.row * m_col + point_1.col] !=null) {   打破;   }   var link_1=isOneCornerLink (point_1 _end);   var link_2=isDirectLink (_begin point_1);   如果(link_1&, link_2) {   返回true;   }   }   }//向下画线   m_line。长度=0;   (var _row=begin.row-1; _row>=1;——行){   如果(_row==1) {   如果(0==_begin.row) {   如果(self.m_sprites [_end.col]==null) {   var链接=isDirectLink (_end,新的M_Point (0, _end.col));   如果(链接){   m_line。长度=0;   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

JavaScript实现连连看连线算法