Javascript while循环(卡牌模拟)

时间:2017-05-20 23:16:12

标签: javascript playing-cards

我遇到以下代码模拟卡片组的问题。

正确创建了牌组(1个阵列包含4个阵列(套装),每个阵列包含13个元素(面值))当我使用G.test()时;功能是正确拉动13张随机牌,但随后返回39x“空”(共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);
    }
}; 

2 个答案:

答案 0 :(得分:0)

替换

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

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

因为这会阻止G.cards[x]的所有元素绑定到同一个(单个)数组实例。

如果所有元素都绑定到同一个实例,那么改变一个元素就等于改变所有元素。 list.slice()创建list的新副本,从而创建一个新数组实例以防止出现上述问题。

答案 1 :(得分:0)

我不会查看您的代码,但我构建了一个可以执行您想要的代码。我只为一个甲板而不是多甲板游戏构建了这个。有两个功能,一个将生成牌组,另一个将从牌组中抽出牌,基于你需要多少牌牌以及你想要每张牌多少张牌。一张卡片被绘制,它不会被重新绘制。我可以在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) );