JavaScript实现连连看连线算法


Posted in Javascript onJanuary 05, 2019

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

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

JavaScript实现连连看连线算法

代码如下:

var self = this; //用self变量来保存当下的这个this,以免在其他函数域中this指向不同对象而调用错误
 //直线连接的两个对象
 function isDirectLink(_begin,_end){
  //若传入的是同一对象,连线的长度为0,返回false row col 分别表示精灵的行号和列号
  if(_begin.row == _end.row&&_begin.col==_end.col){
  m_line.length = 0;
  return false;
  }
  //行号相等时
  if(_begin.row == _end.row){
  var steps = _begin.col - _end.col;
  var direction = steps/Math.abs(steps);
  var row = _begin.row;
  //判断两个对象直线距离上是否存在精灵
  for(var i = 1;i<Math.abs(steps);++i)
  {
   var col = _begin.col - i*direction;
   //获取连线中间的精灵
   var sprite = self.m_sprites[row*m_col+col];
   //若不为空,连线的长度为0,返回false
   if(sprite!=null)
   {
   m_line.length = 0;
   return false;
   }
  }
  m_line.push(new M_Segment(_begin,_end));
  return true;
  }
  //列号相等时
  if(_begin.col == _end.col){
  var steps = _begin.row-_end.row;
  var direction = steps/Math.abs(steps);
  var col = _begin.col;
  for(var i =1;i<Math.abs(steps);++i){
   var row =_begin.row - i*direction;
   var sprite = self.m_sprites[row*m_col+col];
   if(sprite!=null){
   m_line.length = 0;
   return false;
   }
  }
  m_line.push(new M_Segment(_begin,_end));
  return true;
  }
  return false;
 };

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

JavaScript实现连连看连线算法

function isOneCornerLink(_begin,_end){ 
  if(_begin.row == _end.row&&_begin.col == _end.col){ 
  m_line.length = 0; 
  return false; 
  } 
  //第一种拐点 M_Point()是自定义的一个函数 
  var point_1 = new M_Point(_begin.row,_end.col); 
  //用拐点分别连接两个精灵 
  var islink_1 =(isDirectLink(_begin,point_1)&&isDirectLink(point_1,_end)); 
  //若连接成功 
  if(islink_1){ 
  //若拐点上无精灵,则返回true 
  if(self.m_sprites[point_1.row*m_col+point_1.col]==null){ 
   return 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)); 
  if(islink_2){ 
  if(self.m_sprites[point_2.row*m_col+point_2.col]==null){ 
   return true; 
  } 
  } 
  m_line.length =0; 
  return false; 
 };

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

JavaScript实现连连看连线算法

