Beispiel #1
0
 def test_deck_full(self):
     x = Deck()
     x.reset()
     expected_state_after = x[:-1]
     expected_card = x[-1]
     actual_card = x.draw()
     self.assertEqual(actual_card, expected_card)
     self.assertListEqual(x, expected_state_after)
Beispiel #2
0
 def test_full(self):
     x = Deck()
     x.reset()
     before = list(x)
     x.shuffle()
     after = list(x)
     self.assertTrue(before != after)
     self.assertSetEqual(set(x), set(before))
Beispiel #3
0
def main():
    d = Deck()
    print 'hands:'
    c1 = raw_input('card1?')
    c2 = raw_input('card2?')
    c3 = raw_input('card3?')
    c4 = raw_input('card4?')
    card1 = Card(c1[0], c1[1])
    card2 = Card(c2[0], c2[1])
    card3 = Card(c3[0], c3[1])
    card4 = Card(c4[0], c4[1])
    ps = list()
    ps.append(Hand(card1, card2))
    ps.append(Hand(card3, card4))
    # ps = d.deal_players(N_PLAYERS)
    ps_str = ''
    for p in ps:
        ps_str += str(p) + ', '
    print ps_str

    wins = [0] * N_PLAYERS
    for loop in range(0, N_LOOP):
        d.reset()
        for p in ps:
            d.draw_card(p.card1)
            d.draw_card(p.card2)

        # print "community:"
        com = d.deal_community()
        com_str = ''
        for c in com:
            com_str += str(c) + ', '
        # print com_str

        ss = []
        for i in range(0, N_PLAYERS):
            ss.append(Holdem.showdown_hand_score(ps[i], com))
            # print ps[i], ss[i]
            # # if ss[i][0] == '9':
            # #     exit()
        # print 'best:'
        max_index, max_value = max(enumerate(ss), key=operator.itemgetter(1))
        # print max_index, max_value
        if ss[0] == ss[1]:
            wins[0] += 0.5
            wins[1] += 0.5
        else:
            wins[max_index] += 1  # OCOC what about ties?

    for i_wins in wins:
        print round(float(i_wins) / N_LOOP * 1000) / 10.0
