0

这是我创建的一段基本代码,它生成一个随机的双色关卡:

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);

问题有两个方面。一,每当数组生成时,长度似乎有一个随机的变化——使用 trace(map.length) 我得到了很多不同的长度,从 750 到 780,而它最多只能是 400。

其次,每当我跟踪关卡本身时,使用 trace(map) 我发现第一个元素似乎默认设置为 1。我无法弄清楚它为什么这样做,因为它应该在 20 之后至少一次为 2尝试。

4

2 回答 2

1

您不能在 actionscript 中比较超过 2 个项目:

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

它总是会返回 true(我认为)。反而:

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

此外,看起来每个循环都可以执行 map.push("1") 和 map.push("2") - 因此 map 大于 mArea - 我认为它应该做一个或另一个?

于 2013-02-07T16:54:41.477 回答
0

问题2:map的第一个元素默认为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总是正确的。

因此 map 的第一个元素总是“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 回答