-
Notifications
You must be signed in to change notification settings - Fork 0
/
util.py
103 lines (89 loc) · 3.16 KB
/
util.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
from card import suits, suit_symbols, rank_names
def get_valid_number(min_num, max_num, message, indent=0):
valid_nums = set()
i = min_num
while i <= max_num:
valid_nums.add(i)
i += 1
tab_string = '\t' * indent
while True:
try:
choice = int(raw_input(message))
if choice not in valid_nums:
message = tab_string + "That wasn't a valid option number. Try again: "
else:
return choice
except ValueError:
message = tab_string + "That wasn't a number. Try again: "
return 0
def get_player_with_name(game_state, player_name):
for i in xrange(len(game_state.players)):
if game_state.players[i].name == player_name:
return game_state.players[i]
return None
def index_of_player_with_name(game_state, player_name):
for i in xrange(len(game_state.players)):
if game_state.players[i].name == player_name:
return i
return -1
def get_legal_cards(cards, suit_led):
if not suit_led:
return cards
suited = cards_by_suit(cards)
if suited[suit_led]:
return suited[suit_led]
# If no cards of the led suit, all plays are legal
return get_card_list(suited)
def strongest_card(cards, suit_led, trump):
if not cards:
return None
trumps = [card for card in cards if card.suit == trump]
if trumps:
return max(trumps)
follows = [card for card in cards if card.suit == suit_led]
if follows:
return max(follows)
return max(cards)
def weakest_card(cards, trump):
if not cards:
return None
nontrump = [card for card in cards if card.suit != trump]
if nontrump:
return min(nontrump)
return min(cards)
def strongest_legal_play(cards, suit_led, trump):
if not suit_led:
# Can play any suit, so choose strongest card
return max(cards)
legal_cards = get_legal_cards(cards, suit_led)
suited = cards_by_suit(legal_cards)
if suited[trump]:
return max(suited[trump])
elif suited[suit_led]:
return max(suited[suit_led])
else:
# If can't play trump or the suit led, the strongest play is to choose
# weakest remaining card and preserve stronger ones
return min(get_card_list(suited))
def get_card_list(suited_map):
return [card for suited_cards in suited_map.values() for card in suited_cards]
def cards_by_suit(cards):
suited_cards = {}
for suit in suits:
suited_cards[suit] = [card for card in cards if card.suit == suit]
suited_cards[suit].sort()
return suited_cards
def print_hands(game_state):
for player in game_state.players:
print '----- %s Hand -----' % player.name
print_cards(player.cards)
def print_cards(cards, num_tabs=0):
split_cards = cards_by_suit(cards)
tab_str = '\t' * num_tabs
for suit in suits:
suited_cards = split_cards[suit]
if suited_cards:
print (tab_str + suit + ':').ljust(12) + ' '.join([(rank_names[card.rank] + suit_symbols[card.suit]) for card in suited_cards])
else:
print (tab_str + suit + ':').ljust(12) + '-'
print