获取TypeError:无法调用未定义的getNumber方法

时间:2013-03-20 00:45:47

标签: javascript undefined typeerror

我正在制作一个简单的二十一点程序。我是javascript的新手,我在调试程序时遇到问题。我一直得到TypeError:无法调用未定义的getNumber方法.....我完全迷失了。我正在尝试为每张卡存储数值,但似乎错误发生在printHand()类内的Hand方法中。当打印出两张或更多张卡片的手时,我会在手中的每张卡片中拨打cards[i].getNumber(),其中cards[]是每张牌中的牌组。我没有正确引用卡片[]吗?我仔细检查以确保我的方法和变量设置为公共但我仍然无法弄清楚为什么在未定义的对象上调用getNumber()。我引用这个对象的方式有问题吗?

这是我的代码:

 // Card Constructor
function Card (suit, number){
var the_suit = suit;
var the_number = number;

this.getNumber = function(){
    return the_number;
};
this.getSuit = function(){
    return the_suit;    
};
this.getValue = function (){
    // face cards
    if(the_number > 10){
        return 10;

    // aces
    } else if (the_number < 2){
        return 11;

    // other cards
    } else {
        return the_number;
    }   
};
}

function deal (){
// get card suit
var rand1 = Math.floor(Math.random ( ) * 4 + 1);
// get car number
var rand2 = Math.floor(Math.random ( ) * 13 + 1);

var newCard = new Card(rand1, rand2);
}

function Hand (){
// create two cards for initial hand
var card1 = deal();
var card2 = deal();
// store cards in array
var cards = [card1,card2];

// getter
this.getHand = function (){
    return cards;
};

// get the score
this.score = function(){
    var length = cards.length;
    var score = 0;
    var numAces = 0;

    for(i = 0; i < length; i++){
    if (cards[i].getValue() === 11 ){
    numAces++;
    }   
        score += cards[i].getValue();   
    }
    while(score > 21 && numAces !== 0){
        sum -= 10;
        numAces--;
    }
};
this.printHand = function(){
    var length = cards.length;

    for(i=0; i< length; i++){
    var string = string + cards[i].getNumber() + " of suit " + cards[i].getSuit() + ", ";
    }
    return string;
};

this.hitMe = function(){
    var newCard = deal();
    cards.push(newCard);

}
}

function playAsDealer(){
var newHand = new Hand();
while(newHand.score < 17){
    newHand.hitMe();
}
return newHand;
}

function playAsUser(){
var newHand = new Hand();
var choice = confirm("Current hand: "+ newHand.printHand() + ": Hold (Ok) or Stand(Cancel)");
while(choice){
    newHand.hitMe();
    choice = confirm("Current hand: "+ newHand.printHand() + ": Hold (Ok) or Stand(Cancel)");

}
}

function declareWinner(user, dealer){

//user wins case
if (user.score > dealer.score){
console.log("You are the Champion!");
}

// tie game
else if(user.score===dealer.score){
    console.log("Tied!");
}

else{
    console.log("Loser!!");
}

}


function playGame (){
var user = playAsUser();
var dealer = playAsDealer();
console.log("User's Hand: " + user.printHand());
console.log("Dealer's Hand: " + dealer.printHand());
declareWinner();
}


playGame(); 

2 个答案:

答案 0 :(得分:1)

你不能在功能中退回卡片对象&#34;交易&#34;: 应该是:

function deal (){
   // get card suit
 var rand1 = Math.floor(Math.random ( ) * 4 + 1);
        // get car number
 var rand2 = Math.floor(Math.random ( ) * 13 + 1);

 var newCard = new Card(rand1, rand2);

 return newCard;
}

答案 1 :(得分:1)

有一些问题,但是为了让你开始:

我得到的错误是“TypeError:cards [i]未定义”。因为你正在调用你的deal()函数:

var card1 = deal();

您需要在交易功能中退回该卡,因此请更改

var newCard = new Card(rand1, rand2);

return new Card(rand1, rand2);

您还需要在打印手牌时将:cards [i] .getNumber()转换为字符串