Python: calculadora de estadísticas del juego

Nov 15 2020

Así que este es el código de una calculadora que hice para un juego. Básicamente, lo que hace la calculadora es calcular el costo de comprar la siguiente estadística.

Así que escribí el código solo para la raza humana y la estadística de fuerza. Por la forma en que lo veo, tendré que hacer para cada carrera el mismo código 3 veces para cada estadística.

Esperaba que hubiera una forma más corta de evitar esto como

en lugar de human.strengthme gustaría que estuviera race.strengthdonde race = user_race.

Gracias

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))
```

Respuestas

1 RootTwo Nov 16 2020 at 14:56

Si solo está tratando de hacer una calculadora interactiva, las clases, etc.no son necesarias.

Primero, haz una tabla simple que te permita buscar las estadísticas basadas en la raza. Haz que sea fácil para un humano (como tú) editarlo, hacer cambios, agregar nuevas razas o estadí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",
]

Es solo una lista de cadenas. Ahora transfórmalo a un formato que lo haga fácil de usar en un programa. Vamos a convertir en un diccionario de dicts para que podamos buscar valores utilizando algo como: stat["elf"]["base_agility"]. Aquí está el código:

stats = {}

for row in traits:
    row = row.strip().split()
    stats[row[0]] = dict(zip(keys, map(int, row[1:])))

Ahora su código que calcula el costo de cambiar la fuerza de un ser humano, se puede convertir en una función genérica que funciona para cualquier raza o estadí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

Notará el código repetido para calcular total_present_costy total_desired_cost. Esas líneas podrían refactorizarse en otra función (un ejercicio para el lector).

Ahora, el programa principal simplemente recopila las entradas del usuario, llama a la función anterior e imprime los 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}")