0

配列にランダムな値を生成したいと思います。しかし、クリックするたびに、配列は新しい値を取得するため、配列に既に値があるランダムな値を取得したくありません。一言で言えば、配列の空の値をランダムにする必要があります。

コードの一部を次に示します。配列には 9 つの値があり、最初はすべて空です。

var gameCase = ['', '', '', '', '', '', '', '', ''];
var randomValue = gameCase[VALUE_EMPTY*][Math.round(Math.random()*gameCase.length)];

※ここがよくわからない部分です。

4

1 に答える 1

3

これにアプローチする方法はいくつかあります。

方法 1:空の値を指すまでランダム インデックスを生成し続ける

var gameCase = ['', '', '', '', '', '', '', '', ''];
var randomIndex = Math.round(Math.random()*gameCase.length) % emptyCases.length;
var randomValue = gameCase[randomIndex];
// while we haven't found the empty value
while (randomValue !== '') {
    // keep on looking
    randomIndex = Math.round(Math.random()*gameCase.length % emptyCases.length);
    randomValue = gameCase[randomIndex];
}
// when we exit the while loop:
//     - randomValue would === ''
//     - randomIndex would point to its position in gameCase[]

方法 2:gameCase配列のどのインデックスが空の値を持つかを追跡する 2 番目の配列を用意する

var gameCase = ['', '', '', '', '', '', '', '', ''];
var emptyCases = [0,1,2,3,4,5,6,7,8];

if (emptyCases.length > 0) {
    // generate random Index from emptyCases[]
    var randomIndex = emptyCase[Math.round(Math.random()*emptyCase.length) % emptyCases.length];
    // get the corresponding value
    var randomValue = gameCase[randomIndex];
    // remove index from emptyCases[]
    emptyCases.splice(randomIndex, 1);
}

方法 2 は、ランダムなインデックスを生成/推測する無駄な時間がないため、ある意味でより効率的です。方法 #1 の場合、空の値が残っているかどうかgameCase[]を確認する方法が必要です。そうしないと、無限ループで永遠に生成/推測している可能性があります。

詳細:の値を設定するときは、次の状態を正確に反映するために適宜gameCase[]更新する必要があります。emptyCases[]gameCase[]

var gameCase = ['', '', '', '', '', '', '', '', ''];
var emptyCases = [0,1,2,3,4,5,6,7,8];

/* Update a value in gameCase[] at the specified index */
var setGameCaseValue = function(index, value) {
    // set value for gameCase[]
    gameCase[index] = value;

    if (value !== '') {    // we're setting a value
        // remove that index from emptyCases[]
        emptyCases.splice(emptyCases.indexOf(index), 1);   
    } else {    // we're setting it back to empty string
        // add that index into emptyCases[] that refers to the empty string in gameCase[]
        emptyCases.push(index);        
    }
};

setGameCaseValue(2, 'null');
// gameCase now has ['','','null','','','','','','']
// emptyCases now has [0,1,3,4,5,6,7,8]

setGameCaseValue(0, 'null');
// gameCase now has ['null','','null','','','','','','']
// emptyCases now has [1,3,4,5,6,7,8]

setGameCaseValue(5, 'null');
// gameCase now has ['null','','null','','','null','','','']
// emptyCases now has [1,3,4,6,7,8]

setGameCaseValue(7, 'null');
// gameCase now has ['null','','null','','','null','','null','']
// emptyCases now has [1,3,4,6,8]

フィドルを参照してください:http://jsfiddle.net/rWvnW/1/

于 2013-04-13T15:51:24.810 に答える