from die import Die class Yahtzee: """A command-line Yahtzee game. This version of Yahtzee is initialized with a list of goals. """ def __init__(self, goals): self.score = 0 self.goals = goals self.dice = [Die() for num in range(5)] def play(self): """ Play an entire game. Starts by greeting the user, then plays rounds until all the goals have been used. When the game is over, tells the player their final score.""" print("Welcome to Yachtzee!") self.score = 0 for goal in self.goals: goal.used = False while self.count_unused_goals() > 0: self.play_round() print(f"Your final score was {self.score}") def play_round(self): """This just rolls the dice and figures out what each number was rolled on each dice""" print("=" * 80) self.rolls_left = 3 for die in self.dice: die.roll() self.show_status() goal = self.choose_goal() goal.used = True self.score += goal.score(self.dice) def show_status(self): """This shows the player their rolls""" dice = ', '.join([str(die) for die in self.dice]) print(f"Score: {self.score}. Rolls left: {self.rolls_left}. Dice: {dice}.") def choose_goal(self): """ shwos them the number of 1's 2's and 3's and offers them the options of rerolling or keeping their rolls""" options = [] unused_goals = self.get_unused_goals() for goal in unused_goals: option = goal.prompt(self.dice) options.append(option) if self.rolls_left > 0: options.append("Re-roll") choice = self.get_choice(options) if options[choice] == "Re-roll": self.reroll() self.show_status() return self.choose_goal() else: return unused_goals[choice] def get_choice(self, options): """ gives feedback to help the player decide what to do next""" print("What would you like to do?") for i, option in enumerate(options): print(f"{i}. {option}") choice = input("> ") while not self.option_choice_is_valid(choice, options): print("Sorry, that's not a valid choice.") choice = input("> ") return int(choice) def option_choice_is_valid(self, choice, options): """Makes sure that what the player puts in is usable """ if not choice.isdigit(): return False if int(choice) < 0: return False if int(choice) >= len(options): return False return True def count_unused_goals(self): return len(self.get_unused_goals()) def get_unused_goals(self): unused_goals = [] for goal in self.goals: if not goal.used: unused_goals.append(goal) return unused_goals def reroll(self): """If the player decides to reroll, this is what the computer must to to start that process""" self.rolls_left -= 1 choices = self.get_reroll_choices() dice_to_reroll = self.get_dice_to_reroll(choices) for die in dice_to_reroll: die.roll() def get_dice_to_reroll(self, choice_ints): """If the player decides to reroll, this is what the computer must to to start that process""" dice_to_reroll = [] for die in self.dice: if die.face in choice_ints: choice_ints.remove(die.face) dice_to_reroll.append(die) return dice_to_reroll def get_reroll_choices(self): """Asks the player what dice number do they want to reroll, all dice of that number will be rerolled""" print("Which dice do you want to re-roll?") choices = input("> ") while not self.reroll_choices_are_valid(choices): print("Please enter the numbers on dice you want to re-roll.") choices = input("> ") choice_ints = [int(digit) for digit in choices] return choice_ints def reroll_choices_are_valid(self, choices_str): """This is the code to adjust for the reroll """ if not choices_str.isdigit(): return False choice_ints = [int(digit) for digit in choices_str] for die in self.dice: if die.face in choice_ints: choice_ints.remove(die.face) return len(choice_ints) == 0