Javascript while loop(卡片组模拟)



我在以下模拟卡组的代码中遇到了问题。

套牌创建正确(1 个数组包含 4 个数组(花色(,每个数组包含 13 个元素(面值((,当我使用 G.test((; 函数时,它正确地抽取了 13 张随机牌,但随后返回 39 倍"空"(总共 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);
    }
}; 

替换

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的新副本,从而创建一个新的阵列实例以防止上述问题。

我不会浏览你的代码,但我构建了一个代码,可以做你想要的。我只为一副牌而不是多副牌游戏构建了这个。有两个功能,一个将生成套牌,另一个将从套牌中抽出牌,具体取决于您需要多少手牌以及每手牌想要多少张牌。一张卡被抽出,它不会被重新抽出。我可能会在 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"];
    // Delimiter 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) );

相关内容

  • 没有找到相关文章

最新更新