0

私はマッチ 3 エンジンを作成しており、一致するアイテムを見つけるために巨大なループを使用して一致を作成することに成功しています。空のスペースをアイテムで埋める (空のスペースにドロップダウンする) 方法と、過剰なループや 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;
    }
4

2 に答える 2

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;
            }
        }
    }
于 2012-09-04T22:27:32.807 に答える
0

グリッドを下に折りたたむ必要がありますよね? 一般的なアルゴリズムは、すべての行の下から上に向かって、最初に見つかった空きスペースの 1 つのインデックスと、空きスペースの上にある最初の占有スペースのインデックスをもう 1 つ持ち、見つかったらそれらの値を交換して、一番上まで繰り返します。しかし、アクセス可能な形式でグリッドを保存しません! スプライトのベクトルのベクトルなどのグリッド オブジェクトを作成し、ピースを移動するときにそれに値を割り当てる必要があります。このような:

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 を適切にインスタンス化するには、「null」値で満たされた目的の長さのベクトルを割り当てる必要があります。また、「GRID」自体はベクターであり、インスタンス化する必要もあります。

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

これを行った後、次のようにリンクを直接割り当てて GRID を埋めます。GRID[r][c]=gameObject;

于 2012-08-30T04:07:42.710 に答える