0

これは、ランダムな 2 色のレベルを生成する、私が作成した基本的なコードです。

var map:Array = new Array();

var mLength:int = 28;
var mHeight:int = 16;
var mArea:int = mLength * mHeight;

var tileWidth:int = 20;
var tileHeight:int = 20;
var tileX:int = 0 - tileWidth;
var tileY:int = 0;
var genTile:int;
var genDone:Boolean = false;

var waterChance:int = 10;
var grassChance:int = 33;
var tile:Sprite = new Sprite();
var waterTile:Sprite = new Sprite();
var waterHolder:Sprite = new Sprite();
var genericTileHolder:Sprite = new Sprite();

var hitting:Boolean = false;

var i:int = 0;

for (i = 0; i < mArea; i++) {
    if (map[i - 27] == 1) {
        waterChance * 8;
        grassChance / 2;
    }
    if (map[i - 28] == 1) {
        waterChance * 8;
        grassChance / 2;
    }
    if (map[i - 29] == 1) {
        waterChance * 8;
        grassChance / 2;
    }
    if (map[i - 1] == 1) {
        waterChance * 8;
        grassChance / 2;
    }
    tileX += tileWidth;
    if (tileX >= mLength * tileWidth) {
        tileX = 0;
        tileY += tileHeight;
    }
    genTile = (Math.round((Math.random()*(waterChance+grassChance))));

    if (0 < genTile < waterChance) {
        waterTile.graphics.beginFill(0x0033CC);
        waterTile.graphics.drawRect(tileX,tileY,tileWidth,tileHeight);
        waterHolder.addChildAt(waterTile, 0);
        map.push("1");
    }
    if ((waterChance + 1) < genTile && genTile < (waterChance + grassChance)) {
        tile.graphics.beginFill(0x216B18);
        tile.graphics.drawRect(tileX,tileY,tileWidth,tileHeight);
        genericTileHolder.addChildAt(tile, 0);
        map.push("2");
    }
    grassChance = 33;
    waterChance = 10;

}
stage.addChildAt(waterHolder, 0);
stage.addChildAt(genericTileHolder, 1);

問題は 2 つあります。1つは、配列が生成されるたびに、長さにランダムなビットの変動があるように見えます- trace(map.length) を使用すると、750 から 780 までのさまざまな長さが得られますが、多くても 400 である必要があります。

次に、trace(map) を使用してレベル自体をトレースするたびに、最初の要素がデフォルトで 1 に設定されているように見えます。試みます。

4

2 に答える 2

1

actionscript で 2 つ以上のアイテムを比較することはできません。

if (0 < genTile < waterChance) {...

それは常にtrueを返します(私は思う)。その代わり:

if ((0 < genTile) && (genTile < waterChance)) {...

また、各ループが map.push("1") および map.push("2") を実行できるように見えます-したがって、マップは mArea よりも大きくなります-どちらかを実行する必要があると思いますか?

于 2013-02-07T16:54:41.477 に答える
0

問題2:マップの最初の要素はデフォルトで1です

if (0 < genTile < waterChance)
{
    waterTile.graphics.beginFill (0x0033CC); // Blue
    waterTile.graphics.drawRect (tileX,tileY,tileWidth,tileHeight);
    waterHolder.addChildAt (waterTile, 0);
    map.push ("1");
}

<演算子は左結合であるため、式はとして評価されます(0 < genTile) < waterChance

genTileが0未満になることはないため、(0 < genTile)常にfalseになります。

また、waterChanceも0を下回ることはないため、(false < waterChance)

これ(0 < waterChance)は常に真実です。

それは(0 < genTile) < waterChance常に真実です。

したがって、マップの最初の要素は常に「1」です。

問題1:map.lengthが変化する

if ((waterChance + 1) < genTile && genTile < (waterChance + grassChance))
{
    tile.graphics.beginFill (0x216B18); // Green
    tile.graphics.drawRect (tileX,tileY,tileWidth,tileHeight);
    genericTileHolder.addChildAt (tile, 0);
    map.push ("2");
}

mAreaは448に等しいので、水タイルは常に合計448になります。

また、genTileは乱数であるため、草のタイルは常に乱数になります。

したがって、map.lengthは異なります。

それがお役に立てば幸いです。

于 2013-02-08T10:12:28.660 に答える