| import 'card.dart' show Card; |
| import 'dart:math' show Random; |
| |
| enum GameType { |
| Hearts |
| } |
| |
| /// A game consists of multiple decks and tracks a single deck of cards. |
| /// It also handles events; when cards are dragged to and from decks. |
| class Game { |
| final GameType gameType; |
| final List<List<Card>> cardCollections = new List<List<Card>>(); |
| final List<Card> deck = <Card>[ |
| const Card("classic", "c1"), |
| const Card("classic", "c2"), |
| const Card("classic", "c3"), |
| const Card("classic", "c4"), |
| const Card("classic", "c5"), |
| const Card("classic", "c6"), |
| const Card("classic", "c7"), |
| const Card("classic", "c8"), |
| const Card("classic", "c9"), |
| const Card("classic", "c10"), |
| const Card("classic", "cj"), |
| const Card("classic", "cq"), |
| const Card("classic", "ck"), |
| const Card("classic", "d1"), |
| const Card("classic", "d2"), |
| const Card("classic", "d3"), |
| const Card("classic", "d4"), |
| const Card("classic", "d5"), |
| const Card("classic", "d6"), |
| const Card("classic", "d7"), |
| const Card("classic", "d8"), |
| const Card("classic", "d9"), |
| const Card("classic", "d10"), |
| const Card("classic", "dj"), |
| const Card("classic", "dq"), |
| const Card("classic", "dk"), |
| const Card("classic", "h1"), |
| const Card("classic", "h2"), |
| const Card("classic", "h3"), |
| const Card("classic", "h4"), |
| const Card("classic", "h5"), |
| const Card("classic", "h6"), |
| const Card("classic", "h7"), |
| const Card("classic", "h8"), |
| const Card("classic", "h9"), |
| const Card("classic", "h10"), |
| const Card("classic", "hj"), |
| const Card("classic", "hq"), |
| const Card("classic", "hk"), |
| const Card("classic", "s1"), |
| const Card("classic", "s2"), |
| const Card("classic", "s3"), |
| const Card("classic", "s4"), |
| const Card("classic", "s5"), |
| const Card("classic", "s6"), |
| const Card("classic", "s7"), |
| const Card("classic", "s8"), |
| const Card("classic", "s9"), |
| const Card("classic", "s10"), |
| const Card("classic", "sj"), |
| const Card("classic", "sq"), |
| const Card("classic", "sk"), |
| ]; |
| |
| final Random random = new Random(); |
| String debugString = 'hello?'; |
| |
| Game.hearts(int playerNumber) : gameType = GameType.Hearts { |
| // playerNumber would be used in a real game, but I have to ignore it for debugging. |
| // It would determine faceUp/faceDown status. |
| |
| deck.shuffle(); |
| cardCollections.add(this.deal(10)); |
| cardCollections.add(this.deal(5)); |
| cardCollections.add(this.deal(1)); |
| cardCollections.add(this.deal(1)); |
| cardCollections.add(new List<Card>()); // an empty pile TODO(alexfandrianto): Why can't I just have an empty stack? |
| cardCollections.add(new List<Card>()); // a hidden pile! |
| } |
| |
| List<Card> deal(int numCards) { |
| assert(deck.length >= numCards); |
| List<Card> cards = new List<Card>.from(deck.take(numCards)); |
| deck.removeRange(0, numCards); |
| return cards; |
| } |
| |
| void move(Card card, List<Card> dest) { |
| // The first step is to find the card. Where is it? |
| // then we can remove it and add to the dest. |
| debugString = 'Moving... ${card.toString()}'; |
| int i = findCard(card); |
| if (i == -1) { |
| debugString = 'NO... ${card.toString()}'; |
| return; |
| } |
| cardCollections[i].remove(card); |
| dest.add(card); |
| debugString = 'Move ${i} ${card.toString()}'; |
| print(debugString); |
| } |
| |
| // Which card collection has the card? |
| int findCard(Card card) { |
| for (int i = 0; i < cardCollections.length; i++) { |
| if (cardCollections[i].contains(card)) { |
| return i; |
| } |
| } |
| return -1; |
| } |
| } |