0

私は単純なブラックジャックプログラムに取り組んでいます。私は JavaScript がまったく初めてで、プログラムのデバッグに問題があります。TypeError: cannot call getNumber method of undefined..... が発生し続け、完全に迷っています。各カードに格納されている数値を取得しようとしていますが、クラスprintHand()内のメソッドでエラーが発生しているようです。Hand2 枚以上のカードの手札を出力するときは、手札の各カードをループして、各手札のカードの配列を呼び出し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(); 
4

2 に答える 2

1

関数「deal」でカードオブジェクトを返さないでください。次のようにする必要があります。

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;
}
于 2013-03-20T01:03:23.157 に答える
1

いくつかの問題がありますが、始めるには:

私が得たエラーは「TypeError:cards[i] is undefined」でした。deal() 関数を次のように呼び出しているため:

var card1 = deal();

取引機能でカードを返却する必要があるので、変更します

var newCard = new Card(rand1, rand2);

return new Card(rand1, rand2);

また、ハンドを印刷するときに、cards[i].getNumber() を文字列に変換する必要があります。

于 2013-03-20T01:05:51.603 に答える