from project.player import Player class Controller: def __init__(self): self.players = [] self.supplies = [] def add_player(self, *players): added_players = [] for player in players: if player in self.players: continue self.players.append(player) added_players.append(player.name) return f"Successfully added: {', '.join(added_players)}" def add_supply(self, *supplies): self.supplies.extend(supplies) def sustain(self, player_name: str, sustenance_type: str): player = self.__find_player_by_name(player_name) if player is None: return if sustenance_type != 'Food' and sustenance_type != 'Drink': return idx, supply = self.__find_supply_by_type(sustenance_type) if supply is None: raise Exception(f"There are no {sustenance_type.lower()} supplies left!") if not player.need_sustenance: return f"{player_name} have enough stamina." player.stamina = min(player.stamina + supply.energy, Player.MAX_STAMINA) self.supplies.pop(idx) return f"{player_name} sustained successfully with {supply.name}." def duel(self, first_player_name: str, second_player_name: str): pass # # изваждаме играчите по име # # for player in self.players: # #if player.name == first_player_name: # #return player first_player = self.__find_player_by_name(first_player_name) # за всеки един player(обект) в self.player, ако # # player.name (името на този играч е равно на first_player_name, който се подава, тогава return .... second_player = self.__find_player_by_name(second_player_name) # # така имаме вече двете инстанции # result = '' if first_player.stamina == 0: result += f"Player {first_player.name} does not have enough stamina." if second_player.stamina == 0: result += '\n' + f"Player {second_player.name} does not have enough stamina." if result: return result.strip() if second_player.stamina < first_player.stamina: first_player, second_player = second_player, first_player first_player_damage = first_player.stamina / 2 second_player.stamina = max(second_player.stamina - first_player_damage, 0) if second_player.stamina == 0: return f"Winner: {first_player.name}" second_player_damage = second_player.stamina / 2 first_player.stamina = max(first_player.stamina - second_player_damage, 0) if first_player.stamina == 0: return f"Winner: {second_player.name}" winner = first_player if first_player.stamina > second_player.stamina else second_player return f"Winner: {winner.name}" def next_day(self): for player in self.players: player.stamina = max(player.stamina - player.age * 2, 0) self.sustain(player.name, 'Food') self.sustain(player.name, 'Drink') def __str__(self): result = '' for player in self.players: result += str(player) + '\n' for supply in self.supplies: result += supply.details() + '\n' return result.strip() def __find_player_by_name(self, player_name): for player in self.players: if player.name == player_name: return player def __find_supply_by_type(self, sustenance_type): for idx in range(len(self.supplies) -1, -1, -1): supply = self.supplies[idx] if supply.__class__.__name__ == sustenance_type: return (idx, supply) return (-1, None)