0

を使用して、オブジェクトのデッキ配列をCardオブジェクトのnewDeck配列にランダムにシャッフルしようとしています。私の問題は、変数のスコープに関係するものか、.Cardarray.splice()array.splice()

var deck = [new Card(), new Card(), new Card(), new Card(), new Card(), new Card()];
var newDeck = [];
var shuffle = function(){
    var i = "";
    for (i = 0; i < deck.length; i++){      
        newDeck[i] = deck.splice(Math.floor(Math.random() * deck.length, 1));
}    
};

shuffle();

デッキをシャッフルする良い方法はありますか?

4

3 に答える 3

2

はい、について誤解がありarray.splice()ます。ドキュメントを読んでください:それはあなたの場合、1枚のカードで削除された要素の配列を返します:[<object Card>]。また、を使用するdeck.splice(Math.floor(Math.random() * deck.length, 1))と、1(削除するカードの数になるはずです)は、Math.floorではなく、の引数にspliceなります。インデックスの後のすべての要素を削除します。だから、あなたは望んでいるようです:

function shuffle(deck) {
    var newDeck = [];
    for (var i = 0; i < deck.length; i++)    
        newDeck[i] = deck.splice(Math.floor(Math.random() * deck.length), 1)[0];
    return newDeck;
}    
shuffle([new Card(), new Card(), new Card(), new Card(), new Card(), new Card()]);

あなたはシャッフルする他の方法を求めました:あなたは非常に一般的なものを使うことができます

deck.sort(function(a, b){ return 0.5-Math.random(); })

またはunderscore.jsのアルゴリズム:

function shuffle(deck) {
    var newDeck = [];
    for (var i = 0; i < deck.length; i++) {    
        var rand = Math.floor(Math.random() * (i + 1));  
        newDeck[i] = newDeck[rand];
        newDeck[rand] = deck[i];
    }
    return newDeck;
}  
于 2012-05-23T11:41:28.627 に答える
0

forサイクルを逆にします。

for (i = deck.length - 1; i >= 0; i--)
    newDeck.push(deck.splice(Math.floor(Math.random() * deck.length))[0]);

あなたが抱えている問題はdeck.length、サイクルが実行されるたびに減少することですdeck.splicedeck.lengthまたは、スクリプトを実行する前に別の変数に保存することもできます。

var length = deck.length;
for (i = 0; i < length; i++){      
    newDeck[i] = deck.splice(Math.floor(Math.random() * deck.length))[0];

ただし、サイクル内では、を使用する必要がありますdeck.length

注:Math.floor引数は1つだけです。あの「、1」は何だったの?またi = ""、その値は使用されていないため、初期化は無意味です。置くだけvar i;

編集:の戻り値に関する欠落点を修正しましたArray.splice

于 2012-05-23T10:53:49.057 に答える
0

その場合に車輪の再発明をしたくない場合は、 underscore.jsArray#shuffleのメソッドを使用することもできます;)

于 2012-05-23T11:04:56.163 に答える