根据大小从数组中进行选择

时间:2013-03-15 06:18:35

标签: javascript arrays random

我目前正在制作一款小游戏,并且遇到了一些我无法弄清楚的问题。

我有一个包含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);
}

2 个答案:

答案 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.您必须对此进行一些更改。

jsbin:http://jsbin.com/upabom/3/edit