function isTwoCornerLink(_begin,_end){
  function setSegment(point_1,point_2,point_3,point_4){
  m_line.length = 0;
  m_line.push(new M_Segment(point_1,point_2));
  m_line.push(new M_Segment(point_2,point_3));
  m_line.push(new M_Segment(point_3,point_4));
  }
  if(_begin.row==_end.row&&_begin.col==_end.col){
  m_line.length = 0;
  return false;
  }
  //若两个对象在同一行,且在边框最外的两行
  if(_begin.row == _end.row&&(_begin.row ==0||_begin.row==m_row-1)){
  var addline = -1;
  //若在第一行,则在下面划线,否则在上面
  if(_begin.row == 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);
  return true;
  }
  m_line.length = 0;
  //若两个对象在同一列,且在边框最外的两行
  if(_begin.col ==_end.col&&(_begin.col==0||_begin.col==m_col-1)){
  var addline = -1;
  if(_begin.col == 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);
  return true;
  }
  m_line.length = 0;
  //向上画线
  for(var _row = _begin.row+1;_row<=m_row;++_row){
 
  if(_row == m_row){
   //如果begin点在最外一行,判断end点对应边框上的点是否存在,再判断是否能连接
   if(row - 1 ==_begin.row){
   if (self.m_sprites[(_row - 1) * m_col + _end.col] == null) {
    var link = isDirectLink(_end, new M_Point((_row - 1), _end.col));
    if (link) {
    m_line.length = 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);
    return true;
    }
   }
   }
   m_line.length = 0;
   // 若end点在第八行
   if(_row - 1 == _end.row){
   if(self.m_sprites[(_row-1)*m_col+_end.col]==null){
    var link = isDirectLink(_begin,new M_Point((_row-1),_begin.col));
    if(link){
    m.line.length = 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);
    return true;
    }
   }
   }
   m_line.length = 0;
   //若begin点和end点列对应的第八行上是否为空
   if(self.m_sprites[(_row-1)*m_col+_begin.col]!=null||self.m_sprites[(_row-1)*m_col+_end.col]!=null){
   break;
   }
   var link_1 = isDirectLink(_begin,new M_Point(_row - 1,_begin.col));
   var link_2 = isDirectLink(_end,new M_Point(_row -1 ,_end.col));
   if(link_1&&link_2)
   {
   m_line.length = 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);
   return true;
   }
  }
  else{
   m_line.length = 0;
   var point_1 = new M_Point(_row,_begin.col);
   //若连线第一个拐点为空
   if(self.m_sprites[point_1.row*m_col+point_1.col]!=null){
   break;
   }
   var link_1 = isOneCornerLink(point_1,_end);
   var link_2 = isDirectLink(_begin,point_1);
   if(link_1&&link_2){
   return true;
   }
  }
  }
  //向下画线
  m_line.length = 0;
  for(var _row = begin.row-1;_row>=-1;--row){
  if(_row==-1){
   if(0==_begin.row){
   if(self.m_sprites[_end.col]==null){
    var link = isDirectLink(_end,new M_Point(0,_end.col));
    if(link){
    m_line.length = 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);
    return true;
    }
   }
   }
   m_line.length = 0;
   if(0==_end.row){
   if(self.m_sprites[_begin.col]==null){
    var link = isDirectLink(_begin,new M_Point(0,_begin.col));
    if(link){
    m_line.length = 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);
    return true;
    }
   }
   }
   m_line.length = 0;
   if(self.m_sprites[_begain.col]!=null||self.m_sprites[_end.col]!=null){
   break;
   }
   var link_1 = isDirectLink(_begain,new M_Point(0,_begain.col));
   var link_2 = isDirectLink(_end,new M_Point(0,_end.col));
   if(link_1&&link_2){
   m_line.length = 0;
   var p_1 = new M_Point(_row,_begain.col);
   var p_2 = new M_Point(_row,_end.col);
   setSegment(_begain,p_1,p_2,_end);
   return true;
 
   }
  }
  else {
   m_line.length = 0;
   var point_1 = new M_Point(_row, _begain.col);
   //cc.log(point_1.row+" "+point_1.col);
   if (self.m_sprites[point_1.row * m_col + point_1.col] != null) {
   break;
   }
   var link_1 = isOneCornerLink(point_1, _end);
   var link_2 = isDirectLink(_begain, point_1);
   if (link_1 && link_2) {
   return true;
   }
  }
  }
  m_line.length = 0;
  //向左画线
  for(var _col = _begain.col-1;_col>=-1;--_col){
  if(_col==-1){
   if(0==_begain.col){
   if(self.m_sprites[_end.row*m_col]==null){
    var link = isDirectLink(_end,new M_Point(_end.row,0));
    if(link){
    m_line.length = 0;
    var p_1 = new M_Point(_begain.row,_col);
    var p_2 = new M_Point(_end.row,_col);
    setSegment(_begain,p_1,p_2,_end);
    //m_line.push(new M_Segment(_begain,p_1));
    //m_line.push(new M_Segment(p_1,p_2));
    //m_line.push(new M_Segment(p_2,_end));
    return true;
    }
   }
   }
   m_line.length = 0;
   if(0==_end.col){
   if(self.m_sprites[_begain.row*m_col]==null){
    var link = isDirectLink(_begain,new M_Point(_begain.row,0));
    if(link){
    m_line.length = 0;
    var p_1 = new M_Point(_begain.row,_col);
    var p_2 = new M_Point(_end.row,_col);
    setSegment(_begain,p_1,p_2,_end);
    //m_line.push(new M_Segment(_begain,p_1));
    //m_line.push(new M_Segment(p_1,p_2));
    //m_line.push(new M_Segment(p_2,_end));
    return true;
    }
   }
   }
   m_line.length = 0;
   if(self.m_sprites[_begain.row*m_col]!=null||self.m_sprites[_end.row*m_col]!=null){
   break;
   }
   var link_1 = isDirectLink(_begain,new M_Point(_begain.row,0));
   var link_2 = isDirectLink(_end,new M_Point(_end.row,0));
   if(link_1&&link_2){
   m_line.length = 0;
   var p_1 = new M_Point(_begain.row,_col);
   var p_2 = new M_Point(_end.row,_col);
   setSegment(_begain,p_1,p_2,_end);
   //m_line.push(new M_Segment(_begain,p_1));
   //m_line.push(new M_Segment(p_1,p_2));
   //m_line.push(new M_Segment(p_2,_end));
   return true;
 
   }
 
  }
  else {
   m_line.length = 0;
   var point_1 = new M_Point(_begain.row, _col);
   //cc.log(point_1.row+" "+point_1.col);
   if (self.m_sprites[point_1.row * m_col + point_1.col] != null) {
   break;
   }
   var link_1 = isOneCornerLink(point_1, _end);
   var link_2 = isDirectLink(_begain, point_1);
   if (link_1 && link_2) {
   return true;
   }
  }
 
  }
  m_line.length = 0;
  //向右画线
  for(var _col = _begain.col+1;_col<=m_col;++_col){
  if(_col==m_col){
   if(m_col-1==_begain.col){
   if(self.m_sprites[_end.row*m_col+_col-1]==null){
    var link = isDirectLink(_end,new M_Point(_end.row,_col-1));
    if(link){
    m_line.length = 0;
    var p_1 = new M_Point(_begain.row,_col);
    var p_2 = new M_Point(_end.row,_col);
    setSegment(_begain,p_1,p_2,_end);
    return true;
    }
   }
   }
   m_line.length = 0;
   if(m_col-1==_end.col){
   if(self.m_sprites[_begain.row*m_col+_col-1]==null){
    var link = isDirectLink(_begain,new M_Point(_begain.row,_col-1));
    if(link){
    m_line.length = 0;
    var p_1 = new M_Point(_begain.row,_col);
    var p_2 = new M_Point(_end.row,_col);
    setSegment(_begain,p_1,p_2,_end);
    return true;
    }
   }
   }
   m_line.length = 0;
   if(self.m_sprites[_begain.row*m_col+_col-1]!=null||self.m_sprites[_end.row*m_col+_col-1]!=null){
   break;
   }
   var link_1 = isDirectLink(_begain,new M_Point(_begain.row,_col-1));
   var link_2 = isDirectLink(_end,new M_Point(_end.row,_col-1));
   if(link_1&&link_2){
   m_line.length = 0;
   var p_1 = new M_Point(_begain.row,_col);
   var p_2 = new M_Point(_end.row,_col);
   setSegment(_begain,p_1,p_2,_end);
   return true;
 
   }
 
  }
  else {
   m_line.length = 0;
   var point_1 = new M_Point(_begain.row, _col);
   //cc.log(point_1.row+" "+point_1.col);
   if (self.m_sprites[point_1.row * m_col + point_1.col] != null) {
   break;
   }
   var link_1 = isOneCornerLink(point_1, _end);
   var link_2 = isDirectLink(_begain, point_1);
   if (link_1 && link_2) {
   return true;
   }
  }
 
  }
  m_line.length = 0;
  return false;
 };

