Javascript 创建扑克牌

Javascript 创建扑克牌,javascript,object,Javascript,Object,在JavaScript中创建对象时遇到问题 试图创建一副扑克牌,然后我可以显示我想要的。我很擅长用HTML来显示它们,只是在理解JavaScript中我做错了什么时遇到了一个问题,JavaScript只是在为我创建未定义的卡片 (function () { function Card (rank, suit) { this.rank = rank; this.suit = suit; }; function Deck() { this.deck = new Ar

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

试图创建一副扑克牌,然后我可以显示我想要的。我很擅长用HTML来显示它们,只是在理解JavaScript中我做错了什么时遇到了一个问题,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]);
    }
}


   } ());
(函数(){
功能卡(等级、套装){
这个.等级=等级;
这套衣服;
};
功能组(){
this.deck=新数组();
this.makeDeck=makeDeck;
this.shuffle=洗牌;
this.deal=deal;
}
函数makeDeck(){
var等级=新数组(“A”、“2”、“3”、“4”、“5”、“6”、“7”、“8”、“9”、“10”,
“J”、“Q”、“K”);
var套装=新阵列(“梅花”、“钻石”、“灵车”、“黑桃”);
this.deck=新阵列(52);
varⅠ,j;
对于(i=0;i<0.length;i++){
对于(j=0;j0){
返回此.deck.shift();
}
否则返回null;
};
var甲板=新甲板();
deck.makeDeck();
洗牌();
对于(i=0;i<2;i++){
对于(j=0;j<5;j++){
var卡=新卡(牌组.交易);
var c=JSON.stringify(卡片);
文件。书写(本甲板[j]);
}
}
} ());

这是有问题的一行:

this.deck=新卡(排名[j],适合[i])

this.deck
应该是包含所有卡的数组,但是在上面的行中,您每次都用一张新卡覆盖它

您有两种选择: 第一选择 不要使用
this.deck=newarray(52)
,而是使用
this.deck=[]
将空数组初始化为this.deck

然后使用
this.deck.push(新卡(等级[j],套装[i]))
将所有卡的组合推送到你的牌组中

第二种选择 第一个选项的问题是,
array.push
实际上效率不高。阅读更多信息。对于一个52大小的阵列来说,这并不重要,只要把它放在桌子上,让每个人都知道


或者,您可以使用
this.deck[i]=新卡(等级[j],套装[i])
来填充阵列。您可以为此使用
this.deck=[]
this.deck=new数组(52)
。这两种方法都可行。

我不是JS方面的专家,但有一件事让我感到震惊,那就是你的牌组分配周期
this.deck=新牌(等级[j],适合[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]);
        }
    }
for(i=0;i
可能这就是为什么您没有希望在“主要”执行部分中形成的组块的原因:

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]);
    }
}
var deck=新deck();
deck.makeDeck();
洗牌();
对于(i=0;i<2;i++){
对于(j=0;j<5;j++){
var卡=新卡(牌组.交易);
var c=JSON.stringify(卡片);
文件。书写(本甲板[j]);
}
}
有几件事值得注意

  • var卡
    var卡=新卡(deck.deal)更改为
    var卡
    ,因为变量
    Card
    在第一次迭代后覆盖函数
    Card
  • deck.deal
    是一个函数。您需要的是
    deck.deal
    的返回值,因此,必须使用
    deck.deal()
  • document.write(这个.deck[j])-您应该改用
    deck.deck[j]
    ,因为您需要访问在
    var-deck
    中初始化的卡片组,要访问实际卡片组,您需要访问对象卡片组的卡片组属性。因此,您需要使用
    deck.deck[j]

  • 1.数组文字语法(
    ['a',b']
    )通常比使用
    数组
    构造函数更可取。2.看看你在
    makedeck
    中做了什么。3.您应该使用DOM方法,例如
    document.body.appendChild(document.createTextNode('x'))
    ,而不是
    document.write
    。不理解您所说的内容。事实上,这个答案不再算数。我看到你已经编辑了你的问题,并且解决了这个问题。我发布了另一个答案,因为我看到了另一个问题。其他问题有什么进展吗?检查我的其他答案。好的,做了你说的更改。很有道理,谢谢你。deck.deck[j]刚刚从[object]上掉落一个[object](8次)。如果您知道从哪里开始,我非常感谢您的帮助。这是因为您直接使用
    document.write
    打印它。HTML不能理解对象,JavaScript可以。如果需要查看等级和西装,请从
    deck.deck[j]
    获取值。试着打印
    deck.deck[j].rank
    deck.deck[j].suit
    。好的,对不起,我刚才说到这里了。是的,那些
    deck.deck[j].suit似乎没有输出任何值。想知道为什么你发布了多个答案。。农业代表要求对他们每个人进行投票。。?!