Beispiel #4
0
class CAHGame(object):
    def __init__(self, server, channel):
        self.status = "Waiting for players to join"

        # Keep track of the current channel/server
        self.channel = channel
        self.server = server

        #flag to keep track of whether or not game is running
        self.running = True

        #list of active players in a game
        self.players = []

        #dummy with a small deck for testing.
        #replace with actual card loading from DB later
        self.deck = Deck()

        # Who is the current czar in self.players?
        # Starting at -1 so the first iteration has the czar be the first person to join
        self.current_czar = -1

        # What is the current black card?
        self.current_card = None

        # Cards submitted
        self.submissions = {}

    #add a new player to the game
    def add_player(self, name):
        #check to see if player already in game
        if name in [p.name for p in self.players]:
            return False
        else:
            player = Player(name)
            self.players.append(player)
            self.deal(player)
            return player

    def get_player(self, name):
        players = [p for p in self.players if p.name == name]
        if len(players) == 1:
            return players[0]
        else:
            return None

    #start the game
    def start(self):
        # Reset back to the start
        self.status = "Waiting for player selection"

        # Remove previous submissions from players' hands
        for player, submissions in self.submissions.iteritems():
            for card in submissions:
                if card in player.hand: player.hand.remove(card)

        self.submissions = {}

        # Refresh player hands
        for player in self.players:
            self.deal(player)

        # Deal the new black card
        new_card = self.deal_black()
        if new_card is None:
            self.message("Out of black cards! You played a long game!")
            self.end() # TODO: make this end the game when out of black cards
            return

        czar = self.choose_czar()
        self.message("The new czar is %s" % czar.name)
        self.message("%s has drawn: %s" % (czar.name, self.current_card.body))

        # Show players their current hand
        for player in [player for player in self.players if player.name != czar.name]:
            self.message("You will need to choose \x02%d\x0F cards with the 'select X' command, where X is the card's position in your hand." % self.cards_needed, player)
            if self.cards_needed > 1:
                self.message("NOTE: To submit multiple cards, use the cah command 'select X Y ...', where the card numbers are separated by a space.", player)
            # Display hand
            self.message("Ok, here's your hand:", player)
            for num, card in enumerate(player.hand):
                self.message("%d. %s" % (num+1, card.body), player)

    def end(self):
        #check if game is already running
        if self.running:
            self.message("The game has ended.")
            for place, player in enumerate(sorted(self.players, key=lambda x: x.score, reverse=True)):
                self.message("%d. %s with %d points" % (place+1, player.name, player.score))
            self.running = False
            self.deck.reset()
        else:
            self.message("There's no game running!  Use '@cah new' to start a new game.")

    # Choose cards to play
    def select(self, player, cards):
        # Fail if the player is the Czar OR it's not time for players to select cards
        if self.status != "Waiting for player selection" or self.players[self.current_czar].name == player.name:
            self.message("This isn't your turn!", player)
            return

        # Fail if player didn't select the right amount of cards
        if len(cards) != self.cards_needed:
            self.message("You need to play %d cards _only_" % self.cards_needed, player)
            return

        # Fail if cards are invalid (they should have been sanitized to ints in cah.py)
        for card in cards:
            if card > len(player.hand) or card <= 0:
                self.message("You don't have a card %d in your hand!" % card, player)
                return

        # Insert cards into the submissions dictionary
        self.submissions[player] = [player.hand[card-1] for card in cards]

        # Continue on in the game loop if all but the czar have voted
        if len(self.submissions) == len(self.players)-1:
            self.display_selections()
            self.status = "Waiting for Czar vote"

    # Present the funnies
    def display_selections(self):
        self.message("Results are in!")
        # Question cards are only displayed once, then the replies are presented as choices
        if "_" not in self.current_card.body:
            self.message(self.current_card.body)
            for num, submission in enumerate(self.submissions.values()):
                self.message("%d. %s" % (num+1, ', '.join([x.body for x in submission])))
        # Other cards have the white card answeres filled in the blanks (with bold and underline)
        else:
            for num, submission in enumerate(self.submissions.values()):
                replacements = []
                filled_in = self.current_card.body.replace("%","%%").replace("_", "%s")
                for i in range(self.cards_needed):
                    replacements.append("\x02\x1F%s\x0F" % submission[i].body)
                filled_in = filled_in % tuple(replacements)
                self.message("%d. %s" % (num+1, filled_in))

        # Prompt the czar to not be lazy...
        self.message("Now for %s to vote..." % self.players[self.current_czar].name)

    # Czar vote
    def vote(self, player, vote):
        # Fail if the player isn't the current Czar
        if player.name != self.players[self.current_czar].name:
            self.message("You are not the Czar!", player)
            return

        # Fail if it's not time for the Czar to vote
        if self.status != "Waiting for Czar vote":
            self.message("We're not ready for you to vote.", player)
            return

        # Fail if the czar vote for a choice that isn't present
        if vote <= 0 or vote > len(self.players)-1:
            self.message("%d isn't a valid vote selection." % vote, player)
            return

        # Display and increase score for the Czar's choice
        winning_player = self.submissions.keys()[vote-1]
        self.message("%s won this round! The winning combination was..." % winning_player.name)

        winning_player.score += 1

        # TODO: refactor this and the bit in display_selections
        # see display_selections, this is the same, except it only displays a single submission
        if "_" not in self.current_card.body:
            self.message(self.current_card.body)
            self.message(', '.join([x.body for x in self.submissions.values()[vote-1]]))
        else:
            replacements = []
            filled_in = self.current_card.body.replace("%","%%").replace("_", "%s")
            for i in range(self.cards_needed):
                replacements.append("\x02\x1F%s\x0F" % self.submissions.values()[vote-1][i].body)
            filled_in = filled_in % tuple(replacements)
            self.message(filled_in)

        # And start the game loop over
        self.start()

    #deal cards to player until hand size is 10
    def deal(self, player):
        handSize = len(player.hand)

        while handSize < 10:
            player.hand.append(self.deck.draw("white"))
            handSize += 1

        return player.hand

    def choose_czar(self):
        self.current_czar = (self.current_czar + 1) % len(self.players)
        return self.players[self.current_czar]

    def deal_black(self):
        try:
            self.current_card = self.deck.draw("black")
            return self.current_card
        except NoMoreCards:
            return None

    def message(self, body, player=None):
        if player is not None:
            self.server.notice(player.name, body)
        else:
            self.server.privmsg(self.channel, body)

    @property
    def cards_needed(self):
        return self.current_card.num_answers
