Javascript 返回an-NaN的函数

Javascript 返回an-NaN的函数,javascript,blackjack,Javascript,Blackjack,不久前我问了一个关于同一批代码的问题,但这次是另一个问题。利用我在不同问题上得到的技巧,我试图解决这个问题,这是我在JavaScript 21点游戏中的得分函数。当我在Mozilla Scratchpad上测试时,我的score函数会一直打印出一个NaN。我尝试过调整返回,合并两个for循环,甚至在我的deal函数中重命名变量,以确保它不会与其他变量混淆,但仍然没有任何结果。有人问了一个类似的问题,但并没有解决我的问题 function Card (s, n) { var suit =

不久前我问了一个关于同一批代码的问题,但这次是另一个问题。利用我在不同问题上得到的技巧,我试图解决这个问题,这是我在JavaScript 21点游戏中的得分函数。当我在Mozilla Scratchpad上测试时,我的score函数会一直打印出一个NaN。我尝试过调整返回,合并两个for循环,甚至在我的deal函数中重命名变量,以确保它不会与其他变量混淆,但仍然没有任何结果。有人问了一个类似的问题,但并没有解决我的问题

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();
功能卡(s、n){
var=s;
var数=n;
this.getNumber=函数(){
返回号码;
};
this.getSuit=函数(){
反诉;
};
this.getValue=函数(){
如果(数量>10){
返回10;
}else if(数字===1){
返回11;
}否则{
返回号码;
}
};
}
var cardNames={1:“王牌”、2:“2”、3:“3”、4:“4”、5:“5”、6:“6”、7:“7”、8:“8”、9:“9”、10:“10”、11:“小丑”、12:“女王”、13:“国王”};
var suitNames={1:“梅花”,2:“钻石”,3:“红心”,4:“黑桃”};
var deal=函数(){
var s=Math.floor(Math.random()*4+1);
var n=Math.floor(Math.random()*13+1);
退回新卡(s、n);
};
函数手(){
var卡=[];
var card1=deal();
var card2=deal();
卡片=[card1,card2];
this.getHand=函数(){
回程卡;
};
this.score=函数(){
var点;
对于(i=0;i21和卡[i].getValue()==11){
分值=分值-10;
}
}返回点;
};
this.printHand=函数(){
对于(i=0;i21){
警惕(“你输了”);
}else if(userHand.score>dealerHand.score){
警惕(“你赢了”);
}否则{
警惕(“你打成平局”);
}
};
var playGame=函数(){
user=playauser();
经销商=playAsDealer();
declareWinner(用户、经销商);
警报(“用户获得”+User.printHand()+,总分为”+User.score());
警报(“经销商获得”+Dealer.printHand()+,总分为”+Dealer.score());
};
游戏();

您只需在
评分
函数中初始化
积分的值。改变
var点
var点=0你应该很好


EDIT:因为我确信这将是您的下一个问题,所以您还需要实际调用
declareWinner
中的
score
函数。您正在多个位置使用
player.score
而不是
player.score()

您只需初始化
score
函数中
点的值。改变
var点
var点=0你应该很好


EDIT:因为我确信这将是您的下一个问题,所以您还需要实际调用
declareWinner
中的
score
函数。您在多个位置使用的是
player.score
而不是
player.score()

您在声明积分时从不初始化积分。最初将它们初始化为一个数字,因为当您执行
points=points+cards[i].getValue()
javascript所做的是获取LHS和RHS的值,然后将它们强制转换为一个基元,使点成为字符串
'
。无论何时,只要您想确保获得一个数字,请执行
parseInt(arg,base)

var点=0;
对于(i=0;i21和卡[i].getValue()==11){
分值=分值-10;
}
}返回点;

声明点时从不初始化点。最初将它们初始化为一个数字,因为当您执行
points=points+cards[i].getValue()
javascript所做的是获取LHS和RHS的值,然后将它们强制转换为一个基元,使点成为字符串
'
。无论何时,只要您想确保获得一个数字,请执行
parseInt(arg,base)

var点=0;
对于(i=0;i    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;