Example #1
0
class Game:
    def __init__(self, table=None):
        self.winners = []
        self.alreadyShowedGameRound = False
        self.table = table
        self.deck = Deck()
        self.gameRound = GameRound.PREFLOP
        self.maxBet = 0
        self.currentPlayer = None

        for player in self.table.players:
            player.game = self
        self.table.board = Board()
        self.table.board.game = self

    def __str__(self):
        representation = ""
        if not self.alreadyShowedGameRound:
            if self.gameRound != GameRound.PREFLOP:
                representation += "\n\n"
            representation += "Game Round: {}\n\n".format(self.gameRound.name)

        if self.gameRound != GameRound.END:
            representation += "Player playing: {}\n\n{}\n".format(
                self.currentPlayer, self.table)
        else:
            representation += "Winner: " + str(self.winners)
        return representation

    def handleGameRound(self):
        self.currentPlayer = self.table.firstToSpeak()
        if self.gameRound == GameRound.PREFLOP:
            self.handlePreFlop()
        elif self.gameRound == GameRound.FLOP:
            self.handleFlop()
        elif self.gameRound == GameRound.TURN:
            self.handleTurn()
        elif self.gameRound == GameRound.RIVER:
            self.handleRiver()
        elif self.gameRound == GameRound.END:
            bestFiveCards = {
                player: player.getBestFiveCards()
                for player in self.table.players
            }
            ranking = sorted(bestFiveCards,
                             key=lambda x: bestFiveCards[x].point,
                             reverse=True)
            bestPoint = bestFiveCards[ranking[0]].point
            self.winners.extend(
                filter(lambda x: bestFiveCards[x].point == bestPoint, ranking))

            # handle winners, tiers and losers money
            return self.winners
        else:
            raise GameShouldHaveEndedException

        # print(self)

        self.handleGameRound()

    def handlePreFlop(self):
        if self.maxBet == 0:
            self.table.handleSmallBlind()
            self.table.handleBigBlind()
            self.maxBet = self.table.bigBlind
            # for player in self.table.players:
            #     player.cards = Cards(*self.getRandomCardsFromDeck(2))
        self.currentPlayer.play()
        self.advanceInGame()

    def handleFlop(self):
        if self.maxBet == 0:
            self.table.board[0], self.table.board[1], self.table.board[
                2] = self.getRandomCardsFromDeck(3)
        self.currentPlayer.play()
        self.advanceInGame()

    def handleTurn(self):
        if self.maxBet == 0:
            self.table.board[3] = self.getRandomCardsFromDeck(1)[0]
        self.currentPlayer.play()
        self.advanceInGame()

    def handleRiver(self):
        if self.maxBet == 0:
            self.table.board[4] = self.getRandomCardsFromDeck(1)[0]
        self.currentPlayer.play()
        self.advanceInGame()

    def prepareForNextRound(self):
        for player in self.table.players:
            player.hasSpoken = False
            player.currentBet = 0
        self.alreadyShowedGameRound = False

    def advanceInGame(self):
        if len(list(filter(lambda x: not x.isActive,
                           self.table.players))) == 1:
            self.gameRound = GameRound.END
            self.prepareForNextRound()
        if all(
                map(lambda x: x.isReadyToProceedToNextRound(),
                    self.table.players)):
            self.gameRound = GameRound(self.gameRound + 1)
            self.prepareForNextRound()
            self.currentPlayer = self.table.firstToSpeak()
        else:
            self.currentPlayer = self.currentPlayer.nextToSpeak()

    def getRandomCardsFromDeck(self, numberOfCards):
        return [
            self.deck.pop(random.randrange(len(self.deck)))
            for _ in range(numberOfCards)
        ]

    def updateGameRound(self):
        if any(map(lambda x: x.hand is None, self.table.players)):
            self.gameRound = GameRound.PREFLOP
        numberOfCardsFlipped = len(
            list(filter(lambda x: x is not None, self.table.board)))
        if numberOfCardsFlipped == 0:
            self.gameRound = GameRound.FLOP
        elif numberOfCardsFlipped == 3:
            self.gameRound = GameRound.TURN
        elif numberOfCardsFlipped == 4:
            self.gameRound = GameRound.RIVER
        elif numberOfCardsFlipped == 5:
            self.gameRound = GameRound.END
        else:
            raise IncorrectNumberOfCardsFlippedException
Example #2
0
    name = input()
    players.append(ShitheadPlayer(name))
		
num_decks = 1+num_players//3 

playing_deck = Deck(num_decks)
playing_deck.shuffle()

discard_pile = []

# Deal Cards

for place in ['fd','fu','hand']:
    for i in range(3):
        for j in range(num_players):
            players[j].add_card(playing_deck.pop(),place)
 
# Game 
player_ind = 0
direction = 1

print("Press Enter to start game...")
input()
os.system('cls')

while game_over == False:
    # Select player
    player = players[player_ind]

    print(player.name,"'s turn:")
    # Display Hand