Python - calculadora de estatísticas de jogo
Então este é o código de uma calculadora que fiz para um jogo. Basicamente, o que a calculadora faz é calcular o custo de compra da próxima estatística.
Então eu escrevi o código apenas para a raça humana e as estatísticas de força. A meu ver, terei que fazer para cada corrida o mesmo código 3 vezes para cada estatística.
Eu esperava que houvesse uma maneira mais curta de contornar isso, como
em vez de human.strengtheu gostaria que estivesse race.strengthonde race = user_race.
obrigado
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))
```
Respostas
Se você está apenas tentando fazer uma calculadora interativa, as classes, etc., não são necessárias.
Primeiro, faça uma tabela simples que permite consultar as estatísticas com base na raça. Faça com que seja fácil para um humano (como você) editar, fazer alterações, adicionar novas raças ou estatísticas, etc.
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",
]
É apenas uma lista de strings. Agora transforme-o em um formato que facilite o uso em um programa. Vamos transformá-lo em um dicionário de dicts para que possamos olhar para cima valores usando algo como: stat["elf"]["base_agility"]. Aqui está o código:
stats = {}
for row in traits:
row = row.strip().split()
stats[row[0]] = dict(zip(keys, map(int, row[1:])))
Agora, seu código que calcula o custo de alteração da força para um humano, pode ser transformado em uma função genérica que funciona para qualquer raça ou estatística:
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
Você notará o código repetido para calcular total_present_coste total_desired_cost. Essas linhas podem ser refatoradas em outra função (um exercício para o leitor).
Agora, o programa principal apenas coleta as entradas do usuário, chama a função acima e imprime os resultados:
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}")