0

ブラックジャック ゲーム: 以下のディール関数を作成しました。これは、スーツを表す 1 ~ 4 の乱数と、カード番号を表す 1 ~ 3 の別の乱数を返すことになっています。

コードを呼び出しconsole.log(getSuit(card1));てテストすると、 NaN が返されます

理由を知っている人はいますか?

// Make your card constructor again here, but make sure to use private
// variables!
function Card(num, suit){
    var num = num; 
    var suit = suit;
    getSuit = function(){
        return suit; 
    }; 
    getNumber = function(){
        return num; 
    };

    getValue = function(card){
        if (card > 10){
            return 10; 
        }else if (card === 1){
            return 11; 
        }else{
            return card; 
        }

    };

}

// Make a deal function here.  It should return a new card with a suit
// that is a random number from 1 to 4, and a number that is a random
// number between 1 and 13

var deal = function(){
    var suit = Math.floor(Math.random * 4 + 1);
    var number = Math.floor(Math.random * 13 + 1);
    return new Card(number, suit); 
}; 


// examples of the deal function in action
var card1 = deal();
var card2 = deal();

console.log(getSuit(card1));
4

7 に答える 7

4

ランダムの後に () を追加するだけです

var deal = function() {
    var suit = Math.floor(Math.random() * 4 + 1);
    var number = Math.floor(Math.random() * 13 + 1);
    return new Card(number, suit);
}; 
于 2012-08-29T23:18:47.630 に答える
1

あなたは電話してはいけません:

console.log(card1.getSuit());

?

于 2012-08-29T23:15:17.510 に答える
1

複合的な問題がいくつかありましたが、NaN を取得していた理由は、ランダム関数の使用によるものでした。()メソッド/関数へのすべての呼び出しの後に含めてください。

その他の変更が Card クラスに加えられました。this.そのクラス インスタンスに変数を割り当てます。関数についても同様です。したがって、これにより、 の呼び出しgetSuit()方法がメソッド呼び出しとして変更されます。getSuit() がグローバル名前空間に配置されていたため、以前は機能していました。

function Card(num, suit){
    this.num = num; 
    this.suit = suit;
    this.getSuit = function(){
        return suit; 
    }; 
    this.getNumber = function(){
        return num; 
    };

    this.getValue = function(card){
        if (card > 10){
            return 10; 
        }else if (card === 1){
            return 11; 
        }else{
            return card; 
        }

    };

}

var deal = function(){
    var suit = Math.floor(Math.random() * 4 + 1);
    var number = Math.floor(Math.random() * 13 + 1);
    return new Card(number, suit); 
}; 


// examples of the deal function in action
var card1 = deal();
var card2 = deal();

console.log(card1.getSuit());
于 2012-08-29T23:20:27.937 に答える
0

このバージョンでは、プライベート変数の使用が維持されます。関数の引数は自動的にプライベート変数になるため、再宣言する必要はありません。

function Card(num, suit) {
    this.getSuit = function() {
        return suit;
    }; 
    this.getNumber = function() {
        return num;
    };
    this.getValue = function() {
        if (num > 10)
            return 10;
        if (num == 1)
            return 11;
        return num;
    };
}
于 2012-08-29T23:28:42.660 に答える
0

変化する:

var num = num; 
var suit = suit;

this.num = num; 
this.suit = suit;

于 2012-08-29T23:13:39.980 に答える
0

これを試して:

// Make your card constructor again here, but make sure to use private 
// variables!
function Card(num, suit){
    // NOTE: "this."
    this.num = num;
    this.suit = suit;
    this.getSuit = function(){
        return this.suit;
    };
    this.getNumber = function(){
        return this.num;
    };

    this.getValue = function(card){
        if (card > 10){
            return 10;
        }else if (card === 1){
            return 11;
        }else{
            return card;
        }
    };
}

// Make a deal function here.  It should return a new card with a suit
// that is a random number from 1 to 4, and a number that is a random
// number between 1 and 13   
var deal = function(){
    // NOTE: Math.random()
    var suit = Math.floor(Math.random() * 4 + 1);
    var number = Math.floor(Math.random() * 13 + 1);
    return new Card(number, suit);
};

// examples of the deal function in action
var card1 = deal();
var card2 = deal();

// NOTE: card1.getSuit()
console.log(card1.getSuit());
于 2012-08-29T23:21:50.307 に答える
0

次の 3 つの問題を修正する必要があります。

  1. に括弧が必要ですMath.random()
  2. getSuit()これまでの方法ではなく、このように呼び出す必要がありcard1.getSuit()ます。
  3. getSuit実際に作成し、Card オブジェクトのメソッドにする必要がありgetNumberます。getValueこれまでに宣言したように、これらは Card コンストラクター内の単なるローカル関数であり、そのコンストラクターの外部から呼び出すことはできません。

これらの関数をメソッドにする一般的な方法が 2 つあります。1 つは、それらを Card プロトタイプ オブジェクトに割り当てることです。thisもう 1 つは、コンストラクターでそれらを割り当てることです。

これらをプロトタイプ オブジェクトに割り当てると、次のようになります。

function Card(num, suit){
    this.num = num; 
    this.suit = suit;
}

Card.prototype = {
     getSuit: function() {
         return suit;
     },
     getNumber: function() {
         return num;
     },
     getValue: function(card) {
        if (card > 10){
            return 10; 
        }else if (card === 1){
            return 11; 
        }else{
            return card; 
        }
    }
};

// Make a deal function here.  It should return a new card with a suit
// that is a random number from 1 to 4, and a number that is a random
// number between 1 and 13

var deal = function(){
    var suit = Math.floor(Math.random() * 4 + 1);
    var number = Math.floor(Math.random() * 13 + 1);
    return new Card(number, suit); 
}; 


// examples of the deal function in action
var card1 = deal();
var card2 = deal();

console.log(card1.getSuit());

numプライベート変数のままにしたい場合はsuit、次のように Card 内でメソッドを定義する必要があります。

// Make your card constructor again here, but make sure to use private
// variables!
function Card(num, suit){
    var num = num; 
    var suit = suit;
    this.getSuit = function(){
        return suit; 
    }; 
    this.getNumber = function(){
        return num; 
    };

    this.getValue = function(card){
        if (card > 10){
            return 10; 
        }else if (card === 1){
            return 11; 
        }else{
            return card; 
        }

    };

}

// Make a deal function here.  It should return a new card with a suit
// that is a random number from 1 to 4, and a number that is a random
// number between 1 and 13

var deal = function(){
    var suit = Math.floor(Math.random() * 4 + 1);
    var number = Math.floor(Math.random() * 13 + 1);
    return new Card(number, suit); 
}; 


// examples of the deal function in action
var card1 = deal();
var card2 = deal();

console.log(card1.getSuit());
于 2012-08-29T23:21:54.227 に答える