2012-09-12 32 views
3

我在一千次不同的时间试过了这一千种不同的方式,我的JS代码不会以我想要的方式出现。当我在Mozilla暂存器中运行它时,我得到“userHand未定义”,第二个printHand也显示为未定义。有人能告诉我我的二十一点游戏中的错误在哪里?如何摆脱undefined(s)和我的代码中的其他问题?

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 = []; 
    cards.push(deal()); 
    cards.push(deal()); 
    this.getHand = function() { 
     return cards; 
    }; 
    this.score = function() { 
     var score; 
     for (i = 0; i < cards.length; i++) { 
      score = score + cards[i].getValue(); 
     } 
     for (i = 0; i < cards.length; i++) { 
      if (score > 21 && cards[i].getValue() === 11) { 
       score = score - 10; 
      } 
     } return score; 
    }; 
    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()]; 
      } 
     } alert(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(); 
    }; 
}; 

var playAsUser = function() { 
    var playUser = new Hand(); 
    this.printHand = function() { 
    return playUser.printHand(); 
    }; 
    this.score = function() { 
    return playUser.score(); 
    }; 
    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"); 
    } 
}; 

var declareWinner = function (userHand, dealerHand) { 
    if ((userHand.score < dealerHand.score) || userHand.score > 21) { 
     return "You lose."; 
    } else if (userHand.score > dealerHand.score) { 
     return "You win."; 
    } else { 
     return "You tied."; 
    } 
}; 

var playGame = function() { 
    var user = playAsUser(); 
    var dealer = playAsDealer(); 
    declareWinner(user, dealer); 
    console.log("User got " + user.printHand()); 
    console.log("Dealer got " + dealer.printHand()); 
}; 

playGame(); 

回答

2

你是不是在printHand()

返回什么,我只是添加了return语句和工作。看到这个fiddle

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()]; 
      } 
     } 
     //alert(hand); //remove this alert 
     return hand; // <----- solution 
}; 
+1

这还不是所有的方式,在每一个“玩”的方法,你需要回到()'是为“玩家”创建'手:HTTP://的jsfiddle。 net/XEgnC/2/ – Shmiddty

+0

@Shmiddty,谢谢。你打算分别返回玩家和玩家,是不是? –

+0

'playAsUser()'里面的'playUser'和'''''''''''''''''''' – Shmiddty