Integrate Buttons to Request Shuffling
parent
5a3c191c12
commit
8a45f6a34f
17
UI.py
17
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
|
||||
|
|
8
main.py
8
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)
|
||||
|
||||
|
|
15
players.py
15
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
|
||||
|
||||
|
||||
|
|
97
table.py
97
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
|
||||
|
|
Loading…
Reference in New Issue