日期:2014-05-16  浏览次数:20377 次

练练看游戏JavaScript搜索路径的核心算法实现

 // 搜寻路径
 searchTrack : function(piece) {
  
  if (this.isNear(piece)) {
    
   this.linkTrack(piece);
   
   return;
  }  
  
  if (this.isReach(piece) || this.isReach2(piece)) {
    
   this.linkTrack(piece);
   
   return;
  }  
    
 },

 
 // 是否相邻
 isNear : function(piece) {
 
  var a = (Math.abs(piece.x - this.x) == 1) && (piece.y == this.y)
   || (Math.abs(piece.y - this.y) == 1) && (piece.x == this.x);
 
  return a;
 },
 
 // 直线
 isStraightReach : function(piece) {
  //alert("isStraightReach");
  if (this.isNear(piece)) {
   
   return true;
  
  }
  
  var a = false;
  var b = false;

  // 沿y轴方向搜索
  if (this.x == piece.x) {
   //alert("!!!!!!!!!!!");
   for (var i = this.min(this.y, piece.y) + 1; i < this.max(this.y, piece.y); i ++) {
    //alert("this.x == piece.x: " + piece.x + "," + i);
    if (this.game.pieceMap.get(piece.x + "," + i).isPass()) {
    
     a = true;
     
     this.game.trackList.push(this.game.pieceMap.get(piece.x + "," + i));
     
     continue;
    } else {
    
     a = false;
     this.game.trackList = [];
     
     return a; 
    }
   
   }
      
  }
  
  // 沿x轴方向搜索
  if (this.y == piece.y) {
   //alert("!!!!!!!!!!!");
   for (var i = this.min(this.x, piece.x) + 1; i < this.max(this.x, piece.x); i ++) {
    //alert("this.y == piece.y: " + i + "," + piece.y);
    if (this.game.pieceMap.get(i + "," + piece.y).isPass()) {
     
     b = true;
     this.game.trackList.push(this.game.pieceMap.get(i + "," + piece.y));
     
     continue;
    } else {
    
     b = false
     this.game.trackList = [];
     
     return b;
    }
   
   }
   
  }

  return a || b;
 },

 
 // 拐一次弯搜索
 isReach1 : function(piece) {
  //alert("isReach1");
  var corner_1 = this.game.pieceMap.get(this.x + "," + piece.y);
  var corner_2 = this.game.pieceMap.get(piece.x + "," + this.y);
      
  var _this = this;

  
  if