Leahcim
Leahcim

Reputation: 41929

JavaScript: returning NaN (Part 2)

(note this is similar to but not the same as the question I asked moments ago - the solution to that question was to add the brackets when calling Math.Random)

At the bottom of the code below, I'm dealing out two hands of blackjack myhand and yourhand and then logging the hands to the console

"I scored a "+myHand.score()+" and you scored a "+ yourHand.score());

However, the result I'm getting is

I scored NaN and you scored a NaN

Originally, the getValue method in the Card constructor was passed a parameter called card but the instructions for building the Hand constructor said to call getValue without passing a parameter

this.card1.getValue();

so I changed the getValue method to take the var number (which is in the Card constructor)

anyways, to make a long story short, whatever i do, it's printing out

I scored NaN and you scored a NaN

and I'm not sure exactly where I'm going wrong.

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

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

    };

}

function Hand(){
    this.card1 = deal(); 
    this.card2 = deal(); 

    this.score = function(){
    var score1 = this.card1.getValue();
    var score2 = this.card2.getValue();
    return score1 + score2;
    };

}

// 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 myHand = new Hand();
var yourHand = new Hand();
console.log("I scored a "+myHand.score()+" and you scored a "+ yourHand.score());

Upvotes: 0

Views: 102

Answers (3)

Wizard of Ogz
Wizard of Ogz

Reputation: 12643

Your get value function accepts a number argument this.getValue = function(number)

But you aren't passing in the value here:

var score1 = this.card1.getValue();
var score2 = this.card2.getValue();

Upvotes: 1

Ossie7
Ossie7

Reputation: 370

When you address card.getValue() it requires some input

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

};

The function doest not return anything, resulting in a NaN. To solve this, use this.number instead

Upvotes: 1

Niet the Dark Absol
Niet the Dark Absol

Reputation: 324640

Your getValue function is wrong. It should be:

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

A hint that something was wrong is that you are calling this.card1.getValue() with no arguments, whereas you defined this.getValue(number) with an argument.

Upvotes: 2

Related Questions