1 /** 2 * A classic trick-based card game. 3 */ 4 function Hearts() { 5 var board = new Board({rootId : "Hearts", handId : "HeartsHand"}), 6 scores = [0, 0, 0, 0], 7 currentTrick = [], 8 currentCardNumber = 0, 9 ledSuit, 10 highestRank; 11 12 var main = new Deck(); 13 main.initialize(true); 14 main.shuffle(); 15 16 var hands = []; 17 for (var i = 0; i < 4; i++) { 18 hands[i] = new Deck(board.defaultType); 19 hands[i].setActive(i == 0); 20 main.deal(hands[i], 13); 21 board.addDeck(hands[i]); 22 } 23 24 var plays = [], 25 locs = [1, 4, 0, 2, 1, 0, 2, 2]; 26 for (i = 0; i < 4; i++) { 27 plays[i] = new Deck(board.defaultType, locs.pop(), locs.pop(), 28 {draggable : false}); 29 plays[i].setFilter((function (play) { 30 return function () {return play.getCards().length < 1;}; 31 })(plays[i])); 32 board.addDeck(plays[i]); 33 plays[i].observe((function (n) { 34 return function (event) { 35 if (currentCardNumber == 0) { 36 ledSuit = plays[n].peek().getSuit(); 37 highestRank = plays[n].peek().getRank(); 38 highestRank = highestRank == 1 ? 14 : highestRank; 39 } 40 41 currentTrick[n] = plays[n].peek().getSuit(); 42 currentCardNumber++; 43 44 if (currentCardNumber == 4) { 45 endTrick(); 46 } 47 }; 48 })(i)); 49 } 50 51 /** 52 * Ends the current trick, tallying up the scores and resetting everything 53 * as needed. 54 */ 55 function endTrick() { 56 var score = 0, 57 winner; 58 59 for (var i = 0; i < 4; i++) { 60 var suit = currentTrick[i].getSuit(), 61 rank = currentTrick[i].getRank(); 62 rank = rank == 1 ? 14 : rank; 63 64 if (suit == ledSuit && rank >= highestRank) { 65 winner = i; 66 } 67 68 if (suit == "s" && rank == 12) { 69 score += 13; 70 } else if (suit == "h") { 71 score += 1; 72 } 73 } 74 75 scores[winner] += score; 76 currentTrick = []; 77 currentCardNumber = 0; 78 highestRank = 0; 79 ledSuit = null; 80 81 for (var i = 0; i < 4; i++) { 82 plays[i].remove(plays[i].peek()); 83 } 84 } 85 }