예제 #1
0
def test_get_flop():
    deck = Deck()
    deck.get_hand()  # Hand for player 1, 52-2=50
    deck.get_hand()  # Hand for player 2, 50-2=48

    card1, card2, card3 = deck.get_flop()  # 48-4(flop+burn card) = 44
    assert card1.__str__() != card2.__str__() != card3.__str__()
    assert len(deck._cards) == 44
예제 #2
0
 def __init__(self, round_num, players):
     """
     Args:
         round_num (int): round number --> determines how many cards are dealt to each player
         players (:obj: `list` of :obj: `int`): list of player objects
     """
     self.round_num = round_num
     self.players = players
     self.deck = Deck()
     self.predictions = [-1] * len(players)
     self.trump_card = None
     # -1 adjusts for 1-index in game numbers and 0-index in players
     self.first_player = (round_num - 1) % len(players)
     self.played_cards = dict()
예제 #3
0
def test_get_next_card_river():
    deck = Deck()
    deck.get_hand()  # Hand for player 1, 52-2=50
    deck.get_hand()  # Hand for player 2, 50-2=48
    deck.get_flop()  # flop + burn card, 48-3-1 = 44
    deck.get_next_card()  # Turn + burn card, 44-1-1 = 42
    deck.get_next_card()  # River + burn card, 42-1-1 = 40
    assert len(deck._cards) == 40
예제 #4
0
def test_all_cards_unique():
    seen = set()
    uniq = []
    deck = Deck()
    for card in deck._cards:
        if card.__str__() not in seen:
            uniq.append(card.__str__())
            seen.add(card.__str__())
    assert len(uniq) == 52
#!/usr/bin/env python3
"""This test is specifically used to examine the behaviour of some of the rule_based_agent functions"""

from random import seed
import numpy as np
import sys

sys.path.append('../')

from game_engine.card import Card
from game_engine.deck import Deck
from agents.rule_based_agent import RuleBasedAgent

joker = Card('White', 14)
deck = Deck()
card = Deck.draw(deck)[0]
played = Deck.draw(deck, 3)
trump = Deck.draw(deck)[0]
print(played)
player = RuleBasedAgent()
print(card)
print(trump)
print(player.win_probability(played, card, trump, played[0], range(4)))
print(player.number_of_stronger_cards_remaining(card, trump, played[0],
                                                played))
예제 #6
0
def test_cards_total():
    deck = Deck()
    assert len(deck._cards) == 52
예제 #7
0
def test_get_hand():
    deck = Deck()
    card1, card2 = deck.get_hand()
    assert card1.__str__() != card2.__str__()
    assert len(deck._cards) == 50
예제 #8
0
 def __init__(self, players, blinds):
     self._board = []
     self._pot = 0
     self._players = players
     self._deck = Deck()
     self._small_blind, self._big_blind = blinds
예제 #9
0
class Round:
    """Round object, plays a number of tricks and awards points depending
    on the outcome of the tricks and the predictions.

    Attributes:
        round_num (int): round number --> determines how many cards are dealt to each player
        players (:obj: `list` of :obj: `int`): list of player objects
        deck (:obj: `Deck`): deck containing all cards
        predictions (:obj: `list` of `int): list containing predictions of each player
        trump_card (:obj: `Card`, None): trump color of the round. Is initialized with `Card` in play method.
        first_player (int): index of player that is coming out in this round
        played_cards (:obj: `list` of :obj: `Card`): list of cards that have already been played in the round
    """
    def __init__(self, round_num, players):
        """
        Args:
            round_num (int): round number --> determines how many cards are dealt to each player
            players (:obj: `list` of :obj: `int`): list of player objects
        """
        self.round_num = round_num
        self.players = players
        self.deck = Deck()
        self.predictions = [-1] * len(players)
        self.trump_card = None
        # -1 adjusts for 1-index in game numbers and 0-index in players
        self.first_player = (round_num - 1) % len(players)
        self.played_cards = dict()

    def play_round(self):
        """Plays on round. Determines Trump Color. Asks for Predictions. Play all Tricks. Determine Scores for each Player

        Returns:
            list of int: scores for each player
        """
        # Holds the played cards for each player (index of player in players are the keys)
        self.played_cards = dict()
        for index, player in enumerate(self.players):
            self.played_cards[index] = []

        # Determining the Trump Color
        self.trump_card = self.distribute_cards()[0]

        if self.trump_card is None:
            # We distributed all cards, the trump is N. (No trump)
            self.trump_card = Card("White", 0)

        if self.trump_card.value == 14:
            # Trump card is a Z, ask the dealer for a trump color.
            self.trump_card.color =\
                self.players[self.first_player].get_trump_color()

        # Now that each player has a hand, ask for predictions.
        self.ask_for_predictions()
        # print("Final predictions {}".format(self.predictions))

        # Reset and initialize all wins.
        wins = [0] * len(self.players)
        for i, player in enumerate(self.players):
            player.wins = wins[i]

        for trick_num in range(self.round_num):
            # Play a trick for each card in the hand (or round number).
            trick = Trick(self.trump_card, self.players, self.first_player,
                          self.played_cards)
            winner, trick_cards = trick.play_trick()

            # Trick winner gets a win and starts the next trick.
            wins[winner] += 1
            self.first_player = winner

            # Update wins
            for i, player in enumerate(self.players):
                player.wins = wins[i]
            # print("Player {} won the trick!".format(winner))
        return self.get_scores(wins)

    def distribute_cards(self):
        # Draw as many cards as game num.
        for player in self.players:
            player.hand += self.deck.draw(self.round_num)
        # Flip the next card, that is the trump card.
        if self.deck.is_empty():
            return [None]
        else:
            return self.deck.draw()

    def ask_for_predictions(self):
        num_players = len(self.players)
        for i in range(num_players):
            # Start with the first player and ascend, then reset at 0.
            current_player_index = (self.first_player + i) % num_players
            player = self.players[current_player_index]
            prediction = player.get_prediction(trump=self.trump_card,
                                               num_players=len(self.players))
            self.predictions[current_player_index] = prediction
            # print("Player {} predicted {}".format(current_player_index, prediction))

    def get_scores(self, wins):
        scores = [0] * len(self.players)
        for i, player in enumerate(self.players):
            difference = self.predictions[i] - wins[i]
            if difference == 0:
                scores[i] = 20 + wins[i] * 10
            else:
                scores[i] = -10 * abs(difference)
            # print("Player score for this round {}: {}".format(i, scores[i]))
            player.announce_result(wins[i], scores[i])
        return scores