Javascript: 运行 带有 if 语句的 while 循环随机生成带有子句的东西

Javascript: Running a while loop with an if statement to randomly generate things with a clause

好的,所以我的问题非常具体。我正在尝试为正在制作的 2D 平台游戏随机生成游戏阶段。我希望平台之间保持一定的距离,并且我希望创建的平台数量是可配置的。我相信最好的方法是使用一个 while 循环,其中嵌套了一个 if 语句,我已经尝试过但无法让它工作。这是我试过的。

var numLedges = 10;
var lastLedge;
var xSpace = randomIntFromInterval(0, 600);
var ySpace = randomIntFromInterval(0, 400);
var currentLedgeX = xSpace;
var currentLedgeY = ySpace;
var lastLedgeX = -1000;
var lastLedgeY = -1000;
var i = 0;
var loopCount = 0;
var maxLoops = 100;

function randomIntFromInterval(min,max)
{
    return Math.floor(Math.random()*(max-min+1)+min);
}

function createLedges() {
        do {   // This is supposed to make sure the platforms are being created 100px away in any direction
                if (currentLedgeX > lastLedgeX + 100 || currentLedgeX <     lastLedgeX - 100 && currentLedgeY > lastLedgeY + 100 || currentLedgeY <     lastLedgeY - 100) {
// Creates a ledge using phaser that is roughly 40 x 40px
                    var currentLedge = stillLedge.create(currentLedgeX,     currentLedgeY, 'platform');
                    currentLedge.body.immovable = true;
                    lastLedgeX = currentLedgeX;
                    lastLedgeY = currentLedgeY;
                    i++;
                }
            loopCount++;
        } while (i != numLedges || loopCount < maxLoops)
}

这似乎没有循环,或者它有点随机地变成了无限循环。如果有人能想到更好的方法或方法来完成这项工作,我将不胜感激。我没主意了,没能找到任何对这个主题有用的东西。

这里有一个简单的例子,说明使用旧教程的游戏时发生了什么。 CLICK

您的问题出在循环条件 while (i != numLedges || loopCount < maxLoops) 上。它产生了一种奇怪的行为,因为你无法在程序 运行 之前判断 || 两侧的两个条件何时同时评估为真(如果在这种情况下)无限循环)。基本上你已经创建了一个竞争条件,如果 iloopCount 达到 100 之前变得大于 10 (numLedges) 那么你就会陷入无限循环。

You probably wanted an AND condition && like @Tony suggested above in a comment:

while (i != numLedges || loopCount < maxLoops)

我在下面提供了解释:

用数值替换常量变量看一下:

while (i != 10 || loopCount < 100)

并考虑这个非常真实的例子,说明您要让程序做什么:

(i != 10) // will always be true except for when i is 10

(loopCount < 100) // will be true until loopcount reaches 100

尝试:while (i < numLedges && loopCount < maxLoops)

这可能更简单。请原谅我的语法,我现在处于 AS3 模式,所以我会尽力让它成为 JS。我写这个假设你是从左到右,从上到下(左上原点),但它应该在任何情况下都有效。

function getRandomBoolean() 
{
       return Math.random() < 0.5;
}
function createLedges() {
    for (i = 0; i < numLedges; i++)
    {


        lastLedgeX = currentLedgeX;
        lastLedgeY = currentLedgeY;
        var randomX = randomIntFromInterval(currentLedgeX + 100, currentLedgeX + 500);
        var randomY = randomIntFromInterval(currentLedgeY + 100, currentLedgeY + 500);
        if (getRandomBoolean()) randomX *= -1
        if (getRandomBoolean()) randomY *= -1

        currentLedgeX += randomX;
        currentLedgeY += randomY;

       var currentLedge = stillLedge.create(lastLedgeX,     lastLedgeY, 'platform');
        currentLedge.body.immovable = true;

    }
}

这将创建与您指定的数量完全相同的壁架,并且它们在 X 和 Y 方向上始终至少相隔 100 个单位。您可以将最大值更改为您想要的任何值。理想情况下,您可以将它们创建为变量,但为了便于阅读,我对其进行了硬编码