奇怪的阵列问题 - 改变长度,预定义的第一个元素

时间:2013-02-07 16:01:28

标签: arrays actionscript-3

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

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尝试。

所以,如果有人能帮助解决这些问题,我将非常感激。感谢。

2 个答案:

答案 0 :(得分:1)

您无法比较动作中的两个以上项目:

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

它总会返回true(我认为)。代替:

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

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

答案 1 :(得分: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)始终为假。

由于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会有所不同。

我希望有所帮助。