2017-05-20 15 views
1

カードデッキをシミュレートする次のコードに問題があります。Javascript whileループ(カードデッキシミュレーション)

デッキは正しく作成されます(それぞれ13個の要素(面の値)を含む4つの配列(スーツ)を含む1つの配列)と、G.test();それは正常に13のランダムなカードを引っ張っているが、39x "Empty"(合計52)を返します。

私は助けを求めるのが嫌いですが、私は一晩中問題を残してしまいましたが、私はまだこれが起こっている理由を見つけることができません。私は提供することができるすべての洞察に感謝します。

var G = {}; 
G.cards = [[], [], [], []]; 

G.newCard = function(v) { //currently a useless function, tried a few things 
    return v; 
}; 

G.deck = {  
    n: function() { //new deck 
     var x; var list = []; 
     list.push(G.newCard("A")); 

     for (x = 2; x <= 10; x += 1) { 
      list.push(G.newCard(x.toString())); 
     } 

     list.push(G.newCard("J"), G.newCard("Q"), G.newCard("K")); 

     for (x = 0; x < G.cards.length; x += 1) { 
      G.cards[x] = list; 
     } 
    }, 

    d: function() { //random card - returns suit & value 
     var s; var c; var v; var drawn = false; var n; 

     s = random(0, G.cards.length); 
     c = random(0, G.cards[s].length); 
     n = 0; 

     while (!drawn) { 
      if (G.cards[s].length > 0) { 
       if (G.cards[s][c]) { 
        v = G.cards[s].splice(c, 1); 
        drawn = true; 
       } else { 
        c = random(0, G.cards[s].length); 
       } 
      } else { 
       s = (s + 1 >= G.cards.length) ? 0 : s + 1; 
       n += 1; 
       console.log(s); 
       if (n >= G.cards.length) { 
        console.log(n); 
        return "Empty"; 

       } 
      } 
     } 
     return {s: s, v: v[0]}; 
    }, 
}; //G.deck 

G.test = function() { 
    var x; var v; 
    G.deck.n(); 
    for (x = 0; x < 52; x += 1) { 
     v = G.deck.d(); 
     console.log(v); 
    } 
}; 
+0

これはランダム関数である、含むことを忘れて: ランダム=関数(MI​​N、MAX){ \tリターンMath.floor(MIN + Math.random()* MAX)。 }; – Deminal

+0

そのランダム関数が問題の一部である可能性があります - この回答を参照してください:http://stackoverflow.com/a/1527820/3586783 – pacifier21

+0

Nope!私がG.cards [s]からスプライシングするとき、それはただ4つの配列からスプライシングするだけではありません...私はまだ理由を理解していないが、少なくとも私はどこかで探し始めなければならない。 – Deminal

答えて

0

これは、同じ(単一)配列インスタンスに結合G.cards[x]のすべての要素を防ぐよう

for (x = 0; x < G.cards.length; x += 1) { 
    G.cards[x] = list.slice(); 
} 

for (x = 0; x < G.cards.length; x += 1) { 
    G.cards[x] = list; 
} 

を交換します。

すべての要素が同じインスタンスに結合する場合、1つの要素を変更することはすべての要素を変更することと同じです。 list.slice()は前述の問題を防ぐためにlistという新しいコピーを作成し、新しい配列インスタンスを作成します。

0

私はあなたのコードを調べませんが、私はあなたが望むことをするコードを作りました。私は1つのデッキのためにこれを作りました。 2つの機能があります.1つはデッキを生成し、もう1つはデッキからカードを引き出し、必要な手の数と各手のために必要なカードの数に基づいています。 1枚のカードが描かれますが、それは再描画されません。私は、短期間でカード取引プログラムの仕事やそれに類するものについての短い記事をhttp://kevinhng86.iblog.websiteで公開するかもしれません。

function random(min, max){ 
    return Math.floor(Math.random() * (max - min)) + min; 
} 


function deckGenerate(){ 
    var output = []; 
    var face = {1: "A", 11: "J", 12: "Q", 13: "K"}; 
    // Heart Space Diamond & Club; 
    var suit = ["H", "S", "D", "C"]; 
    // Delimitter between card identification and suit identification. 
    var d = "-"; 

    for(i = 0; i < 4; i++){ 
     output[i] = []; 
     for(ind = 0; ind < 13; ind++){ 
      card = (ind + 1); 
      output[i][ind] = (card > 10) || (card === 1)? face[card] + d + suit[i] : card.toString() + d + suit[i]; 
     } 
    } 
    return output; 
} 

function randomCard(deck, hand, card){ 
    var output = []; 
    var randS = 0; 
    var randC = 0; 
    if(hand * card > 52) throw("Too many card, I built this for one deck only"); 

    for(i = 0; i < hand; i++){ 
     output[i] = []; 
     for(ind = 0; ind < card; ind++){ 
      randS = random(0, deck.length); 
      randC = random(0, deck[randS].length); 
      output[i][ind] = deck[randS][randC]; 
      deck[randS].splice(randC,1); 
      if(deck[randS].length === 0) deck.splice(randS,1); 
     } 
    } 

    document.write(JSON.stringify(deck, null, 2)); 

    return output; 
} 


var deck = deckGenerate() 
document.write(JSON.stringify(deck, null, 2)); 

document.write("<br><br>"); 

var randomhands = randomCard(deck, 5, 8); 

document.write("<br><br>"); 
document.write("<br><br>"); 


document.write(JSON.stringify(randomhands, null, 2));