0
votes

Comment puis-je itération des propriétés d'objet et attribuez-y l'utilisateur de l'utilisateur?

Je suis en train d'enseigner à Python en écrivant un jeu de chenilles de style DND-Style Roguelike / Dungeon. Je basse la création et le gameplay de personnage sur le 5e Srd.

J'ai complété le tutoriel de la Roguebasin TCOD et le Tutoriel d'aventure de texte de Philip Johnson.

Ce que j'essaie de faire est de prendre une valeur de l'entrée et attribuez-la à la statistique appropriée, qui est définie comme une propriété de l'objet de caractère. xxx

J'en ai une partie de cela Mon code compile et fonctionne pour tester. Je souhaite itération sur la liste des statistiques et attribuer la saisie de l'utilisateur à la statistique correspondante: xxx

Cela semble être faisable, mais jusqu'à présent, tout ce que j'ai trouvé, c'est de Zip les statistiques et les entrées dans des tuples. Je dessine un vide sur la manière de vous assurer que les valeurs correctes sont attribuées à la propriété correcte.


3 commentaires

Vous savez que vous pouvez transmettre ces valeurs au constructeur de votre classe?


Mais cela ne vaingerait-il pas le but de la boucle? J'avais à l'origine self.s = valeur , pensant qui utiliserait la valeur actuelle de s. Cependant, Python semble l'interpréter comme si j'essaie d'assigner auto-self.s en tant que nouvelle propriété et donne une erreur de nom non résolue.


Ça ne fait rien. Je n'ai pas lu plus loin. :)


3 Réponses :


0
votes

Vous pouvez faire quelque chose comme ça, assurez-vous simplement qu'il n'y a aucun moyen de l'abuser et de changer l'attribut de quelque chose qui n'est pas destiné à être changé. Voici un exemple: xxx


1 commentaires

Je pense que je comprends. Ainsi, en utilisant mon exemple, au lieu de l'ajouter à des "valeurs commandées", j'utiliserais `SETATTR (joueur, S, valeur) 'pour prendre l'entrée I stockée de valeur et l'attribuer à la statistique à laquelle il est actuellement itération?



1
votes

Lire les valeurs en dehors de __ init __ code>, et transmettez-les comme des arguments lorsque vous instaniez le caractère. Si vous souhaitez envelopper la session interactive avec l'instanciation dans une seule fonction, faites une méthode de classe.

import random


class BaseCharacter:
    stats = ["strength", "dexterity", "constitution", "intelligence", "wisdom", "charisma"]
    def __init__(self, s, d, co, i, w, ch):        
        self.strength = s
        self.dexterity = d
        self.constitution = co
        self.intelligence = i
        self.wisdom = w
        self.charisma = ch

    @classmethod
    def create(cls):
        print("With the standard array, you get these scores to distribute as you see fit: ")
        values = [15, 14, 13, 12, 10, 8]
        print(values)
        ordered_values = []
        for s in self.stats:
            print("Which score would you like to assign to {}?".format(s))
            value = input()
            ordered_values.append(value)
            values.remove(int(value))
            print("Remaining values: " + str(list(values)))

        return cls(*ordered_values)

    # To demonstrate the benefit of separating the source of the
    # attributes from the actual instantiation
    @classmethod
    def random(cls):
        # Simulate 3d6 for each of the 6 stats
        random_stats = [sum(random.randint(1,6) for _ in range(3))
                         for _ in self.stats]
        return cls(*random_stats)

new_character = BaseCharacter.create()


2 commentaires

En fait, ignorer ma réponse, il y a une solution beaucoup plus simple. Dans votre fonction __ init __ de votre classe, vous attribuez self.cunstitution à c , mais dans la liste des arguments, c'est co.co


Oups, merci, j'ai oublié de mettre à jour cela après avoir ajouté l'argument manquant de charisme.



0
votes

Je ferais quelque chose dans ces lignes. Fournir les valeurs de l'instance dans un constructeur. Pour obtenir ces valeurs, je demanderais à plusieurs reprises une entrée et des noms de carte aux valeurs. La méthode __ rep __ code> est juste pour une belle impression. Pourrait être utile plus tard lors de l'affichage des statistiques.

class Dude:
    def __init__(self, strength, dexterity, constitution, ingelligence, wisdom, charisma):
        self.strength = strength
        self.dexterity = dexterity
        self.constitution = constitution
        self.ingelligence = ingelligence
        self.wisdom = wisdom
        self.charisma = charisma

    def __repr__(self):
        return f"""Dude:
STR: {self.strength}
DEX: {self.dexterity}
CONST: {self.constitution}
INT: {self.ingelligence}
WISD: {self.wisdom}
CHAR: {self.charisma}
"""


values = [15, 14, 13, 12, 10, 8]
stats = ['strength', 'dexterity', 'constitution', 'ingelligence', 'wisdom', 'charisma']

assigned = {}
for stat in stats:
    print('Assigning %s:' % stat)
    print('Values left: %s' % str(values))
    val = int(input('Choose:'))
    assigned[stat] = val
    values.remove(val)

d = Dude(**assigned)
print(d)


1 commentaires

En fait, j'utilise Python 3.7.4, mais les tutoriels que j'ai trouvés étaient initialement conçus pour les versions plus anciennes. Merci!