diff --git a/UI.py b/UI.py index a19811d..7f53c69 100644 --- a/UI.py +++ b/UI.py @@ -262,6 +262,7 @@ class ScrollList(GenericUI): self.redraw() def replace_list(self, texts): + self.reset_scroll() self.texts = texts self.text_rects = [] current_y = self.outline_thickness @@ -363,6 +364,13 @@ class CallPanel(GenericUI): def cancelling(self, **kwargs): self.confirm_output.emit(output='') + def change_lists_elements(self, left_list=None, right_list=None): + if left_list is not None: + self.list1.replace_list(left_list) + if right_list is not None: + self.list2.replace_list(right_list) + self.redraw() + class TestScreen(view.PygView): @@ -408,7 +416,7 @@ class TestScreen(view.PygView): running = False if event.key == pygame.K_o: - self.panel.list1.replace_list([str(i+1) for i in range(7)]) + self.panel.change_lists_elements([str(i+1) for i in range(45)],['a','b']) draw_update = True for element in self.elements: diff --git a/cards.py b/cards.py index 9a87949..ebb94e6 100644 --- a/cards.py +++ b/cards.py @@ -126,7 +126,7 @@ class Deck(): self.sort_order = sort_order self.selectable = selectable self.selected_card = -1 - self.prev_selected = -1 + self.prev_selected = [-1, -1, -1] self.cards = [] self.line_width = 5 @@ -291,11 +291,16 @@ class Deck(): return True, card_values.index(value) return False, -1 + def record_selected_history(self): + self.prev_selected = self.prev_selected[1:] + self.prev_selected.append(self.selected_card) + def deselect_card(self): self.selected_card = -1 + self.record_selected_history() self.update_deck_display() - def get_selected_card(self, pos): + def get_selected_card(self, pos, double_clicking=False): """ Get the selected card based on the mouse pos, offset to give the relative position in the deck. The selected card position is stored in the deck @@ -303,11 +308,10 @@ class Deck(): :return: bool: whether the card selected is the same as before """ if self.selectable: + double_select = False relative_pos_x = pos[0] - self.x relative_pos_y = pos[1] - self.y mouse_pos = (relative_pos_x, relative_pos_y) - if self.selected_card >= 0: - self.prev_selected = self.selected_card self.selected_card = -1 if not self.draw_from_last: for i, card in enumerate(reversed(self.cards)): @@ -320,8 +324,17 @@ class Deck(): self.selected_card = i break + if self.prev_selected[-1] == self.selected_card: + if not double_clicking: + self.selected_card = -1 + + self.record_selected_history() self.update_deck_display() - return (self.prev_selected == self.selected_card)and self.selected_card >= 0 + + selected_history = [sel for sel in self.prev_selected if sel >= 0] + + return (len(selected_history) == 2 and self.prev_selected.count(self.selected_card) == 2 + and self.selected_card >= 0) and double_clicking return False @@ -492,8 +505,8 @@ class TestScreen(view.PygView): mouse_pos = pygame.mouse.get_pos() for deck in self.test_decks: if deck.rect.collidepoint(mouse_pos): - reselect = deck.get_selected_card(mouse_pos) - + reselect = deck.get_selected_card(mouse_pos, self.double_clicking) + print('a', reselect) if self.double_clicking: pygame.time.set_timer(self.double_click_event, 0) print('Double clicked') @@ -503,8 +516,6 @@ class TestScreen(view.PygView): else: self.double_clicking = True pygame.time.set_timer(self.double_click_event, 200) - if reselect: - deck.deselect_card() if event.type == self.double_click_event: pygame.time.set_timer(self.double_click_event, 0) diff --git a/main.py b/main.py index ea1c977..8acda9e 100644 --- a/main.py +++ b/main.py @@ -8,8 +8,8 @@ This script is to run the game. It would process any input argument and pass int """ if __name__ == '__main__': - AUTOPLAY = True - VIEW_ALL_CARDS = True + AUTOPLAY = False + VIEW_ALL_CARDS = False TERMINAL = False if len(sys.argv) > 1: @@ -36,9 +36,9 @@ if __name__ == '__main__': with open('last_game_rng.rng', 'wb') as f: pickle.dump(rng_state, f) - with open('seeds/test_seed.rng', 'rb') as f: - rng_state = pickle.load(f) - random.setstate(rng_state) + #with open('seeds/test_seed.rng', 'rb') as f: + # rng_state = pickle.load(f) + #random.setstate(rng_state) main_view = game.GameScreen(800, 600, clear_colour=(255, 0, 0), autoplay=AUTOPLAY, view_all_cards=VIEW_ALL_CARDS, terminal=TERMINAL) diff --git a/players.py b/players.py index e4d60d6..a2eedcd 100644 --- a/players.py +++ b/players.py @@ -234,14 +234,14 @@ class MainPlayer(Player): def make_a_play(self, substate, game_events=None): card = None - msg = "" + msg = None if game_events: for event in game_events: if event.type == pygame.MOUSEBUTTONUP and event.button == 1: mouse_pos = pygame.mouse.get_pos() if self.rect.collidepoint(mouse_pos): - reselect = self.get_selected_card(mouse_pos) - if self.selected_card >= 0: + reselect = self.get_selected_card(mouse_pos, double_clicking=self.double_clicking) + if not reselect: card = 1 if self.double_clicking: @@ -253,14 +253,14 @@ class MainPlayer(Player): else: card = 1 msg = "Invalid card play" - self.deselect_card() self.double_clicking = False else: self.double_clicking = True pygame.time.set_timer(DOUBLE_CLICK_EVENT, DOUBLE_CLICK_TIMING) - if reselect: - self.deselect_card() - card = 1 + #if reselect: + # self.deselect_card() + # card = 1 + return card, msg if event.type == DOUBLE_CLICK_EVENT: pygame.time.set_timer(DOUBLE_CLICK_EVENT, 0) diff --git a/table.py b/table.py index a460c98..47ccabb 100644 --- a/table.py +++ b/table.py @@ -370,13 +370,12 @@ class Table: self.update_player_bid(self.current_player, 11, update_now=False) msg = 'Bid Leader: Player {0:d}'.format((self.current_player - self.passes - 1 * (not self.first_player)) % NUM_OF_PLAYERS) - self.write_message(msg, line=2, delay_time=1) + self.write_message(msg, line=2, delay_time=0.5) if not self.terminal_play: - self.calling_panel.list1.replace_list([str(i+1) for i in range(7)]) - self.calling_panel.list2.replace_list(['Clubs', 'Diamonds', 'Hearts', 'Spades', 'No Trump']) self.calling_panel.cancel_button.visible = True - self.calling_panel.redraw() + self.calling_panel.change_lists_elements([str(i+1) for i in range(7)], + ['Clubs', 'Diamonds', 'Hearts', 'Spades', 'No Trump']) def start_bidding(self, game_events): """ @@ -396,12 +395,12 @@ class Table: player_bid = self.players[self.current_player].make_decision(self.game_state, 0) else: player_bid, msg = self.players[self.current_player].make_decision(self.game_state, 0, game_events) - if msg: - self.write_message(msg, delay_time=0, update_now=True) + #if msg: + #self.write_message(msg, delay_time=1, update_now=True) if player_bid < 0: return False self.require_player_input = False - self.write_message("", delay_time=0, update_now=True) + #self.write_message("", delay_time=0, update_now=False) if not self.terminal_play: self.calling_panel.visible = False self.update_table.emit() @@ -432,10 +431,9 @@ class Table: time.sleep(0.5) if self.passes == NUM_OF_PLAYERS - 1 or self.table_status["bid"] == 75: if not self.terminal_play: - self.calling_panel.list1.replace_list(['2','3','4','5','6','7','8','9','10','J','Q','K','A']) - self.calling_panel.list2.replace_list(['Clubs', 'Diamonds', 'Hearts', 'Spades']) self.calling_panel.cancel_button.visible = False - self.calling_panel.redraw() + self.calling_panel.change_lists_elements(['2','3','4','5','6','7','8','9','10','J','Q','K','A'], + ['Clubs', 'Diamonds', 'Hearts', 'Spades']) return False else: if not self.require_player_input: @@ -498,12 +496,12 @@ class Table: :return: None """ if not any(self.table_status["played cards"]): - if self.table_status['trump broken']: - self.write_message("Trump has been broken!", delay_time=0) - else: - self.write_message("Trump is not broken", delay_time=0) # Leading player starts with the leading card, which determines the leading suit if not self.require_player_input: + if self.table_status['trump broken']: + self.write_message("Trump has been broken!", delay_time=0) + else: + self.write_message("Trump is not broken", delay_time=0) self.current_player = self.table_status['leading player'] self.display_current_player(self.current_player) if not self.players[self.current_player].AI: @@ -513,8 +511,8 @@ class Table: card = self.players[self.current_player].make_decision(self.game_state, 0) else: card, msg = self.players[self.current_player].make_decision(self.game_state, 0, game_events) - if msg: - self.write_message(msg, delay_time=0, update_now=True) + #if msg: + # self.write_message(msg, delay_time=0, update_now=True) if not type(card) is cards.Card: if card: self.update_table.emit() @@ -534,8 +532,8 @@ class Table: card = self.players[self.current_player].make_decision(self.game_state, 1) else: card, msg = self.players[self.current_player].make_decision(self.game_state, 1, game_events) - if msg: - self.write_message(msg, delay_time=0, update_now=False) + #if msg: + # self.write_message(msg, delay_time=0, update_now=False) if not type(card) is cards.Card: if card: self.update_table.emit() @@ -586,11 +584,6 @@ class Table: return - if self.table_status['trump broken']: - self.write_message("Trump has been broken!", delay_time=0) - else: - self.write_message("Trump is not broken", delay_time=0) - # Break trump if the trump suit is played if not self.table_status['trump broken']: self.table_status['trump broken'] = card.suit() == self.table_status['trump suit'] @@ -606,6 +599,7 @@ class Table: self.current_player += 1 self.current_player %= NUM_OF_PLAYERS + self.update_table.emit() time.sleep(0.5) def write_message(self, text, delay_time=0.5, line=0, update_now=True):