Пример #1
0
def show_new_game(game_canvas: 'GameCanvas'):
    game = game_canvas.game_canvas_updater.env_thread.gin_rummy_env.game
    game_canvas.dealer_id = game.round.dealer_id
    dealer = game.round.dealer
    shuffled_deck = dealer.shuffled_deck
    # Deal cards to players
    if utils.is_debug():
        for card_id in range(52):
            card_item_id = game_canvas.card_item_ids[card_id]
            tags = game_canvas.gettags(card_item_id)
            assert not tags
    for i in range(2):
        player_id = (game_canvas.dealer_id + 1 + i) % 2
        anchor_x, anchor_y = game_canvas.player_held_pile_anchors[player_id]
        face_up = True
        # Note: cannot use card_ids = [gin_rummy_utils.get_card_id(card) for card in game.round.players[player_id].hand]
        if not game_canvas.is_treating_as_human(player_id=player_id):
            face_up = False
        if i == 0:
            dealt_cards = list(shuffled_deck[-11:])
        else:
            dealt_cards = list(shuffled_deck[-21:-11])
        card_ids = [gin_rummy_utils.get_card_id(card=card) for card in dealt_cards]
        card_ids = sorted(card_ids, reverse=True, key=utils.gin_rummy_sort_order_id)
        for card_id in card_ids:
            card_item_id = game_canvas.card_item_ids[card_id]
            if utils.is_debug() or True:
                tags = game_canvas.gettags(card_item_id)
                assert not tags
            game_canvas.tag_raise(card_item_id)  # note this
            game_canvas.itemconfig(card_item_id, tag=game_canvas.held_pile_tags[player_id])
            utils.set_card_id_face_up(card_id=card_id, face_up=face_up, game_canvas=game_canvas)
            utils.move_to(card_item_id, anchor_x, anchor_y, parent=game_canvas)
            game_canvas.itemconfigure(card_item_id, state=tk.NORMAL)
            anchor_x += game_canvas.held_pile_tab
    # Deal stockpile cards
    stock_pile_x, stock_pile_y = game_canvas.stock_pile_anchor
    # Note: cannot use stock_pile = [gin_rummy_utils.get_card_id(card) for card in game.round.dealer.stock_pile]
    stock_pile = list(shuffled_deck[:31])
    stock_pile_card_ids = [gin_rummy_utils.get_card_id(card) for card in stock_pile]
    for card_id in stock_pile_card_ids:
        card_item_id = game_canvas.card_item_ids[card_id]
        if utils.is_debug():
            tags = game_canvas.gettags(card_item_id)
            assert not tags
        game_canvas.tag_raise(card_item_id)  # note this
        game_canvas.itemconfig(card_item_id, tag=configurations.STOCK_PILE_TAG)
        utils.set_card_id_face_up(card_id=card_id, face_up=False, game_canvas=game_canvas)
        utils.move_to(card_item_id, stock_pile_x, stock_pile_y, parent=game_canvas)
        game_canvas.itemconfigure(card_item_id, state=tk.NORMAL)
        stock_pile_x += game_canvas.stock_pile_tab
    # update canvas
    game_canvas.update()  # seems to be needed: scores not cleared if 'new game' chosen from menu with no mouse move
    if utils.is_debug():
        settings = game.settings
        settings.print_settings()
 def put_down_meld_cluster(self, meld_cluster, player_id: int):
     game_canvas = self.game_canvas
     card_width = game_canvas.card_width
     card_height = game_canvas.card_height
     player_pane = game_canvas.player_panes[player_id]
     y_tab = int(card_height * 0.15)
     anchor_x = int(card_width * 0.5)  # type: int
     anchor_y = int(game_canvas.coords(player_pane.item_id)[1]) + y_tab  # type: int
     for index in range(len(meld_cluster)):
         meld_pile = meld_cluster[index]
         self.put_down_meld_pile(meld_pile, anchor=(anchor_x, anchor_y), player_id=player_id)
         utils.fan_held_pile(player_id=player_id, game_canvas=game_canvas)
         anchor_x += len(meld_pile) * game_canvas.held_pile_tab
         anchor_y += y_tab
     held_pile_item_ids = game_canvas.getter.get_held_pile_item_ids(player_id=player_id)
     if not game_canvas.query.is_human(player_id):
         # sort deadwood cards of computer player
         held_pile_cards = game_canvas.getter.get_held_pile_cards(player_id=player_id)
         card_ids = [gin_rummy_utils.get_card_id(card) for card in held_pile_cards]
         sorted_card_ids = sorted(card_ids, reverse=True, key=utils.gin_rummy_sort_order_id)
         for sorted_card_id in sorted_card_ids:
             card_item_id = game_canvas.card_item_ids[sorted_card_id]
             game_canvas.tag_raise(card_item_id)
         utils.fan_held_pile(player_id, game_canvas=game_canvas)
         # face up deadwood cards of computer player
         for held_pile_item_id in held_pile_item_ids:
             utils.set_card_item_id_face_up(card_item_id=held_pile_item_id, face_up=True, game_canvas=game_canvas)
