|
|
|
from typing import Tuple
|
|
|
|
|
|
|
|
from entities.items.item import Item
|
|
|
|
from entities.items.food import Food
|
|
|
|
from rockpaperscissor.file.guide_list import RPS
|
|
|
|
|
|
|
|
|
|
|
|
class Elf:
|
|
|
|
"""
|
|
|
|
The absolute overkill, because I can.
|
|
|
|
"""
|
|
|
|
ELF_COUNT = 0
|
|
|
|
|
|
|
|
def __init__(self):
|
|
|
|
self.__number = Elf.ELF_COUNT
|
|
|
|
Elf.ELF_COUNT += 1
|
|
|
|
self.__name = Elf.fetch_elf_name(self.__number)
|
|
|
|
self.__inventory = []
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def fetch_elf_name(i: int) -> str:
|
|
|
|
name_list = ["Dash", "Evergreen", "Sugarplum", "Pixie", "Pudding", "Perky", "Candycane", "Glitter-toes",
|
|
|
|
"Happy", "Angel-Eyes", "Sugar-Socks", "McJingles", "Frost", "Tinsel", "Twinkle", "Jingle", "Ginger",
|
|
|
|
"Joy", "Merry", "Pepper", "Sparkle", "Tinsel", "Winter", "Trinket", "Buddy", "Noel", "Snowball",
|
|
|
|
"Tiny", "Elfin", "Candy", "Carol", "Angel", "Nick", "Plum", "Holly", "Snow", "Pine", "Garland",
|
|
|
|
"Joseph", "Gabriel", "Hope", "Cedar"]
|
|
|
|
return name_list[i % len(name_list)]
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
return f"#{self.__number} {self.__name}"
|
|
|
|
|
|
|
|
def get_inventory(self) -> list:
|
|
|
|
return self.__inventory
|
|
|
|
|
|
|
|
def add_to_inventory(self, item: Item):
|
|
|
|
self.__inventory.append(item)
|
|
|
|
|
|
|
|
def remove_from_inventory(self, slot: int):
|
|
|
|
"""
|
|
|
|
Removes item of the given slot number from the inventory using pop().
|
|
|
|
That means there are no empty spaces.
|
|
|
|
|
|
|
|
Starts with 0.
|
|
|
|
:param slot:
|
|
|
|
:return:
|
|
|
|
"""
|
|
|
|
self.__inventory.pop(slot)
|
|
|
|
|
|
|
|
def get_inventory_calories(self) -> int:
|
|
|
|
return sum([x.calorie_value for x in list(filter(lambda x: isinstance(x, Food), self.get_inventory()))])
|
|
|
|
|
|
|
|
def evaluate_RPS_round(self, other: str, own: str) -> Tuple[bool, int]:
|
|
|
|
"""
|
|
|
|
Evaluates a rock paper scissor round according to day 2 puzzle 1.
|
|
|
|
:param other: What the opponent played
|
|
|
|
:param own: what you played
|
|
|
|
:return:
|
|
|
|
"""
|
|
|
|
round_score = None
|
|
|
|
was_win = None
|
|
|
|
if other == own:
|
|
|
|
round_score = RPS.DRAW_SCORE
|
|
|
|
else:
|
|
|
|
if (other == RPS.PAPER and own == RPS.ROCK) or \
|
|
|
|
(other == RPS.SCISSOR and own == RPS.PAPER) or \
|
|
|
|
(other == RPS.ROCK and own == RPS.SCISSOR):
|
|
|
|
round_score = RPS.LOSS_SCORE
|
|
|
|
was_win = False
|
|
|
|
elif (other == RPS.PAPER and own == RPS.SCISSOR) or \
|
|
|
|
(other == RPS.SCISSOR and own == RPS.ROCK) or \
|
|
|
|
(other == RPS.ROCK and own == RPS.PAPER):
|
|
|
|
round_score = RPS.WIN_SCORE
|
|
|
|
was_win = True
|
|
|
|
else:
|
|
|
|
raise Exception(f"Something went terribly wrong! Other: {other} Own: {own}")
|
|
|
|
|
|
|
|
return was_win, round_score + RPS.RPS_SHAPE_TO_SCORE[own]
|