制作扑克牌

时间:2014-10-08 01:46:01

标签: javascript object

在JavaScript中创建对象时遇到问题。

尝试创建一副扑克牌,然后我可以随时显示。我很擅长HTML的东西来显示它们,只是有一个问题来理解我在JavaScript中做错了什么,这只是为我创建了未定义的卡片。

(function () {

function Card (rank, suit) {

    this.rank = rank;
    this.suit = suit;

};

function Deck() {

    this.deck = new Array();

    this.makeDeck = makeDeck;
    this.shuffle = shuffle;
    this.deal = deal;
}
function makeDeck() {

    var ranks = new Array("A", "2", "3", "4", "5", "6", "7", "8", "9", "10",
                    "J", "Q", "K");
    var suits = new Array("Clubs", "Diamonds", "Hears", "Spades");

    this.deck = new Array(52);

    var i, j;
    for (i = 0; i < suits.length; i++) {
        for (j = 0; j < ranks.length; j++) {
            this.deck[i*ranks.length + j] = new Card(ranks[j], suits[i]);
            document.write("Card made \n");
        }
    }
};

function shuffle() {
    var i, n, j, temp;
    for (i = 0; i < n; i++) {
        for (j = 0; j < this.deck.length; j++) {
            k = Math.floor(Math.random() * this.deck.length);
            temp = this.deck[j];
            this.deck[j] = this.deck[k];
            this.deck[k] = temp;
        }
    }
    document.write("Cards Shuffled");
};



function deal() {

    if (this.deck.length > 0) {
        return this.deck.shift();
    }
    else return null;
};

var deck = new Deck();

deck.makeDeck();
deck.shuffle();
for (i = 0; i < 2; i++) {
    for (j = 0; j < 5; j++) {
        var Card = new Card(deck.deal);
        var c = JSON.stringify(Card);
        document.write(this.deck[j]);
    }
}


   } ());

3 个答案:

答案 0 :(得分:3)

这是有问题的一行:

this.deck = new Card(ranks[j], suits[i]);

this.deck应该是包含所有卡片的阵列,但是使用上面一行,你每次使用一张新卡就会覆盖它。

您有两个选择:

第一个选项

而不是this.deck = new Array(52),而是使用this.deck = [],将空数组初始化为this.deck。

然后使用this.deck.push(new Card(ranks[j], suits[i]))将卡的所有组合推送到您的套牌。

第二个选项

第一个选项的问题是array.push效率不高。请阅读this了解详情。对于52个大小的阵列而言,这并不重要,只需将其放在桌面上以供每个人使用。

或者,您可以使用this.deck[i] = new Card(ranks[j], suits[i])填充数组。您可以使用this.deck = []this.deck = new Array(52)。要么工作。

答案 1 :(得分:2)

在你的&#34; main&#34;执行部分:

var deck = new Deck();

deck.makeDeck();
deck.shuffle();
for (i = 0; i < 2; i++) {
    for (j = 0; j < 5; j++) {
        var Card = new Card(deck.deal);
        var c = JSON.stringify(Card);
        document.write(this.deck[j]);
    }
}

有几点值得注意。

  1. var Card更改var Card = new Card(deck.deal);,因为变量Card会在第一次迭代后覆盖函数Card
  2. deck.deal是一个功能。您需要的是deck.deal的返回值,因此,您必须使用deck.deal()
  3. document.write(this.deck[j]); - 您应该使用deck.deck[j]代替,因为您需要访问的是您在var deck初始化的套牌,以及访问实际卡片组,您需要访问对象组的甲板属性。因此,您需要使用deck.deck[j]

答案 2 :(得分:0)

我不是JS的专家,但有一件事对我来说就是在你的周期中,甲板分配this.deck = new Card(ranks[j], suits[i]);不应该在你创建卡片时编入索引:

for (i = 0; i < suits.length; i++) {
        for (j = 0; j < ranks.length; j++) {
            this.deck[ranks.length*i+j] = new Card(ranks[j], suits[i]);
        }
    }

可能这就是为什么你没有你希望形成的套牌