Пример #3
0
def get_all_run_melds(hand: List[Card]) -> List[List[Card]]:
    card_count = len(hand)
    hand_by_suit = sorted(hand, key=lambda card: utils.get_card_id(card))
    max_run_melds = []

    i = 0
    while i < card_count - 2:
        card_i = hand_by_suit[i]
        j = i + 1
        card_j = hand_by_suit[j]
        while utils.get_rank_id(card_j) == utils.get_rank_id(
                card_i) + j - i and card_j.suit == card_i.suit:
            j += 1
            if j < card_count:
                card_j = hand_by_suit[j]
            else:
                break
        max_run_meld = hand_by_suit[i:j]
        if len(max_run_meld) >= 3:
            max_run_melds.append(max_run_meld)
        i = j

    result = []
    for max_run_meld in max_run_melds:
        max_run_meld_count = len(max_run_meld)
        for i in range(max_run_meld_count - 2):
            for j in range(i + 3, max_run_meld_count + 1):
                result.append(max_run_meld[i:j])
    return result
Пример #4
0
def get_all_run_melds_for_suit(cards: List[Card],
                               suit: str) -> List[List[Card]]:
    cards_for_suit = [card for card in cards if card.suit == suit]
    cards_for_suit_count = len(cards_for_suit)
    cards_for_suit = sorted(cards_for_suit,
                            key=lambda card: utils.get_card_id(card))
    max_run_melds = []

    i = 0
    while i < cards_for_suit_count - 2:
        card_i = cards_for_suit[i]
        j = i + 1
        card_j = cards_for_suit[j]
        while utils.get_rank_id(card_j) == utils.get_rank_id(card_i) + j - i:
            j += 1
            if j < cards_for_suit_count:
                card_j = cards_for_suit[j]
            else:
                break
        max_run_meld = cards_for_suit[i:j]
        if len(max_run_meld) >= 3:
            max_run_melds.append(max_run_meld)
        i = j

    result = []
    for max_run_meld in max_run_melds:
        max_run_meld_count = len(max_run_meld)
        for i in range(max_run_meld_count - 2):
            for j in range(i + 3, max_run_meld_count + 1):
                result.append(max_run_meld[i:j])
    return result
 def put_down_meld_pile(self, meld_pile: List[Card], anchor: Tuple[int, int], player_id: int):
     game_canvas = self.game_canvas
     held_pile_tag = game_canvas.held_pile_tags[player_id]
     x, y = anchor
     card_ids = [gin_rummy_utils.get_card_id(card=card) for card in meld_pile]
     sorted_card_ids = sorted(card_ids, reverse=True, key=utils.gin_rummy_sort_order_id)
     for sorted_card_id in sorted_card_ids:
         card_item_id = game_canvas.card_item_ids[sorted_card_id]
         game_canvas.tag_raise(card_item_id)
         game_canvas.dtag(card_item_id, held_pile_tag)
         utils.move_to(card_item_id, x, y, game_canvas)
         utils.set_card_item_id_face_up(card_item_id, face_up=True, game_canvas=game_canvas)
         x += game_canvas.held_pile_tab
Пример #6
0
    def post_do_gin_action(self):
        game_canvas = self.game_canvas
        game_canvas.going_out_button.place_forget()
        current_player_id = game_canvas.current_player_id

        current_hand = game_canvas.getter.get_held_pile_cards(
            player_id=current_player_id)
        going_out_deadwood_count = self.game_canvas.game_canvas_updater.env.game.settings.going_out_deadwood_count
        _, gin_cards = judge.get_going_out_cards(
            hand=current_hand,
            going_out_deadwood_count=going_out_deadwood_count)
        card = gin_cards[0]
        card_id = gin_rummy_utils.get_card_id(card=card)
        card_item = game_canvas.card_items[card_id]
        selected_held_pile_item_id = card_item.item_id

        top_discard_pile_item_id = game_canvas.getter.get_top_discard_pile_item_id(
        )
        if top_discard_pile_item_id is None:
            to_location = game_canvas.discard_pile_anchor
        else:
            dx = game_canvas.discard_pile_tab
            to_location = game_canvas.coords(top_discard_pile_item_id)
            to_location = utils.translated_by(dx=dx,
                                              dy=0,
                                              location=to_location)
        utils.set_card_item_id_face_up(card_item_id=selected_held_pile_item_id,
                                       face_up=True,
                                       game_canvas=game_canvas)

        def loop_completion():
            game_canvas.dtag(selected_held_pile_item_id,
                             configurations.SELECTED_TAG)
            game_canvas.dtag(selected_held_pile_item_id,
                             configurations.JOGGED_TAG)
            game_canvas.dtag(selected_held_pile_item_id,
                             game_canvas.held_pile_tags[current_player_id])
            game_canvas.addtag_withtag(configurations.DISCARD_PILE_TAG,
                                       selected_held_pile_item_id)
            utils.fan_held_pile(player_id=current_player_id,
                                game_canvas=game_canvas)
            # show meld piles for both players
            self._show_meld_piles()
            # submit action to game_canvas_updater
            action = GIN_ACTION_ID
            game_canvas.after_idle(
                game_canvas.game_canvas_updater.did_perform_actions, [action])

        self._move_loop(selected_held_pile_item_id,
                        to_location,
                        completion=loop_completion)
