2012-08-29 28 views
0

我正在編寫一個匹配三引擎,並且我成功地使用巨大的循環來創建匹配以查找匹配的項目。有關如何用物品填充空白空間(放入空白空間)並創建新項目而沒有過多循環和if語句的任何想法?在網格中填充開放空間自頂向下

這是我迄今爲止的相關代碼。

public var rows:uint = 8; 
public var cols:uint = 7; 
public var cell:Array = new Array(); 
public var plot:Array = new Array(); 

public var height:int; 
public var width:int; 

public var relativePositions:Array = [{name:'top', position:-1}, {name:'bottom', position:1}, {name:'left', position:rows*-1}, {name:'right', position:rows*1}]; 
public var dictionary:Dictionary = new Dictionary(); 
public var matches:Array = new Array(); 

public function createGrid(target:*, displayObject:*, spacer:int) : void { 

     var iterator:uint = 0; 
     for(var c:uint = 0;c<cols;c++){ 
      for(var r:uint = 0;r<rows;r++){           
       cell[iterator] = createGamePiece(); 
       Sprite(cell[iterator]).name = String(iterator); 
       Sprite(cell[iterator]).addEventListener(MouseEvent.CLICK, _handleGamePiece_CLICK); 
       Sprite(cell[iterator]).addEventListener(MouseEvent.MOUSE_OVER, _handleGamePiece_MOUSE_OVER); 
       Sprite(cell[iterator]).addEventListener(MouseEvent.MOUSE_OUT, _handleGamePiece_MOUSE_OUT); 
       cell[iterator].y = cell[iterator].height * r + (spacer*r); 
       cell[iterator].x = cell[iterator].width * c + (spacer*c); 
       GamePiece(cell[iterator]).positionX = cell[iterator].x; 
       GamePiece(cell[iterator]).positionY = cell[iterator].y; 
       GamePiece(cell[iterator]).positionRow = r; 
       GamePiece(cell[iterator]).positionCol = c; 
       target.addChild(cell[iterator]); 
       dictionary[String(iterator)] = cell[iterator] 
       iterator++ 
      } 
     } 

    } 

public function findRelativeMatches(targetSprite:Sprite) : void { 

     targetSprite.alpha = .5; 
     var rootPosition:Number = Number(targetSprite.name); 

     for (var i:int = 0; i < relativePositions.length; i ++) { 
      var key:String = String(rootPosition + relativePositions[i].position); 
      // to do >> Not hardcoded to 'Pig' 
      if (findSprite(key) != null && GamePiece(targetSprite).color == GamePiece(findSprite(key)).color && GamePiece(findSprite(key)).found == false) { 
       var sprite:Sprite = findSprite(key); 
       sprite.alpha = .5; 
       GamePiece(sprite).found = true; 
       matches.push(sprite); 
       findRelativeMatches(sprite); 
      }; 
     }; 

     targetSprite.addEventListener(MouseEvent.MOUSE_OUT, function() : void { 
      if (matches.length != 0) { 
       for (var j:int = 0 ; j < matches.length ; j++) { 
        Sprite(matches[j]).alpha = 1; 
        GamePiece(matches[j]).found = false; 
       } 
       matches.splice(0); 
      } 
     }); 
    } 

public function findSprite(key:String) : Sprite { 
     var sprite:Sprite; 
     dictionary[key] != undefined ? sprite = dictionary[key] : null; 
     return sprite; 
    } 

protected function _handleGamePiece_CLICK(event:MouseEvent):void 
    { 
     for (var j:int = 0 ; j < matches.length ; j++) { 
      var sprite:Sprite = matches[j]; 
      view.removeChild(matches[j]); 

     } 

     matches.splice(0); 
    } 
public function createGamePiece() : Sprite { 
     var gamePiece:GamePiece = new GamePiece(); 
     return gamePiece; 
    } 

回答

0

這實際上是我想要的。一種摺疊方式,不需要迭代整個電路板。這樣,我只需循環通過已刪除的項目。

protected function _handleGamePiece_CLICK(event:MouseEvent):void 
    { 
     for (var j:int = 0 ; j < matches.length ; j++) { 
      var oldSprite:Sprite = matches[j]; 
      moveAllPiecesDown(oldSprite); 
      view.removeChild(oldSprite); 
      oldSprite = null; 
     } 
     matches.splice(0); 
    } 

private function moveAllPiecesDown(oldSprite:Sprite):void 
    { 
     var piecesAbove:int = GamePiece(oldSprite).positionRow; 
     var index:int = int(oldSprite.name); 

     for(var i:int = 0; i < piecesAbove; i ++) { 
      var spriteAbove:Sprite = Sprite(view.getChildByName(String(index-(1+i)))); 
      if(spriteAbove) { 
       spriteAbove.y = spriteAbove.y + spriteAbove.height + 1; 
       spriteAbove.name = String(Number(spriteAbove.name)+1); 
       GamePiece(spriteAbove).textField.text = spriteAbove.name; 
       delete dictionary[spriteAbove.name]; 
       dictionary[spriteAbove.name] = spriteAbove; 
      } 
     } 
    } 
0

想要將網格向下摺疊,對嗎?常見的算法是從每一行的底部向上,第一個空白空間找到一個索引,另一個空間空間上方的第一個空白空間,然後交換這些值,迭代到頂部。但是,您不會以任何可訪問的形式存儲網格!你應該創建一個網格對象,比如說一個精靈矢量的矢量,並且在你移動件時分配它。就像這樣:

var GRID:Vector.<Vector.<Sprite>>; // this should be allocated at createGrid 
// populate GRID with your sprites once generated: 
// put the following into your inner loop in CreateGrid: 
GRID[r][c]=cell[iterator]; 

// and the following into your removal of matches[] sprites: 
GRID[GamePiece(sprite).positionRow][GamePiece(sprite).positionCol]=null; // release link from GRID 

// now to move grid objects: 
function DropAll():void { 
    var i:int; 
    var j:int; 
    for (i=GRID.length-1;i>=0;i--) { 
     var lastEmpty:int=-1; 
     for (j=GRID[i].length-1;j>=0;j--) { 
      if (GRID[i][j]) { 
       if (lastEmpty>0) { 
        GRID[i][lastEmpty--]=GRID[i][j]; 
        // relocate your sprite properly here 
        GRID[i][j]=null; 
       } // else we're still at full part of grid, continue 
      } else if (lastEmpty<0) lastEmpty=j; 
     } 
    } 
} 

要正確實例GRID您需要分配填充有「空」值所需長度的載體。另外,「GRID」本身也是一個Vector,需要實例化。

GRID=new Vector.<Vector.<Sprite>>(); 
for (i=0;i<rows;i++) { 
    var a:Vector.<Sprite>=new Vector.<Sprite>(cols); 
    GRID.push(a); 
} 

後你這樣做,你通過它直接鏈接分配填補了網格,像GRID[r][c]=gameObject;

+0

hm - 我想唯一的問題是如何實例化:var GRID:Vector。>; –

+0

我假設它會是這樣的:public var GRID:Vector。> =新的Vector。>(rows * cols);但這似乎並不奏效。 –

+0

好吧,我正在寫答案的實例代碼,假設你知道它在運行時的行和列號。 – Vesper