Beispiel #5
0
def main(): #Function that brings all other functions together in one place
    '''main function'''
    RULES = '''
    Basra Card Game:
        This game belongs to a category of card games called “fishing cards games”. 
        Each player in turn matches a card from their hand with one (or more) of those 
        lying face-up on the table and then takes them. 
        If the card which the player played out does not match one of the existing cards, 
        it stays on the table.
    To win, you have to collect more points.'''
    
    print(RULES) 
    D = Deck()
    p1_cards = [] # card in hands player1
    p2_cards = [] #card in hands player2
    t_cards = []   # card on the floor
    p1_pile = [] # for player1
    p2_pile = [] # for player2
    basra_1 = []
    basra_2 = []
    p1_turn = (0,2,4,6)
    p2_turn = (1,3,5,7)
    game = True
    game_quit = False
    
    answer = input("Would you like to play? y/Y or n/N?")
    while answer!='n':
        print(" ---------Start The game--------")
        D.shuffle()
        while game == True: #replace by the correct condition
            for rounds in range(6):
                if rounds == 0:
                    distribute_cards(D,p1_cards,p2_cards,t_cards,True)
                    print('Dealing the cards, 4 cards for each player, 4 cards on the table')
                    print('Cards left:  {}'.format(D.__len__()))
                    display_table(t_cards,p1_cards,p2_cards)
                else:
                    distribute_cards(D,p1_cards,p2_cards,t_cards,False)
                    print('')
                    print('------Start new round-----')
                    print('Dealing the cards, 4 cards for each player')
                    print('Cards left:  {}'.format(D.__len__()))
                    display_table(t_cards,p1_cards,p2_cards)
                for turn in range(8):
                    while turn in p1_turn:
                        card_index = input("Player {:d} turn: -> ".format(1))
                        if card_index == 'q':
                            game = False
                            game_quit = True
                            break
                        try:
                            play(p1_cards[int(card_index)],p1_cards,p1_pile,basra_1,t_cards)
                        except:
                            print('Please enter a valid card index, 0 <= index <= {:d}'.format(len(p1_cards)-1))
                        else:
                            display_table(t_cards,p1_cards,p2_cards)
                            break
                    if game_quit == True:
                        break
                    while turn in p2_turn:
                        card_index = input("Player {:d} turn: -> ".format(2))
                        if card_index == 'q':
                            game = False
                            game_quit = True
                            break
                        try:
                            play(p2_cards[int(card_index)],p2_cards,p2_pile,basra_2,t_cards)
                        except:
                            print('Please enter a valid card index, 0 <= index <= {:d}'.format(len(p2_cards)-1))
                        else:
                            display_table(t_cards,p1_cards,p2_cards)
                            break
                    if game_quit == True:
                        break
                turn = 0
                if t_cards != []:
                    if game == True:
                        if turn in p1_turn:
                            p1_pile.append(t_cards)
                        else:
                            p2_pile.append(t_cards)
                        t_cards = []
                        display_table(t_cards,p1_cards,p2_cards)
                if game == False:
                    break
            if D.is_empty() == True:
                display_table(t_cards,p1_cards,p2_cards)
                score = compute_score(p1_pile,p2_pile,basra_1,basra_2)
                print('player 1:  {}'.format(score[0]))
                print('player 2:  {}'.format(score[1]))
                print('')
                if score[0] > score[1]:
                    print('Player 1 is the winner')
                    game = False
                else:
                    print('Player 2 is the winner')
                    game = False
                    
