0

私は現在小さなゲームに取り組んでいて、理解できない何かに行き詰まりました。

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);
}
4

2 に答える 2

0

今のところ私がしたことは、最初に行のある配列をループし、次の行が使用可能かどうかを確認してから、それらの2行を選択可能な別の配列にプッシュすることでした。

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);
}
于 2013-03-15T07:46:19.083 に答える
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

于 2013-03-15T08:57:42.723 に答える