Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:使用if语句运行while循环以随机生成带有子句的内容_Javascript_If Statement_Random_Do While_Phaser Framework - Fatal编程技术网

Javascript:使用if语句运行while循环以随机生成带有子句的内容

Javascript:使用if语句运行while循环以随机生成带有子句的内容,javascript,if-statement,random,do-while,phaser-framework,Javascript,If Statement,Random,Do While,Phaser Framework,好的,我的问题很具体。我正在尝试为我正在制作的2D平台随机生成一个游戏舞台。我希望平台之间有一定的距离,并且我希望创建的平台数量是可配置的。我认为最好的方法是使用一个while循环,该循环中嵌套了if语句,我已经尝试过了,但无法让它工作。这是我试过的 var numLedges = 10; var lastLedge; var xSpace = randomIntFromInterval(0, 600); var ySpace = randomIntFromInterval(0, 400); v

好的,我的问题很具体。我正在尝试为我正在制作的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)
}
var numLedges=10;
var lastLedge;
var xSpace=randomIntFromInterval(0600);
var ySpace=randomIntFromInterval(0400);
var currentLedgeX=xSpace;
var currentLedgeY=ySpace;
var lastLedgeX=-1000;
var lastLedgeY=-1000;
var i=0;
var-loopCount=0;
var maxLoops=100;
函数randomIntFromInterval(最小值、最大值)
{
返回Math.floor(Math.random()*(max-min+1)+min);
}
函数createLedges(){
这样做是为了确保平台在任何方向上以100px的速度创建
如果(currentLedgeX>lastLedgeX+100 | | currentLedgeXlastLedgeY+100 | | currentLedgeY
这看起来不是循环,或者它在某种程度上随机地变成了一个无限循环。如果有人能想出一个更好的方法来做这件事,或者一个让这件事成功的方法,我将不胜感激。我没有主意了,在这个问题上找不到任何有用的东西


下面是一个使用旧教程游戏的快速示例

您的问题在于循环条件
,而(i!=numLedges | | loopCount
。它创建了一个奇怪的行为,因为在程序运行之前,您无法判断
|
两侧的两个条件何时将同时计算为true(如果在无限循环的情况下)。基本上,您已经创建了一个竞争条件,如果
i
loopCount
达到100之前变得大于10(
numLedges
),那么您将陷入无限循环

您可能想要一个条件
&&
,就像上面@Tony在评论中建议的那样:

while(i!=numLedges | | loopCount

我在下面给出了一个解释: 将常量变量替换为数值后再看:

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
(loopCount<100)//将为true,直到loopCount达到100

尝试:
而(i
这可能更简单。请原谅我的语法,我现在处于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;

    }
}
函数getRandomBoolean() { 返回Math.random()<0.5; } 函数createLedges(){ 对于(i=0;i
这将创建与指定数量完全相同的壁架,并且它们在X和Y方向上始终至少相隔100个单位。您可以将最大值更改为您想要的任何值。理想情况下,您可以将其创建为变量,但为了便于阅读,我对其进行了硬编码

我认为问题在于
I!=轻推
i==numLedges
的情况可能是
loopCount
停止为真的转折点。然后,下一次迭代放入
i!=numLedges
然后循环子句与其余执行无关,因为
i
将永远不会返回到
numLedges
。这有意义吗?尝试打印出循环条件变量,看看发生了什么。另外,在(i!=numLedges&&i时执行
可能更有意义
maxLoops
看起来很像
maxLedges
好的,所以我的问题非常具体。
太好了。也许我读错了,但是在创建一个ledge并将lastLedgeX设置为currentLedgeX(和Y)之后,currentLedgeX(和Y)再也不会改变,我不认为。例如,如果currentLedgeX从600开始,它将触发if语句,lastLedgeX将变为600。然后它会再次检查,但是currentLedgeX将是600,lastLedgeX也将是600,而且它们永远不会改变。谢谢大家的帮助!我明白你在说什么了,托尼,不知道我写那封信时是怎么想的。我会尝试一下,然后再回复你,布罗马诺夫总理,我只是想这可能是个问题,因为我只能让它产生一个似乎只有一个平台的东西。很可能它们都是叠在一起的,很好的观察!沃伦,我写这篇文章时很累,放松点!注意:我快速通读了一遍,没有试图完全理解您的逻辑在做什么。谢谢,这完美地修复了无限循环崩溃!看来我会尽快试试这个,然后再打给你