コード例 #1
0
class Game(object):
    """ This class represents a game of UNO """
    current_player = None
    current_trick = None
    trump = None
    started = False
    starter = None
    highest_bid = 0
    highest_bidder = None
    reizen_done = False
    weitersagen = False
    reizen_sagenoderhoeren = 0
    sager = None
    hoerer = None
    out = None

    #owner = ADMIN_LIST
    #open = OPEN_LOBBY

    def __init__(self, chat):
        self.chat = chat
        self.last_card = None
        self.last_trick_winner = None
        self.tricks_played = 0
        self.declarer = None
        self.current_trick = Trick()

        self.deck = Deck()

        self.logger = logging.getLogger(__name__)

    @property
    def players(self):
        """Returns a list of all players in this game"""
        players = list()
        if not self.current_player:
            return players

        current_player = self.current_player
        itplayer = current_player.next
        players.append(current_player)
        while itplayer and itplayer is not current_player:
            players.append(itplayer)
            itplayer = itplayer.next
        return players

    def start(self):
        if len(self.players) < 3:
            self.logger.info("Can't start, not enough players.")
        else:
            self.started = True
            self.deck._fill_classic_()
            self.logger.info("Game started.")
            self.sagen_oder_hoeren = 0
            self.sager = self.current_player.next
            self.hoerer = self.current_player
            self.logger.info("Geben: " + str(self.current_player.prev) +
                             " Hören: " + str(self.current_player) +
                             " Sagen: " + str(self.current_player.next))
            #self.

    def turn(self):
        """Marks the turn as over and change the current player"""
        self.logger.debug("Next Player")
        self.current_player = self.current_player.next

    def play_card(self, card):
        """
        Plays a card and triggers its effects.
        Should be called only from Player.play.
        Card is added to current trick.
        """
        self.last_card = card

        self.current_trick.add_card(card)

        self.logger.info("Player " + str(card.owner) + " is playing card " +
                         repr(card))

        if len(self.current_trick.cards) == 3:
            self.tricks_played += 1

            # Determine trick winner
            winnercard = self.current_trick.winner(self.trump)

            # Add trick to trick winner
            winnercard.owner.won_tricks.append(self.current_trick)

            # Set last trick winner of game
            self.last_trick_winner = winnercard.owner

            self.logger.info("Player " + str(winnercard.owner) +
                             " won the trick " + str(self.current_trick.cards))

            # Start a new trick
            self.current_trick = Trick()
            self.last_card = None

            # Trick winner starts new trick
            self.current_player = self.last_trick_winner

            if self.tricks_played == 10:
                self.end()
        else:
            self.turn()

    def end(self):
        self.logger.info("Game ended! Determining winner...")

        players = self.players
        players.remove(self.declarer)

        defenders_points = 0
        for player in players:
            defenders_points += player.result()

        declarer_points = self.declarer.result()
        # For now: adding points of "Skat" to Declarer
        skat = Trick()
        skat.add_card(self.deck.draw())
        skat.add_card(self.deck.draw())

        skat_points = skat.value()
        declarer_points += skat_points

        self.logger.info("Defenders: " + str(defenders_points) +
                         ", Declarer: " + str(declarer_points))

        if declarer_points >= 61:
            self.logger.info("Declarer " + str(self.declarer) + " won with " +
                             str(declarer_points) + " points.")
        else:
            self.logger.info("Defenders " + str(players[0]) + " and " +
                             str(players[1]) + " won with " +
                             str(defenders_points) + " points.")