最后再检查一下

function checkLink(_begin,_end){
  var islink = isDirectLink(_begin,_end);
  if(islink){
  return islink;
  }
  islink = isOneCornerLink(_begin,_end);
  if(islink){
  return islink;
  }
  islink = isTwoCornerLink(_begin,_end);
  if(islink){
  return islink;
  }
  return false;
 }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript 显示当前系统时间代码
Dec 28 Javascript
jQuery ajax 路由和过滤器使用说明
Aug 02 Javascript
VBS通过WMI监视注册表变动的代码
Oct 27 Javascript
网页下载文件期间如何防止用户对网页进行其他操作
Jun 27 Javascript
node.js中的定时器nextTick()和setImmediate()区别分析
Nov 26 Javascript
JS拖动鼠标画出方框实现鼠标选区的方法
Aug 05 Javascript
jQuery 开发之EasyUI 添加数据的实例
Sep 26 jQuery
基于vue2实现上拉加载功能
Nov 28 Javascript
mac上配置Android环境变量的方法
Jul 08 Javascript
详解如何解决Vue和vue-template-compiler版本之间的问题
Sep 17 Javascript
自定义javascript验证框架示例【附源码下载】
May 31 Javascript
利用Electron简单撸一个Markdown编辑器的方法
Jun 10 Javascript
JavaScript错误处理操作实例详解
Jan 04 #Javascript
JSON基本语法及与JavaScript的异同实例分析
Jan 04 #Javascript
JavaScript解析及序列化JSON的方法实例分析
Jan 04 #Javascript
Node.js操作系统OS模块用法分析
Jan 04 #Javascript
Node.js console控制台简单用法分析
Jan 04 #Javascript
Node.js JSON模块用法实例分析
Jan 04 #Javascript
使用VUE+iView+.Net Core上传图片的方法示例
Jan 04 #Javascript
You might like
php的闭包(Closure)匿名函数详解
2015/02/22 PHP
实例化php类时传参的方法分析
2020/06/05 PHP
javascript onkeydown,onkeyup,onkeypress,onclick,ondblclick
2009/02/04 Javascript
ExtJs使用IFrame的实现代码
2010/03/24 Javascript
Web 前端设计模式--Dom重构 提高显示性能
2010/10/22 Javascript
jquery foreach使用示例
2013/09/12 Javascript
javascripit实现密码强度检测代码分享
2013/12/12 Javascript
node.js [superAgent] 请求使用示例
2015/03/13 Javascript
JavaScript中标识符提升问题
2015/06/11 Javascript
纯javascript响应式树形菜单效果
2015/11/10 Javascript
JavaScript隐式类型转换
2016/03/15 Javascript
当jquery ajax遇上401请求的解决方法
2016/05/19 Javascript
vue.js实现含搜索的多种复选框(附源码)
2017/03/23 Javascript
JS实现常见的查找、排序、去重算法示例
2018/05/21 Javascript
超好用的jQuery分页插件jpaginate用法示例【附源码下载】
2018/12/06 jQuery
vue element动态渲染、移除表单并添加验证的实现
2019/01/16 Javascript
jQuery实现条件搜索查询、实时取值及升降序排序的方法分析
2019/05/04 jQuery
微信小程序把百度地图坐标转换成腾讯地图坐标过程详解
2019/07/10 Javascript
JS实现transform实现扇子效果
2020/01/17 Javascript
python实现最长公共子序列
2018/05/22 Python
python matlibplot绘制多条曲线图
2021/02/19 Python
利用Python将每日一句定时推送至微信的实现方法
2018/08/13 Python
一百多行python代码实现抢票助手
2018/09/25 Python
Python SMTP配置参数并发送邮件
2020/06/16 Python
La Redoute英国官网:法国时尚品牌
2017/04/27 全球购物
.net面试题
2015/12/22 面试题
美发店5.1活动方案
2014/01/24 职场文书
文明礼貌演讲稿
2014/05/12 职场文书
建筑节能汇报材料
2014/08/22 职场文书
保证金退回承诺函格式
2015/01/21 职场文书
护士个人年终总结
2015/02/13 职场文书
运动会宣传稿100字
2015/07/23 职场文书
成本低的5个创业项目:投资小、赚钱快
2019/08/20 职场文书
python 命令行传参方法总结
2021/05/25 Python
告别网页搜索!教你用python实现一款属于自己的翻译词典软件
2021/06/03 Python
Python爬虫网络请求之代理服务器和动态Cookies
2022/04/12 Python