我不久前问了一个关于同一批代码的问题,但这次是一个不同的问题。使用我得到的关于这个不同问题的提示,我试图解决这个问题,这是我的JavaScript二十一点游戏中的得分功能。当我在Mozilla Scratchpad上测试时,我的分数功能可以打印出NaN。我已经尝试调整返回,合并两个for循环,甚至重命名我的交易函数中的变量,以确保它不会混淆其他变量,仍然没有。有人问过类似的问题,但这并没有解决我的问题。
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();
答案 0 :(得分:6)
您只需在points
函数中初始化score
的值即可。将var points;
更改为var points = 0;
,您应该没问题。
编辑:由于我确定这是您的下一个问题,因此您还需要实际调用score
中的declareWinner
功能。您在多个地方使用player.score
代替player.score()
。
答案 1 :(得分:0)
您在申报时绝不会初始化积分。最初将它们初始化为数字,因为当你执行points = points + cards[i].getValue()
javascript所做的是它获取LHS和RHS的值然后将它们转换为基元,使得点为字符串''
。此外,无论何时您想确保获得一个数字parseInt(arg, base)
!
var points = 0;
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;