# useful strings to match tests (put them in a loop to reprompt on bad input)
# print('Please enter a valid card index, 0 <= index <= {:d}'.format(len(p1_cards)-1))
# card_index = input("Player {:d} turn: -> ".format(turn))

# remember to clear the data structures before the next game
# deck.reset()
# p1_cards.clear() # card in hands player1
# p2_cards.clear() #card in hands player2
# t_cards.clear()   # card on the floor
# p1_pile.clear() # pile for player1
# p2_pile.clear() # pile for player2
# basra_1.clear() # basra for player1
# basra_2.clear() #basra for player2
        if game_quit == True:
            break
        answer = input("Would you like to play? y/Y or n/N? ")
        if answer.lower() == 'y':
            D.reset()
            p1_cards.clear() # card in hands player1
            p2_cards.clear() #card in hands player2
            t_cards.clear()   # card on the floor
            p1_pile.clear() # pile for player1
            p2_pile.clear() # pile for player2
            basra_1.clear() # basra for player1
            basra_2.clear() #basra for player2
    print('Thanks for playing. See you again soon.')
Beispiel #6
0
class Session:
    def __init__(self, n_bbs, bb_size, rake_size, strategies):
        self.n_bbs = n_bbs
        self.bb_size = bb_size
        self.rake_size = rake_size

        self.n_spots = 0
        self.rake_accum = 0

        self.players = []
        for strategy in strategies:
            self.players.append(
                Player(
                    len(self.players) + 1, strategy, START_BALANCE,
                    n_bbs * bb_size))
        self.n_players = len(self.players)
        self.dealer_idx = self.n_players - 1  # Start with the first player as SB
        self.deck = Deck()

    def run(self, n_spots):
        self.report()
        for i in range(n_spots):
            self.handle_spot()
            self.dealer_idx = (self.dealer_idx + 1) % self.n_players
            self.report()
        self.report()

    def handle_spot(self):
        self.n_spots += 1
        self.deck.reset()
        hands = self.deck.deal_players(self.n_players)

        for h in hands:
            print h

        balances = [0] * self.n_players
        for i_player in range(self.n_players):
            player_idx = (self.dealer_idx + POS_UTG_VS_DEALER +
                          i_player) % self.n_players
            balances[i_player] = self.players[player_idx].table_balance

        bet_sizes = [0] * self.n_players
        pot_size = 0
        player_sb_idx = (self.dealer_idx + POS_SB_VS_DEALER) % self.n_players
        bet_sizes[player_sb_idx] = self.players[player_sb_idx].bet(
            self.bb_size / 2)  # SB
        pot_size += bet_sizes[player_sb_idx]
        player_bb_idx = (self.dealer_idx + POS_BB_VS_DEALER) % self.n_players
        bet_sizes[player_bb_idx] = self.players[player_bb_idx].bet(
            self.bb_size)  # BB
        pot_size += bet_sizes[player_bb_idx]

        allin_participants = []
        for i_player in range(self.n_players):
            if i_player == self.n_players - 1 and len(allin_participants) == 0:
                break  # When no one bet and last player to act

            player_idx = (self.dealer_idx + POS_UTG_VS_DEALER +
                          i_player) % self.n_players
            is_allin = self.players[player_idx].act(hands[player_idx],
                                                    balances,
                                                    POSITIONS_LIST[i_player],
                                                    None)
            if is_allin:
                bet_sizes[player_idx] += self.players[player_idx].go_allin()
                pot_size += bet_sizes[player_idx]
                allin_participants.append({
                    'player_idx': player_idx,
                    'hand': hands[player_idx],
                    'bet': bet_sizes[player_idx]
                })
            else:
                balances[i_player] = 0

        if len(allin_participants) == 0:
            player_idx = (self.dealer_idx + POS_BB_VS_DEALER) % self.n_players
            self.players[player_idx].eval_walk(pot_size)
        elif len(allin_participants) == 1:
            player_idx = allin_participants[0]['player_idx']
            self.players[player_idx].eval_spot_result(
                allin_participants[0]['bet'], pot_size)
        else:
            com = self.deck.deal_community()
            for c in com:
                print c
            hand_ranks = []
            for i in range(0, len(allin_participants)):
                hand_ranks.append(
                    Holdem.showdown_hand_score(allin_participants[i]['hand'],
                                               com))

            # OCOC evaluate hand ranks and side pots...
            participant_bets = [item['bet'] for item in allin_participants]
            participant_wins = Holdem.distribute_pot(hand_ranks,
                                                     participant_bets)
            for i in range(0, len(allin_participants)):
                player_idx = allin_participants[i]['player_idx']
                self.players[player_idx].eval_spot_result(
                    allin_participants[i]['bet'], participant_wins[i])

    def report(self):
        for pl in self.players:
            print pl
        print sum([p.wallet_balance + p.table_balance for p in self.players])
