示例#1
0
class Game(object):

    Players = []
    SupplyArea = SupplyAreaClass()

    def __init__(self):
        self.Players = []
        self.SupplyArea = SupplyAreaClass()

    def addPlayer(self, player):
        self.Players.append(player)

    def setUpGame(self):
        self._setUpTreasureCards()
        self._setUpVictoryCards()
        self._setUpCurseCards()
        self._setUpKingdomCards()

        self._setUpInitialDecks()
        self._drawFirstHands()

    def _setUpTreasureCards(self):
        # 1) Add Copper, Silver, and Gold to the SupplyArea
        copperData = dominion_data.cards['copper']
        self.SupplyArea.CopperPile = self._makePile(copperData, dominion_rules.GAME_SETUP.COPPER_CARDS)
        silverData = dominion_data.cards['silver']
        self.SupplyArea.SilverPile = self._makePile(silverData, dominion_rules.GAME_SETUP.SILVER_CARDS)
        goldData = dominion_data.cards['gold']
        self.SupplyArea.GoldPile = self._makePile(goldData, dominion_rules.GAME_SETUP.GOLD_CARDS)

    def _setUpVictoryCards(self):
        # 2) Add Estates, Duchies, and Provinces to the SupplyArea
        numberOfVictoryCards = dominion_rules.getGameSetupVictoryCardCount(len(self.Players))
        estateData = dominion_data.cards['estate']
        duchyData = dominion_data.cards['duchy']
        provinceData = dominion_data.cards['province']
        self.SupplyArea.EstatePile = self._makePile(estateData, numberOfVictoryCards)
        self.SupplyArea.DuchyPile = self._makePile(duchyData, numberOfVictoryCards)
        self.SupplyArea.ProvincePile = self._makePile(provinceData, numberOfVictoryCards)
        additionalEstateCount = len(self.Players) * dominion_rules.FIRST_DECK.ESTATE_CARDS
        additionalEstates = self._makePile(estateData, additionalEstateCount)
        self.SupplyArea.EstatePile = self._combinePiles([self.SupplyArea.EstatePile, additionalEstates])

    def _setUpCurseCards(self):
        # 3) Add Curses to the SupplyArea
        curseData = dominion_data.cards['curse']
        self.SupplyArea.CursePile = self._makePile(curseData, dominion_rules.GAME_SETUP.CURSE_CARDS)

    def _setUpKingdomCards(self):
        # 4) Add Kingdom Cards to the SupplyArea
        firstGameDeck = dominion_data.decks['first-game']
        for cardName in firstGameDeck:
            cardData = dominion_data.cards[cardName]
            newPile = self._makePile(cardData, dominion_rules.GAME_SETUP.KINGDOM_CARDS)
            self.SupplyArea.KingdomPiles[cardData['name']] = newPile

    def _setUpInitialDecks(self):
        # 5) Deal Copper and Estate cards to each Player's DrawPile
        for player in self.Players:
            for i in range(dominion_rules.FIRST_DECK.ESTATE_CARDS):
                estate = self.SupplyArea.EstatePile.draw()
                player.DrawPile.drop(estate)
            for i in range(dominion_rules.FIRST_DECK.COPPER_CARDS):
                copper = self.SupplyArea.CopperPile.draw()
                player.DrawPile.drop(copper)

        # 6) Shuffle each Player's DrawPile
        for player in self.Players:
            player.shuffle()

    def _drawFirstHands(self):
        # 7) Have each Player draw 5 cards from their DrawPile into the Hand
        for player in self.Players:
            player.drawHand()

    def _makePile(self, cardData, howManyCards):
        pile = Pile()
        for i in range(howManyCards):
            pile.drop(Card(
                name=cardData['name'],
                type=cardData['type'],
                cost=cardData.get('cost', 0),
                effects=cardData.get('effects', None),
                imageUrl=cardData['image']))

        return pile

    def _combinePiles(self, pileArray):
        newPile = Pile()
        for pile in pileArray:
            for card in pile.Cards:
                newPile.drop(card)
        return newPile


    def over(self):
        # The game is over if ...
        # 1) The Province pile is empty, or
        # 2) any 3 piles are empty
        if self.SupplyArea.ProvincePile.len() == 0:
            return True

        emptyPiles = 0
        for cardName, pile in self.SupplyArea.allPiles().iteritems():
            if pile.len() == 0:
                emptyPiles += 1
                if emptyPiles >= 3:
                    return True

        return False
示例#2
0
 def __init__(self):
     self.Players = []
     self.SupplyArea = SupplyAreaClass()