I asked a question not long ago about the same batch of code, but this time it’s a different problem. Using the tips I got about that different problem, I tried to solve this problem, which is my score function in my JavaScript blackjack game. My score function keeps printing out an NaN when I test it out on the Mozilla Scratchpad. I’ve tried tweaking the returns, merging the two for loops, and even renaming the variables in my deal function to make sure it doesn’t mess with other variables, and still nothing. There was a similar question that somebody asked, but it didn’t solve my problem.
function Card (s, n) {
var suit = s;
var number = n;
this.getNumber = function () {
return number;
};
this.getSuit = function () {
return suit;
};
this.getValue = function () {
if (number > 10) {
return 10;
} else if (number === 1) {
return 11;
} else {
return number;
}
};
}
var cardNames = {1:"Ace", 2:"2", 3:"3", 4:"4", 5:"5", 6:"6", 7:"7", 8:"8", 9:"9", 10:"10", 11:"Joker", 12:"Queen", 13:"King"};
var suitNames = {1:"Clubs", 2:"Diamonds", 3:"Hearts", 4:"Spades"};
var deal = function () {
var s = Math.floor(Math.random() * 4 + 1);
var n = Math.floor(Math.random() * 13 + 1);
return new Card(s, n);
};
function Hand(){
var cards = [];
var card1 = deal();
var card2 = deal();
cards = [card1, card2];
this.getHand = function () {
return cards;
};
this.score = function () {
var points;
for (i = 0; i < cards.length; i++) {
points = points + cards[i].getValue();
}
for (i = 0; i < cards.length; i++) {
if (points > 21 && cards[i].getValue() === 11) {
points = points - 10;
}
} return points;
};
this.printHand = function () {
for (i = 0; i < cards.length; i++) {
var hand;
if (i === 0) {
hand = cardNames[cards[i].getNumber()] + " of " + suitNames[cards[i].getSuit()];
} else {
hand = hand + " and a " + cardNames[cards[i].getNumber()] + " of " + suitNames[cards[i].getSuit()];
}
} return hand;
};
this.hitMe = function () {
cards.push(deal());
};
}
var playAsDealer = function () {
var playDealer = new Hand();
while (playDealer.score() < 17) {
playDealer.hitMe();
}
this.printHand = function () {
return playDealer.printHand();
};
this.score = function () {
return playDealer.score();
};
return playDealer;
};
var playAsUser = function () {
var playUser = new Hand();
var decision = confirm("Your hand is " + playUser.printHand() + ". Click OK to hit or Cancel to stand");
for (i = 0; decision !== false; i++) {
playUser.hitMe();
decision = confirm("Your hand is " + playUser.printHand() + ". Click OK to hit or Cancel to stand");
}
this.printHand = function () {
return playUser.printHand();
};
this.score = function () {
return playUser.score();
};
return playUser;
};
var declareWinner = function (userHand, dealerHand) {
if ((userHand.score < dealerHand.score) || userHand.score > 21) {
alert("You lose.");
} else if (userHand.score > dealerHand.score) {
alert("You win.");
} else {
alert("You tied.");
}
};
var playGame = function () {
user = playAsUser();
dealer = playAsDealer();
declareWinner(user, dealer);
alert("User got " + user.printHand() + " for a total score of " + user.score());
alert("Dealer got " + dealer.printHand() + " for a total score of " + dealer.score());
};
playGame();
You just need to initialise the value of
pointsin yourscorefunction. Changevar points;tovar points = 0;and you should be fine.EDIT: Since I’m sure this will be your next question, you also need to actually call the
scorefunction indeclareWinner. You are usingplayer.scoreinstead ofplayer.score()in multiple places.