Beispiel #7
0
class CAHGame(object):
    def __init__(self, server, channel):
        self.status = "Waiting for players to join"

        # Keep track of the current channel/server
        self.channel = channel
        self.server = server

        #flag to keep track of whether or not game is running
        self.running = True

        #list of active players in a game
        self.players = []

        #dummy with a small deck for testing.
        #replace with actual card loading from DB later
        self.deck = Deck()

        # Who is the current czar in self.players?
        # Starting at -1 so the first iteration has the czar be the first person to join
        self.current_czar = -1

        # What is the current black card?
        self.current_card = None

        # Cards submitted
        self.submissions = {}

    #add a new player to the game
    def add_player(self, name):
        #check to see if player already in game
        if name in [p.name for p in self.players]:
            return False
        else:
            player = Player(name)
            self.players.append(player)
            self.deal(player)
            return player

    def get_player(self, name):
        players = [p for p in self.players if p.name == name]
        if len(players) == 1:
            return players[0]
        else:
            return None

    #start the game
    def start(self):
        # Reset back to the start
        self.status = "Waiting for player selection"

        # Remove previous submissions from players' hands
        for player, submissions in self.submissions.iteritems():
            for card in submissions:
                if card in player.hand: player.hand.remove(card)

        self.submissions = {}

        # Refresh player hands
        for player in self.players:
            self.deal(player)

        # Deal the new black card
        new_card = self.deal_black()
        if new_card is None:
            self.message("Out of black cards! You played a long game!")
            self.end()  # TODO: make this end the game when out of black cards
            return

        czar = self.choose_czar()
        self.message("The new czar is %s" % czar.name)
        self.message("%s has drawn: %s" % (czar.name, self.current_card.body))

        # Show players their current hand
        for player in [
                player for player in self.players if player.name != czar.name
        ]:
            self.message(
                "You will need to choose \x02%d\x0F cards with the 'select X' command, where X is the card's position in your hand."
                % self.cards_needed, player)
            if self.cards_needed > 1:
                self.message(
                    "NOTE: To submit multiple cards, use the cah command 'select X Y ...', where the card numbers are separated by a space.",
                    player)
            # Display hand
            self.message("Ok, here's your hand:", player)
            for num, card in enumerate(player.hand):
                self.message("%d. %s" % (num + 1, card.body), player)

    def end(self):
        #check if game is already running
        if self.running:
            self.message("The game has ended.")
            for place, player in enumerate(
                    sorted(self.players, key=lambda x: x.score, reverse=True)):
                self.message("%d. %s with %d points" %
                             (place + 1, player.name, player.score))
            self.running = False
            self.deck.reset()
        else:
            self.message(
                "There's no game running!  Use '@cah new' to start a new game."
            )

    # Choose cards to play
    def select(self, player, cards):
        # Fail if the player is the Czar OR it's not time for players to select cards
        if self.status != "Waiting for player selection" or self.players[
                self.current_czar].name == player.name:
            self.message("This isn't your turn!", player)
            return

        # Fail if player didn't select the right amount of cards
        if len(cards) != self.cards_needed:
            self.message(
                "You need to play %d cards _only_" % self.cards_needed, player)
            return

        # Fail if cards are invalid (they should have been sanitized to ints in cah.py)
        for card in cards:
            if card > len(player.hand) or card <= 0:
                self.message("You don't have a card %d in your hand!" % card,
                             player)
                return

        # Insert cards into the submissions dictionary
        self.submissions[player] = [player.hand[card - 1] for card in cards]

        # Continue on in the game loop if all but the czar have voted
        if len(self.submissions) == len(self.players) - 1:
            self.display_selections()
            self.status = "Waiting for Czar vote"

    # Present the funnies
    def display_selections(self):
        self.message("Results are in!")
        # Question cards are only displayed once, then the replies are presented as choices
        if "_" not in self.current_card.body:
            self.message(self.current_card.body)
            for num, submission in enumerate(self.submissions.values()):
                self.message("%d. %s" %
                             (num + 1, ', '.join([x.body
                                                  for x in submission])))
        # Other cards have the white card answeres filled in the blanks (with bold and underline)
        else:
            for num, submission in enumerate(self.submissions.values()):
                replacements = []
                filled_in = self.current_card.body.replace("%", "%%").replace(
                    "_", "%s")
                for i in range(self.cards_needed):
                    replacements.append("\x02\x1F%s\x0F" % submission[i].body)
                filled_in = filled_in % tuple(replacements)
                self.message("%d. %s" % (num + 1, filled_in))

        # Prompt the czar to not be lazy...
        self.message("Now for %s to vote..." %
                     self.players[self.current_czar].name)

    # Czar vote
    def vote(self, player, vote):
        # Fail if the player isn't the current Czar
        if player.name != self.players[self.current_czar].name:
            self.message("You are not the Czar!", player)
            return

        # Fail if it's not time for the Czar to vote
        if self.status != "Waiting for Czar vote":
            self.message("We're not ready for you to vote.", player)
            return

        # Fail if the czar vote for a choice that isn't present
        if vote <= 0 or vote > len(self.players) - 1:
            self.message("%d isn't a valid vote selection." % vote, player)
            return

        # Display and increase score for the Czar's choice
        winning_player = self.submissions.keys()[vote - 1]
        self.message("%s won this round! The winning combination was..." %
                     winning_player.name)

        winning_player.score += 1

        # TODO: refactor this and the bit in display_selections
        # see display_selections, this is the same, except it only displays a single submission
        if "_" not in self.current_card.body:
            self.message(self.current_card.body)
            self.message(', '.join(
                [x.body for x in self.submissions.values()[vote - 1]]))
        else:
            replacements = []
            filled_in = self.current_card.body.replace("%", "%%").replace(
                "_", "%s")
            for i in range(self.cards_needed):
                replacements.append(
                    "\x02\x1F%s\x0F" %
                    self.submissions.values()[vote - 1][i].body)
            filled_in = filled_in % tuple(replacements)
            self.message(filled_in)

        # And start the game loop over
        self.start()

    #deal cards to player until hand size is 10
    def deal(self, player):
        handSize = len(player.hand)

        while handSize < 10:
            player.hand.append(self.deck.draw("white"))
            handSize += 1

        return player.hand

    def choose_czar(self):
        self.current_czar = (self.current_czar + 1) % len(self.players)
        return self.players[self.current_czar]

    def deal_black(self):
        try:
            self.current_card = self.deck.draw("black")
            return self.current_card
        except NoMoreCards:
            return None

    def message(self, body, player=None):
        if player is not None:
            self.server.notice(player.name, body)
        else:
            self.server.privmsg(self.channel, body)

    @property
    def cards_needed(self):
        return self.current_card.num_answers