Integrate Buttons to Request Shuffling

master
En Yi 2019-06-14 01:17:05 +01:00
parent 5a3c191c12
commit 8a45f6a34f
4 changed files with 95 additions and 42 deletions

17
UI.py
View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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