Professional Documents
Culture Documents
Player
Player
class Player:
# Initiate all the class variables.
# player_number: Which player they are within the current game (Player 1, Player 2...)
# amount_of_playable_numbers: The base of a players strategy. How many numbers, out off all the numbers they have
# open to play, on the left most side they would consider playing. (A 2 says that a player will only consider
# their two leftmost open numbers in any column.)
# open_numbers: All the numbers the player has open to play based on game rules. (no strategy involved)
# crossed_out_numbers: Numbers crossed out in their respective colors.
# amount_of_penalties: The number of penalties a player has taken over a game.
def __init__(self, player_number, amount_of_playable_numbers):
self.player_number = player_number
self.amount_of_playable_numbers = amount_of_playable_numbers
self.open_numbers = {'red': [i for i in range(2, 12)], 'yellow': [i for i in range(2, 12)],
'green': [12 - i for i in range(10)], 'blue': [12 - i for i in range(10)]}
self.crossed_out_numbers = {'red': [], 'yellow': [], 'green': [], 'blue': []}
self.amount_of_penalties = 0
# The playable numbers of each row for the player based on player strategy and game rules.
@property
def playable_numbers(self):
return {'red': self.get_playable_numbers('red'), 'yellow': self.get_playable_numbers('yellow'),
'green': self.get_playable_numbers('green'), 'blue': self.get_playable_numbers('blue')}
# Select which numbers the player will consider for a color based on strategy. For a basic player only the
# amount_of_playable_numbers is taken into consideration for strategy.
def get_playable_numbers(self, color):
return self.open_numbers[color][0:self.amount_of_playable_numbers]
# The points the player has in each color based on the amount of crossed out numbers and lock out bonus.
@property
def color_points(self):
return {'red': self.get_score('red'), 'yellow': self.get_score('yellow'), 'green': self.get_score('green'),
'blue': self.get_score('blue')}
# Count the number of crossed out numbers and lock out bonus for a color for the player and return the score
# associated.
def get_score(self, color):
if self.crossed_out_numbers[color] == []:
number_of_crosses = 0
else:
number_of_crosses = len(self.crossed_out_numbers[color])
score_list = (0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66, 78)
return score_list[number_of_crosses]
# The total points the player has by adding all color points and deducting penalties.
@property
def total_points(self):
return self.color_points['red'] + self.color_points['yellow'] + self.color_points['blue'] + self.color_points[
'green'] - 5 * self.amount_of_penalties
# Finds the characters used to print a color's rows in player's score card.
def row_in_player_sheet(self, color):
colors_crossed_out_numbers = self.crossed_out_numbers[color]
row = []
if color == 'red' or color == 'yellow':
for i in range(2, 14):
if i in colors_crossed_out_numbers:
row.append('X')
elif i == 13 and 'locked' not in colors_crossed_out_numbers:
row.append('\U0001f513')
elif i == 13 and 'locked' in colors_crossed_out_numbers:
row.append('X\U0001f512')
else:
row.append('{}'.format(str(i)))
elif color == 'green' or color == 'blue':
for i in range(12, 0, -1):
if i in colors_crossed_out_numbers:
row.append('X')
elif i == 1 and 'locked' not in colors_crossed_out_numbers:
row.append('\U0001f513')
elif i == 1 and 'locked' in colors_crossed_out_numbers:
row.append('X\U0001f512')
else:
row.append('{}'.format(str(i)))
return row