From a7d9df18856cea0d7c6dfdf6d4b83f81bd84c4a0 Mon Sep 17 00:00:00 2001 From: Stefan Rupp Date: Mon, 13 Apr 2020 22:07:38 +0200 Subject: [PATCH] looks like it works --- server.py | 14 +--- templates/home/player.html | 8 +-- views/player.py | 18 +++-- wiz_game.py | 144 ++++++++++++++++++++++++++++++++++++- 4 files changed, 157 insertions(+), 27 deletions(-) diff --git a/server.py b/server.py index 768259c..c69f17b 100755 --- a/server.py +++ b/server.py @@ -11,19 +11,7 @@ def main(): print("main started") random.seed() - - #wiz_game.the_game.create_deck() - #wiz_game.the_game.add_player("p1", 1) - #wiz_game.the_game.add_player("p2", 2) - #wiz_game.the_game.add_player("p3", 3) - #wiz_game.the_game.add_player("p4", 4) - #wiz_game.the_game.deal_cards(12) - wiz_game.the_game.add_player("p1") - wiz_game.the_game.add_player("p2") - wiz_game.the_game.add_player("p3") - wiz_game.the_game.add_player("p4") - wiz_game.the_game.init_game() - + wiz_game.the_game.start_game() api.run(port=19203, address="127.0.0.1") exit(0) diff --git a/templates/home/player.html b/templates/home/player.html index d2a03ef..18ecbf0 100644 --- a/templates/home/player.html +++ b/templates/home/player.html @@ -11,13 +11,7 @@ Table
{% for player,card in played_cards %} || - {% if player.id == active_player %} - - {% endif %} {{player.name}}: {{card}} - {% if player.id == active_player %} - - {% endif %} {% endfor %} ||
@@ -36,7 +30,7 @@ {% endif %} {% endfor %} - {% if choose_trump_color %} + {% if choose_trump_color and (player == choose_trump_player) %} Choose Trump Color: Red> Green> diff --git a/views/player.py b/views/player.py index ba9da7b..f223b49 100644 --- a/views/player.py +++ b/views/player.py @@ -9,17 +9,23 @@ def show(req, resp, player: str): name = the_game.players[p].name tcard = the_game.trump_card tcolor = the_game.get_trump_color() - table = the_game.table - isActive = the_game.is_players_turn(p) - active_player = the_game.active_player + #isActive = the_game.is_players_turn(p) + try: + isActive = the_game.players_ordered[the_game.active_player].id == p + print("show p: {} | {}".format(the_game.players_ordered[the_game.active_player].id, p)) + except IndexError: + isActive = False + print("show p: {} | {}".format('None', p)) + + #active_player = the_game.active_player prev_player = the_game.get_prev_player() - if tcard.value == 'Z' and p == prev_player and tcolor == '-': + if tcard.value == 'Z' and tcolor == '-': choose_trump_color = True else: choose_trump_color = False - resp.content = api.template('home/player.html', playerActive=isActive, active_player=active_player, player=p, + resp.content = api.template('home/player.html', player=p, playerActive=isActive, choose_trump_player=prev_player, cards=the_game.players[p].cards, choose_trump_color=choose_trump_color, - trump_card=tcard, trump_color=tcolor, played_cards=table.played_cards) + trump_card=tcard, trump_color=tcolor, played_cards=the_game.played_cards) @api.route("/player/{player}/play/{card}") diff --git a/wiz_game.py b/wiz_game.py index d5567ba..81ebae9 100644 --- a/wiz_game.py +++ b/wiz_game.py @@ -107,6 +107,146 @@ class Table: class WizGame: + def __init__(self, player_names: list): + self.players = [Player(pn, idx) for idx, pn in enumerate(player_names)] + if len(self.players) > 6: + raise Exception # TODO: figure out more specific type + self.card_deck = [] + self.trump_card = None + self.start_player = 0 + self.active_player = 0 + self.current_round = 1 + self.num_tricks_played = 0 + self.played_cards = list() + self.players_ordered = self.players + + def start_game(self): + self.create_deck() + self.current_round = 1 + self.active_player = 0 + self.start_player = 0 + self.deal_cards(1) + self.played_cards = list() + self.players_ordered = self.players + + def create_deck(self): + self.card_deck = [] + for color in ["b", "r", "g", "y"]: + for val in range(1, 14): + self.card_deck.append(Card(color, val)) + for _ in range(1, 5): + self.card_deck.append(Card('-', 'Z')) + for _ in range(1, 5): + self.card_deck.append(Card('-', 'N')) + + def get_trump_color(self): + card = self.trump_card + if card: + if card.color: + return card.color + elif card.value == 'Z': + return 'choose' + else: + return None + else: + return None + + def deal_cards(self, cards_per_player): + random.shuffle(self.card_deck) + cs = list(chunks(self.card_deck, cards_per_player)) + for idx, p in enumerate(self.players): + p.set_cards(cs[idx]) + if len(cs) > len(self.players): + cc = cs[len(self.players)] + c = cc[0] + self.trump_card = c + else: + self.trump_card = None + + def get_trick_winner(self): + cards = self.played_cards + high_player, high_card = cards[0] + + for player, card in cards[1:]: + if get_higher_card(high_card, card, self.trump_card.color): + high_card = card + high_player = player + return high_player, high_card + + def is_trick_finished(self): + if len(self.played_cards) < len(self.players): + return False + else: + return True + + def is_hand_finished(self): + h = self.is_trick_finished() + if h and self.num_tricks_played == self.current_round: + return True + else: + return False + + def next_hand(self): + max_hands = len(self.card_deck)/len(self.players) + if self.current_round <= max_hands: + self.current_round += 1 + self.start_player += 1 + if self.start_player >= len(self.players): + self.start_player = 0 + self.active_player = 0 + self.players_ordered = self.players[self.start_player:] + self.players[:self.start_player] + self.played_cards.clear() + self.deal_cards(self.current_round) + self.num_tricks_played = 0 + return True + else: + return False + + def next_trick(self): + win = self.get_trick_winner() + winner = win[0] + #self.start_player = winner.id + starter = winner.id + self.players_ordered = self.players[starter:] + self.players[:starter] + self.active_player = 0 + self.played_cards.clear() + + def play_card(self, player, card): + p = self.players[player] + c = p.play_card(card) + t = (p, c) + self.played_cards.append(t) + #self.next_player() + self.active_player += 1 + if self.is_trick_finished(): + self.num_tricks_played += 1 + + def set_trump_color(self, trump_color): + if self.trump_card.value != 'Z': + return False + else: + if trump_color not in ["b", "r", "g", "y"]: + return False + else: + self.trump_card.color = trump_color + return True + +# def next_player(self): +# if not self.is_hand_finished(): +# self.active_player += 1 +# if self.active_player >= len(self.players): +# self.active_player = 0 +# else: +# self.active_player = None + + def get_prev_player(self): + if self.start_player == 0: + return len(self.players)-1 + else: + return self.start_player-1 + + +class WizGame_legacy: def __init__(self): self.players = [] self.card_deck = [] @@ -254,5 +394,7 @@ class WizGame: else: return False -the_game = WizGame() + +p = ["p1", "p2", "p3", "p4"] +the_game = WizGame(p)