From 8a45f6a34fc67e4208810897aef474f1903ec1d5 Mon Sep 17 00:00:00 2001 From: En Yi Date: Fri, 14 Jun 2019 01:17:05 +0100 Subject: [PATCH] Integrate Buttons to Request Shuffling --- UI.py | 17 +++++----- main.py | 8 +++-- players.py | 15 ++++++--- table.py | 97 ++++++++++++++++++++++++++++++++++++++++-------------- 4 files changed, 95 insertions(+), 42 deletions(-) diff --git a/UI.py b/UI.py index 42bffca..9e66d1a 100644 --- a/UI.py +++ b/UI.py @@ -41,7 +41,7 @@ class GenericUI: mouse_pos = pygame.mouse.get_pos() if self.release_function and self.collide_at(mouse_pos): if event.button == 1: - print('mouse click') + #print('mouse click') self.release_function(mouse_pos) draw_update = True @@ -49,7 +49,7 @@ class GenericUI: def collide_at(self, pos): x0, y0 = self.get_offset_pos() - print(x0, y0, pos) + #print(x0, y0, pos) rect_check = pygame.rect.Rect(x0, y0, self.rect.width, self.rect.height) return rect_check.collidepoint(pos) @@ -249,7 +249,6 @@ class ScrollList(GenericUI): self.reset_scroll() n_items = len(self.texts) if self.texts and 0 <= pos < n_items: - print('removing') self.texts.pop(pos) text_rect = self.text_rects.pop(pos) self.selected = min(self.selected, n_items-2) @@ -312,14 +311,14 @@ class CallPanel(GenericUI): self.list2.list_selected.connect(lambda text, **z: self.print_list_selection(text, 1)) self.output_box = TextBox(margins+width_spacings*3+ui_width*2, margins+height_spacings, - ui_width, ui_height, text='Bid', text_size=self.text_size) + ui_width, ui_height, text='-', text_size=self.text_size) self.confirm_button = Button(margins+width_spacings*3+ui_width*2, margins+height_spacings*2+ui_height, - ui_width, ui_height, text='OK', text_size=self.text_size) + ui_width, ui_height, text='Call', text_size=self.text_size) self.confirm_button.clicked.connect(self.emit_output) self.cancel_button = Button(margins + width_spacings * 3 + ui_width * 2, margins + height_spacings * 3 + ui_height * 2, - ui_width, ui_height, text='Cancel', text_size=self.text_size) + ui_width, ui_height, text='Pass', text_size=self.text_size) self.cancel_button.visible = False self.cancel_button.clicked.connect(self.cancelling) @@ -377,7 +376,7 @@ class TestScreen(view.PygView): self.button = Button(300, 100, 50, 25, text_size=18) self.textbox = TextBox(300, 250, 200, 100, text="Test") self.panel = CallPanel(100, 100, 300, 150) - self.panel.confirm_output.connect(self.print_panel_output) + #self.panel.confirm_output.connect(self.print_panel_output) #[self.scroll_menu, self.button, self.textbox] self.elements = [self.panel] @@ -396,8 +395,8 @@ class TestScreen(view.PygView): self.screen.blit(element.background, element.get_pos()) self.screen.blit(element.background, element.get_pos()) - def print_panel_output(self, output, **kwargs): - print(output) + #def print_panel_output(self, output, **kwargs): + # print(output) def run(self): running = True diff --git a/main.py b/main.py index a12eda2..22cca6a 100644 --- a/main.py +++ b/main.py @@ -35,8 +35,9 @@ class GameScreen(view.PygView): self.screen.blit(stats_line, (self.table.player_stats_x[i], self.table.player_stats_y[i]+self.table.stats_height*j/3)) - if self.table.calling_panel.visible: - self.screen.blit(self.table.calling_panel.background, self.table.calling_panel.get_pos()) + for element in self.table.UI_elements: + if element.visible: + self.screen.blit(element.background, element.get_pos()) pygame.display.flip() @@ -62,7 +63,7 @@ class GameScreen(view.PygView): if event.key == pygame.K_p: if not self.table.ongoing: self.table.ongoing = True - self.table.process_panel(event) + self.table.process_UI(event) if self.table.ongoing: self.table.continue_game(all_events) @@ -100,6 +101,7 @@ if __name__ == '__main__': with open('last_game_rng.rng', 'wb') as f: pickle.dump(rng_state, f) + main_view = GameScreen(900, 600, clear_colour=(255, 0, 0), autoplay=AUTOPLAY, view_all_cards=VIEW_ALL_CARDS) diff --git a/players.py b/players.py index ffab80e..95fecd4 100644 --- a/players.py +++ b/players.py @@ -51,8 +51,7 @@ class Player(cards.Deck): if game_state == GameState.POINT_CHECK: if self.AI: return self.AI.request_reshuffle() - if input("Reshuffle? (y/n)").lower() == 'y': - return self.request_reshuffle() + return self.request_reshuffle(game_events=game_events) if game_state == GameState.BIDDING: if sub_state == 0: if self.AI: @@ -175,10 +174,9 @@ class Player(cards.Deck): suit_points += (STARTING_HAND-card_position) // 5 return suit_points + sum(card_points) - def request_reshuffle(self): + def request_reshuffle(self, game_events=None): # Players can choose NOT to reshuffle - # But always reshuffle for simplicity - return True + return input("Reshuffle? (y/n)").lower() == 'y' class MainPlayer(Player): @@ -275,4 +273,11 @@ class MainPlayer(Player): return card + def request_reshuffle(self, game_events=None): + # Players can choose NOT to reshuffle + for event in game_events: + if event.type == CALL_EVENT: + return event.call + return None + diff --git a/table.py b/table.py index 704a628..5fd12b2 100644 --- a/table.py +++ b/table.py @@ -63,6 +63,7 @@ class Table: # For gameplay self.game_state = GameState.DEALING + self.reshuffling_players = [] self.current_round = 0 self.passes = 0 self.current_player = 0 @@ -200,10 +201,18 @@ class Table: self.calling_panel.confirm_output.connect(self.emit_call) - self.yes_button = UI.Button(playdeckx[0]+w_deck+5,playdecky[0]+w_deck-50, - 100, 50, text='yes') - self.no_button = UI.Button(playdeckx[0] + w_deck + 5, playdecky[0] + w_deck - 50, - 100, 50) + self.yes_button = UI.Button(playdeckx[0]+w_deck+5,playdecky[0], + 50, 25, text='yes') + self.yes_button.visible = False + self.yes_button.clicked.connect(lambda **z: pygame.event.post(pygame.event.Event(CALL_EVENT, call=True))) + + self.no_button = UI.Button(playdeckx[0] + w_deck + 5, playdecky[0] + 25+25, + 50, 25, text='no') + self.no_button.clicked.connect(lambda **z: pygame.event.post(pygame.event.Event(CALL_EVENT, call=False))) + self.no_button.visible = False + + self.UI_elements = [self.calling_panel, self.yes_button, self.no_button] + def emit_call(self, output, **kwargs): pygame.event.post(pygame.event.Event(CALL_EVENT, call=output)) @@ -304,15 +313,16 @@ class Table: def get_pos(self): return self.x, self.y - def process_panel(self, event): + def process_UI(self, event): draw_update = False - if event.type == pygame.KEYUP: - if event.key == pygame.K_o: - self.calling_panel.visible = not self.calling_panel.visible - draw_update = True - if self.calling_panel.visible and \ - self.calling_panel.process_events(event): - draw_update = True + #if event.type == pygame.KEYUP: + # if event.key == pygame.K_o: + # self.calling_panel.visible = not self.calling_panel.visible + # draw_update = True + for element in self.UI_elements: + if element.visible and \ + element.process_events(event): + draw_update = True if draw_update: self.update_table.emit() @@ -327,17 +337,36 @@ class Table: if self.game_state == GameState.DEALING: self.shuffle_and_deal() self.write_message("Shuffle Complete!") - self.game_state = GameState.POINT_CHECK + self.reshuffling_players = [] + for i, player in enumerate(self.players): + if player.get_card_points() < 4: + self.write_message("Low points detected in Player {0:d}! ".format(i)) + self.reshuffling_players.append(i) - elif self.game_state == GameState.POINT_CHECK: - if self.check_reshuffle(): - self.write_message('Reshuffle Initiated!', line=1) - self.game_state = GameState.ENDING - else: + if not self.reshuffling_players: self.write_message('No Reshuffle needed!') self.game_state = GameState.BIDDING self.write_message("Start to Bid") self.prepare_bidding() + else: + self.current_player = self.reshuffling_players[0] + self.game_state = GameState.POINT_CHECK + + elif self.game_state == GameState.POINT_CHECK: + reshuffle = self.check_reshuffle(game_events) + if reshuffle is None: + return + if reshuffle is False and not self.current_player == self.reshuffling_players[-1]: + return + else: + if reshuffle: + self.write_message('Reshuffle Initiated!', line=1) + self.game_state = GameState.ENDING + else: + self.write_message('No Reshuffle needed!') + self.game_state = GameState.BIDDING + self.write_message("Start to Bid") + self.prepare_bidding() elif self.game_state == GameState.BIDDING: bid_complete = self.start_bidding(game_events) if bid_complete: @@ -368,17 +397,35 @@ class Table: player.add_card(self.discard_deck.pop()) self.update_table.emit() - def check_reshuffle(self): + def check_reshuffle(self, game_events): """ Detect any possible reshuffle request within the players :return: True if reshuffle requested, else False """ - print("Player Point Count") - for i, player in enumerate(self.players): - print("Player {0:d}: {1:d}".format(i, player.get_card_points())) - if player.get_card_points() < 4: - self.write_message("Low points detected in Player {0:d}! ".format(i)) - return player.make_decision(self.game_state, 0) + if not self.require_player_input: + if not self.players[self.current_player].AI: + self.require_player_input = True + self.write_message("Do you want a reshuffle?", line=1, update_now=False) + self.yes_button.visible = True + self.no_button.visible = True + self.update_table.emit() + return + else: + reshuffle = self.players[self.current_player].make_decision(self.game_state, 0) + else: + reshuffle = self.players[self.current_player].make_decision(self.game_state, 0, game_events) + + if reshuffle is None: + return None + self.require_player_input = False + self.yes_button.visible = False + self.no_button.visible = False + self.update_table.emit() + + self.current_player = (self.current_player + 1)%NUM_OF_PLAYERS + while self.current_player not in self.reshuffling_players: + self.current_player = (self.current_player + 1) % NUM_OF_PLAYERS + return reshuffle def prepare_bidding(self): # Randomly pick a starting player, whom also is the current bid winner