Move around stuff

master
En Yi 2019-06-15 15:26:13 +01:00
parent 026ad41904
commit 41e69fa5ca
2 changed files with 135 additions and 128 deletions

View File

@ -235,9 +235,6 @@ class VivianAI(RandomAI):
leading_card = self.table_status["played cards"][self.table_status["leading player"]]
leading_suit = leading_card.suit()
# Find any trump cards
#trumped = any([suit == self.table_status['trump suit'] for suit in played_suits])
# Find the highest number played,
max_played_num = max([num for num, suit in zip(played_nums, played_suits) if suit == leading_suit])
max_trump_played = [num for suit, num in zip(played_suits, played_nums)

258
table.py
View File

@ -239,125 +239,6 @@ class Table:
surf.fill(clear_colour)
surf.blit(rendered_text, text_rect)
def write_message(self, text, delay_time=0.5, line=0, update_now=True):
"""
Write a message into the center board surface (announcer)
:param text: String to be displayed on the center board
:param delay_time: How much delay to put once the string is display
:param line: Which line of the announcer to write to
:return: None
"""
if 0 <= line < len(self.announcer_line):
print(text)
text = text.strip('\n')
rendered_text = self.table_font.render(text, True, (255, 255, 255)).convert_alpha()
self.center_text_on_surface(self.announcer_line[line], rendered_text,
(255, 255, 255, 255*VIEW_TRANSPARENT))
if update_now:
self.update_table.emit()
time.sleep(delay_time)
def update_players_role(self, player_num, update_now=True):
"""
Update the display of the player roles. Blank if UNKNOWN
:param player_num:
:param update_now:
:return:
"""
self.player_stats[player_num][1].fill((255, 255, 255, 255*VIEW_TRANSPARENT))
role_text = ''
colour = (128, 64, 192)
if self.players[player_num].role == PlayerRole.DECLARER:
role_text = 'Declarer'
elif self.players[player_num].role == PlayerRole.ATTACKER:
role_text = 'Attacker'
colour = (192, 0, 0)
elif self.players[player_num].role == PlayerRole.PARTNER:
role_text = 'Partner'
rendered_text = self.player_font.render(role_text, True, colour).convert_alpha()
self.center_text_on_surface(self.player_stats[player_num][1], rendered_text,
(255, 255, 255, 255 * VIEW_TRANSPARENT))
if update_now:
self.update_table.emit()
def update_player_wins(self, player_num, update_now=True, clear=False):
"""
Update the display of player's number of wins.
:param player_num:
:param update_now:
:param clear:
:return:
"""
self.player_stats[player_num][2].fill((255, 255, 255, 255*VIEW_TRANSPARENT))
if not clear:
if self.players[player_num].score > 1:
rendered_text = self.player_font.render("Wins: {0:d}".format(self.players[player_num].score), True,
(255, 255, 255)).convert_alpha()
else:
rendered_text = self.player_font.render("Win: {0:d}".format(self.players[player_num].score), True,
(255, 255, 255)).convert_alpha()
self.center_text_on_surface(self.player_stats[player_num][2], rendered_text,
(255, 255, 255, 255 * VIEW_TRANSPARENT))
if update_now:
self.update_table.emit()
def update_player_bid(self, player_num, bid, update_now=True):
"""
Update the display of the player's last bid.
:param player_num:
:param update_now:
:param clear:
:return:
"""
self.player_stats[player_num][2].fill((255, 255, 255, 255 * VIEW_TRANSPARENT))
if not bid:
rendered_text = self.player_font.render("Pass".format(self.players[player_num].score), True,
(255, 255, 255)).convert_alpha()
else:
bid_text = str(bid//10) + ' ' + cards.get_suit_string(bid % 10)
rendered_text = self.player_font.render(bid_text.format(self.players[player_num].score), True,
(255, 255, 255)).convert_alpha()
self.center_text_on_surface(self.player_stats[player_num][2], rendered_text,
(255, 255, 255, 255 * VIEW_TRANSPARENT))
if update_now:
self.update_table.emit()
def update_all_players(self, role=False, wins=True, clear_wins=False):
for i in range(NUM_OF_PLAYERS):
if wins:
self.update_player_wins(i, update_now=False, clear=clear_wins)
if role:
self.update_players_role(i, update_now=False)
self.update_table.emit()
def display_current_player(self, current=-1):
if current >= 0:
print("Player {0:d}\n".format(current))
for i in range(NUM_OF_PLAYERS):
rendered_text = self.player_font.render("Player {0:d}".format(i), True,
(255, 0, 255)).convert_alpha()
if i == current:
self.center_text_on_surface(self.player_stats[i][0], rendered_text,
(0, 64, 0, 255))
else:
self.center_text_on_surface(self.player_stats[i][0], rendered_text,
(255, 255, 255, 255 * VIEW_TRANSPARENT))
self.update_table.emit()
def update_team_scores(self):
if self.table_status['partner reveal']:
msg = "Defender: {0:d}/{2:d}, Attacker: {1:d}/{3:d}\n".format(self.table_status['defender']['wins'],
self.table_status['attacker']['wins'],
self.table_status['defender']['target'],
self.table_status['attacker']['target'])
self.write_message(msg, line=2)
else:
msg = "Defender: {0:d}?/{1:d}, Attacker: ?/{2:d}\n".format(self.table_status['defender']['wins'],
self.table_status['defender']['target'],
self.table_status['attacker']['target'])
self.write_message(msg, line=2)
def get_pos(self):
return self.x, self.y
@ -617,6 +498,10 @@ 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:
self.current_player = self.table_status['leading player']
@ -698,14 +583,19 @@ class Table:
self.table_status["played cards"] = [0]*NUM_OF_PLAYERS
self.current_round += 1
self.update_table.emit()
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']:
trump_played = card.suit() == self.table_status['trump suit']
if trump_played:
self.table_status['trump broken'] = True
self.write_message("Trump Broken!", delay_time=1)
self.table_status['trump broken'] = card.suit() == self.table_status['trump suit']
if self.table_status['trump broken']:
self.write_message("Trump broken!", delay_time=1)
if not self.table_status['partner reveal']:
if card.value == self.table_status['partner']:
@ -716,9 +606,129 @@ 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):
"""
Write a message into the center board surface (announcer)
:param text: String to be displayed on the center board
:param delay_time: How much delay to put once the string is display
:param line: Which line of the announcer to write to
:param update_now:
:return: None
"""
if 0 <= line < len(self.announcer_line):
print(text)
text = text.strip('\n')
rendered_text = self.table_font.render(text, True, (255, 255, 255)).convert_alpha()
self.center_text_on_surface(self.announcer_line[line], rendered_text,
(255, 255, 255, 255*VIEW_TRANSPARENT))
if update_now:
self.update_table.emit()
time.sleep(delay_time)
def update_players_role(self, player_num, update_now=True):
"""
Update the display of the player roles. Blank if UNKNOWN
:param player_num:
:param update_now:
:return:
"""
self.player_stats[player_num][1].fill((255, 255, 255, 255*VIEW_TRANSPARENT))
role_text = ''
colour = (0, 239, 224)
if self.players[player_num].role == PlayerRole.DECLARER:
role_text = 'Declarer'
elif self.players[player_num].role == PlayerRole.ATTACKER:
role_text = 'Attacker'
colour = (225, 0, 0)
elif self.players[player_num].role == PlayerRole.PARTNER:
role_text = 'Partner'
rendered_text = self.player_font.render(role_text, True, colour).convert_alpha()
self.center_text_on_surface(self.player_stats[player_num][1], rendered_text,
(255, 255, 255, 255 * VIEW_TRANSPARENT))
if update_now:
self.update_table.emit()
def update_player_wins(self, player_num, update_now=True, clear=False):
"""
Update the display of player's number of wins.
:param player_num:
:param update_now:
:param clear:
:return:
"""
self.player_stats[player_num][2].fill((255, 255, 255, 255*VIEW_TRANSPARENT))
if not clear:
if self.players[player_num].score > 1:
rendered_text = self.player_font.render("Wins: {0:d}".format(self.players[player_num].score), True,
(255, 255, 255)).convert_alpha()
else:
rendered_text = self.player_font.render("Win: {0:d}".format(self.players[player_num].score), True,
(255, 255, 255)).convert_alpha()
self.center_text_on_surface(self.player_stats[player_num][2], rendered_text,
(255, 255, 255, 255 * VIEW_TRANSPARENT))
if update_now:
self.update_table.emit()
def update_player_bid(self, player_num, bid, update_now=True):
"""
Update the display of the player's last bid.
:param player_num:
:param update_now:
:param clear:
:return:
"""
self.player_stats[player_num][2].fill((255, 255, 255, 255 * VIEW_TRANSPARENT))
if not bid:
rendered_text = self.player_font.render("Pass".format(self.players[player_num].score), True,
(255, 255, 255)).convert_alpha()
else:
bid_text = str(bid//10) + ' ' + cards.get_suit_string(bid % 10)
rendered_text = self.player_font.render(bid_text.format(self.players[player_num].score), True,
(255, 255, 255)).convert_alpha()
self.center_text_on_surface(self.player_stats[player_num][2], rendered_text,
(255, 255, 255, 255 * VIEW_TRANSPARENT))
if update_now:
self.update_table.emit()
def update_all_players(self, role=False, wins=True, clear_wins=False):
for i in range(NUM_OF_PLAYERS):
if wins:
self.update_player_wins(i, update_now=False, clear=clear_wins)
if role:
self.update_players_role(i, update_now=False)
self.update_table.emit()
def display_current_player(self, current=-1):
if current >= 0:
print("Player {0:d}\n".format(current))
for i in range(NUM_OF_PLAYERS):
rendered_text = self.player_font.render("Player {0:d}".format(i), True,
(255, 0, 255)).convert_alpha()
if i == current:
self.center_text_on_surface(self.player_stats[i][0], rendered_text,
(0, 64, 0, 255))
else:
self.center_text_on_surface(self.player_stats[i][0], rendered_text,
(255, 255, 255, 255 * VIEW_TRANSPARENT))
self.update_table.emit()
def update_team_scores(self):
if self.table_status['partner reveal']:
msg = "Declarer: {0:d}/{2:d}, Attacker: {1:d}/{3:d}\n".format(self.table_status['defender']['wins'],
self.table_status['attacker']['wins'],
self.table_status['defender']['target'],
self.table_status['attacker']['target'])
self.write_message(msg, line=2)
else:
msg = "Declarer: {0:d}?/{1:d}, Attacker: ?/{2:d}\n".format(self.table_status['defender']['wins'],
self.table_status['defender']['target'],
self.table_status['attacker']['target'])
self.write_message(msg, line=2)
def reveal_all_roles(self, partner):
"""
Update all roles once the partner card is shown