Python - Calculateur de statistiques de jeu

Nov 15 2020

Voici donc le code d'une calculatrice que j'ai créé pour un jeu. Essentiellement, ce que fait la calculatrice, c'est qu'elle calcule le coût d'achat de la prochaine statistique.

J'ai donc écrit le code uniquement pour la race humaine et la statistique de force. D'après ce que je vois, je devrai faire pour chaque course le même code 3 fois pour chaque statistique.

J'espérais qu'il y aurait un moyen plus court de contourner cela comme

au lieu de human.strengthje voudrais que ce soit race.strengthrace = user_race.

Merci

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

Réponses

1 RootTwo Nov 16 2020 at 14:56

Si vous essayez simplement de créer une calculatrice interactive, les cours, etc. ne sont pas nécessaires.

Tout d'abord, créez un tableau simple qui vous permet de rechercher les statistiques en fonction de la race. Gardez la tâche facile pour un humain (comme vous) de le modifier, d'apporter des modifications, d'ajouter de nouvelles races ou statistiques, 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",
]

C'est juste une liste de chaînes. Maintenant, transformez-le en un format qui le rend facile à utiliser dans un programme. Nous allons le transformer en un dict de dicts afin que nous puissions rechercher des valeurs en utilisant quelque chose comme: stat["elf"]["base_agility"]. Voici le code:

stats = {}

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

Maintenant, votre code qui calcule le coût du changement de force pour un humain, peut être transformé en une fonction générique qui fonctionne pour n'importe quelle race ou statistique:

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

Vous remarquerez le code répété pour calculer total_present_costet total_desired_cost. Ces lignes pourraient être refactorisées dans une autre fonction (un exercice pour le lecteur).

Maintenant, le programme principal collecte simplement les entrées de l'utilisateur, appelle la fonction ci-dessus et imprime les résultats:

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}")