Python - kalkulator statystyk gry
To jest kod do kalkulatora, który stworzyłem dla gry. Zasadniczo kalkulator oblicza koszt zakupu następnej statystyki.
Więc napisałem kod tylko dla rasy ludzkiej i statystyki siły. Z mojego punktu widzenia będę musiał wykonać dla każdego wyścigu ten sam kod 3 razy dla każdej statystyki.
Miałem nadzieję, że będzie krótsza droga
zamiast tego human.strengthchciałbym, żeby to było race.strengthgdzie race = user_race.
Dzięki
class race:
"""The different races in the calculator"""
def __init__(self, race, strength, agility, health, strength_cost, agility_cost, health_cost):
self.race = race
self.strength = strength
self.agility = agility
self.health = health
self.strength_cost = strength_cost
self.agility_cost = agility_cost
self.health_cost = health_cost
human = race('Human', 15, 17, 18, 5, 3, 4)
elf = race('Elf', 11, 21, 14, 4, 3, 5)
giant = race('Giant', 25, 11, 27, 4, 8, 3)
print("Human, Giant, Elf")
user_race = str(input("Enter your race:")).lower()
print("Strength, Agility, Health")
user_stat = str(input("Enter your desired stat:")).lower()
user_present_stat_value = int(input("Enter your present stat value:"))
user_desired_stat_value = int(input("Enter your desired stat value:"))
if user_race == 'human' and user_stat == 'strength':
human_strength_present_statdif = (user_present_stat_value - human.strength) # difference of present stat with respect of base stat
human_strength_desired_statdif = (user_desired_stat_value - human.strength) #difference of desired stat with respect of base stat
human_strength_present_stat_cost = (human.strength_cost + (human_strength_present_statdif - 1) * human.strength_cost) #The cost of present stat stat
human_strength_total_present_cost = ((human_strength_present_statdif / 2) * (human.strength_cost + human_strength_present_stat_cost)) # The total cost from base stat to present stat
human_strength_desired_stat_cost = (human.strength_cost + (human_strength_desired_statdif - 1) * human.strength_cost) #The cost of desired stat
human_strength_total_desired_cost = ((human_strength_desired_statdif / 2) * (human.strength_cost + human_strength_desired_stat_cost)) # The total cost base stat to desired stat
human_strength_net_cost = (human_strength_total_desired_cost - human_strength_total_present_cost) # The Net cost from the difference of Total desired stat and Total present stat
print("Net cost: " + str(human_strength_net_cost))
```
Odpowiedzi
Jeśli próbujesz tylko stworzyć interaktywny kalkulator, zajęcia itp. Nie są potrzebne.
Najpierw utwórz prostą tabelę, która pozwoli Ci sprawdzić statystyki na podstawie rasy. Ułatw człowiekowi (takiemu jak Ty) jego edycję, wprowadzanie zmian, dodawanie nowych ras lub statystyk itp.
keys = "base_strength base_agility base_health strength_cost agility_cost health_cost".split()
traits = [
# base base base strength agility health
#race strength agility health cost cost cost
"human 15 17 18 5 3 4",
"elf 11 21 14 4 3 5",
"giant 25 11 27 4 8 3",
]
To tylko lista strun. Teraz przekształć go w format, który ułatwi użycie go w programie. Będziemy przekształcić go w dict z dicts więc możemy patrzeć wartości za coś takiego: stat["elf"]["base_agility"]. Oto kod:
stats = {}
for row in traits:
row = row.strip().split()
stats[row[0]] = dict(zip(keys, map(int, row[1:])))
Teraz twój kod, który oblicza koszt zmiany siły dla człowieka, może zostać przekształcony w ogólną funkcję, która działa dla każdej rasy lub statystyki:
def calc_change_cost(race, stat_name, present_value, desired_value):
base_value = stats[race][f"base_{stat_name}"]
stat_cost = stats[race][f"{stat_name}_cost"]
present_statdif = present_value - base_value
present_stat_cost = stat_cost + (present_statdif - 1) * stat_cost
total_present_cost = (present_statdif / 2) * (stat_cost + present_stat_cost)
desired_statdif = desired_value - base_value
desired_stat_cost = stat_cost + (desired_statdif - 1) * stat_cost
total_desired_cost = (desired_statdif / 2) * (stat_cost + desired_stat_cost)
net_cost = total_desired_cost - total_present_cost
return net_cost
Zauważysz powtarzający się kod do obliczania total_present_costi total_desired_cost. Te wiersze można przełożyć na inną funkcję (ćwiczenie dla czytelnika).
Teraz główny program po prostu zbiera dane wejściowe użytkownika, wywołuje powyższą funkcję i drukuje wyniki:
user_race = str(input("Enter your race (Human, Giant, Elf):")).lower()
user_stat = str(input("Enter your desired stat (Strength, Agility, Health):")).lower()
present_value = int(input("Enter your present stat value:"))
desired_value = int(input("Enter your desired stat value:"))
net_cost = calc_change_cost(user_race, user_stat, present_value, desired_value)
print(f"Net cost to change {user_race} {user_stat} from {present_value} to {desired_value}: {net_cost}")