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)
上。它产生了一种奇怪的行为,因为你无法在程序 运行 之前判断 ||
两侧的两个条件何时同时评估为真(如果在这种情况下)无限循环)。基本上你已经创建了一个竞争条件,如果 i
在 loopCount
达到 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 个单位。您可以将最大值更改为您想要的任何值。理想情况下,您可以将它们创建为变量,但为了便于阅读,我对其进行了硬编码
好的,所以我的问题非常具体。我正在尝试为正在制作的 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)
上。它产生了一种奇怪的行为,因为你无法在程序 运行 之前判断 ||
两侧的两个条件何时同时评估为真(如果在这种情况下)无限循环)。基本上你已经创建了一个竞争条件,如果 i
在 loopCount
达到 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 个单位。您可以将最大值更改为您想要的任何值。理想情况下,您可以将它们创建为变量,但为了便于阅读,我对其进行了硬编码