我目前正在制作一款小游戏,并且遇到了一些我无法弄清楚的问题。
我有一个包含5个项目的数组,这些项目代表不同的位置,如下所示:
[1, 2, 3, 4, 5]
这些基本上是不同的线,用于在玩家进一步进入游戏时放置对象。
应该出现每5秒钟的新对象,这些对象来自另一个数组,看起来像这样:
[1, 2]
// 1 = single item
// 2 = double item
1和2是不同类型的对象,两者都需要不同数量的行。
问题是这些项目有时会重叠,我无法弄清楚如何阻止它。
您可以从输出中看到问题:
Items: [1, 2]
[Item of type 1] line: 3
[available lines] [1, 2, 3, 4, 5]
[Item of type 2] line: 2
[available lines] [1, 2, 4, 5]
[1, 5]
所以第1项(1行)放在第3行,但对于第2项(2行),选择第2行,因为它是2行宽,这将与我的第一项重叠。
所以基本上对于第2项,只能选择第1行和第4行,但我似乎找不到任何只选择这些的逻辑。
它可能会被扩展为大约20行,包含更多对象,因此我需要找到一种方法来选择下一行也可用的行。
关于我如何开始这方面的任何想法?
我目前使用的是:
var random = Math.floor(Math.random() * (start_lines.length - 1));
var line = start_lines[random];
// If it's a barrier, delete 2 rows instead (35)
if(type == 2) {
if(line == 5) {
xPos = this._lines[random - 1] - 35;
start_lines.splice(random - 1, 2);
} else {
xPos = this._lines[random] - 35;
start_lines.splice(random, 2);
}
} else {
start_lines.splice(random, 1);
}
答案 0 :(得分:0)
我现在所做的是首先用数组循环遍历数组并检查下一行是否可用,然后将这两行推入另一个我可以选择的数组。
if(type == 2) {
var options = [];
for(var i = 0 ; i < start_lines.length; i++) {
var f = start_lines[i];
var n = start_lines[i + 1];
if((f + 1) == n) {
options.push([f, n]);
}
}
var random = Math.floor(Math.random() * (options.length - 1));
var option = options[random];
var f = option[0];
var n = option[1];
xPos = this._lines[f] - 30;
start_lines.splice(f - 1, 2);
start_lines.splice(n - 1, 2);
} else {
var random = Math.floor(Math.random() * (start_lines.length - 1));
var line = start_lines[random];
start_lines.splice(random, 1);
}
答案 1 :(得分:0)
我不知道这种方法是否符合您的要求,但如果您最初可以设置线条并在需要时随机选择一条线条会更好。这避免了很多混乱。
function getLines(){
var start_lines = [1, 2, 3, 4, 5], lines = [];
while(start_lines.length){
var type = Math.ceil(Math.random() * 2);
lines.push(start_lines.splice(0, type));
}
return lines;
}
var lines = getLines();
var random = Math.floor(Math.random() * lines.length);
console.log(lines.splice(random, 1));
在这里,我随机选择type
- 1或2.您必须对此进行一些更改。