Пример #7
0
def _get_all_run_melds(hand: List[Card]) -> List[List[Card]]:
    card_count = len(hand)
    hand_by_suit = sorted(hand, key=lambda card: utils.get_card_id(card))
    max_run_melds_from_left = [[] for _ in hand_by_suit]
    for i in range(card_count):
        card = hand_by_suit[i]
        card_rank_id = utils.get_card_id(card)
        max_run_melds_from_left[i].append(card)
        for j in range(i + 1, card_count):
            next_card = hand_by_suit[j]
            next_card_rank_id = utils.get_card_id(next_card)
            if next_card.suit != card.suit or next_card_rank_id != card_rank_id + (j - i):
                break
            else:
                max_run_melds_from_left[i].append(next_card)
    max_run_melds_from_left = [run_meld for run_meld in max_run_melds_from_left if len(run_meld) >= 3]
    result = copy.deepcopy(max_run_melds_from_left)
    for max_run_meld in max_run_melds_from_left:
        max_run_meld_count = len(max_run_meld)
        if max_run_meld_count > 3:
            for i in range(max_run_meld_count - 3):
                result.append(max_run_meld[:-(i + 1)])
    return result
Пример #8
0
 def test_gin_rummy_dealer(self):
     dealer = GinRummyDealer(np.random.RandomState())
     current_deck = utils.get_deck()
     deck_card_ids = [utils.get_card_id(card) for card in current_deck]
     self.assertEqual(deck_card_ids, list(range(52)))
     # Deal 10 cards.
     player = GinRummyPlayer(player_id=0, np_random=np.random.RandomState())
     dealer.deal_cards(player=player, num=10)
     self.assertEqual(len(dealer.shuffled_deck), 52)
     self.assertEqual(len(dealer.stock_pile), 42)
     self.assertEqual(len(current_deck), 52)
     self.assertEqual(len(utils.get_deck()), 52)
     # Pop top_card from current_deck.
     top_card = current_deck.pop(-1)
     self.assertEqual(str(top_card), "KC")
     self.assertEqual(len(current_deck), 51)
     self.assertEqual(len(utils.get_deck()), 52)
Пример #9
0
 def _perform_pick_up_discard_move(self, move: PickupDiscardMove):
     if utils.is_debug():
         print("{}".format(move))
     player = move.player
     player_id = player.player_id
     card = move.card
     source_item_id = self.game_canvas.getter.get_top_discard_pile_item_id()
     source_card_item_id = self.game_canvas.getter.get_card_id(
         card_item_id=source_item_id)
     assert source_card_item_id == gin_rummy_utils.get_card_id(card=card)
     self.game_canvas.addtag_withtag(configurations.DRAWN_TAG,
                                     source_item_id)
     target_item_id = self.game_canvas.getter.get_held_pile_item_ids(
         player_id=player_id)[-1]
     target_item = self.game_canvas.canvas_item_by_item_id[target_item_id]
     handling_tap_held_pile.handle_tap_held_pile(
         hit_item=target_item, game_canvas=self.game_canvas)
Пример #10
0
 def _perform_draw_card_move(self, move: DrawCardMove):
     if utils.is_debug():
         print("{}".format(move))
     player = move.player
     player_id = player.player_id
     card = move.card
     source_item_id = self.game_canvas.getter.get_top_stock_pile_item_id()
     source_card_item_id = self.game_canvas.getter.get_card_id(
         card_item_id=source_item_id)
     if not source_card_item_id == gin_rummy_utils.get_card_id(card=card):
         raise GinRummyProgramError(
             "source_card_item_id={} doesn't match with card={}.".format(
                 source_card_item_id, card))
     self.game_canvas.addtag_withtag(configurations.DRAWN_TAG,
                                     source_item_id)
     target_item_id = self.game_canvas.getter.get_held_pile_item_ids(
         player_id=player_id)[-1]
     target_item = self.game_canvas.canvas_item_by_item_id[target_item_id]
     handling_tap_held_pile.handle_tap_held_pile(
         hit_item=target_item, game_canvas=self.game_canvas)