Python и переменная внутри переменных - PullRequest
0 голосов
/ 14 мая 2018

У меня есть этот объект Troll. Я сделал случайный выбор для его «оружия». Каждый раз, когда он появляется, его оружие будет меняться. В его разделе статуса объекта у меня есть переменная base_att. Я хочу, чтобы она была переменной урона от его оружия. Как я могу обновить переменную base_att с помощью переменной 'Weapon' random.choice обратите внимание, что я перечислил все свое «оружие» в другом файле .PY, следовательно, items.weapon_for_troll вызывает.

class stick:
    name = 'Wooden Stick'
    damage = range (0,3)
    effect = None  

class rocks:
    name = 'Rocks'
    damage = range (0,5)
    effect = None

class troll:
    name = 'Troll'

class equipment:
    weapon = random.choice(items.weapon_for_troll)

class inventory:
    loot = None

class status:
    level = 1
    exp_point = 30
    hp_point = 30
    base_att = 
    base_def = 2
    bonus_def = 0

1 Ответ

0 голосов
/ 14 мая 2018

Необходимо различать («статические») переменные класса и («не статические») переменные экземпляра.

Вы объявляете все вещи статичными - это отлично подходит для вещей, которые делятся между всеми троллями (например, «тип» монстров - иначе говоря, тролль) - не так хорошо для вещей, которые все «имеют», но не являются «одинаковыми» - скажи как инвентарь.

Попробуйте этот подход:

import random

class Weapon: # no need to make each weapon its own class
    def __init__(self,name,damage,effect):
        self.name = name
        self.damage = damage
        self.effect = effect    

# create some troll weapons to choose from
troll_weapons = [ Weapon("Wooden Stick", range(3), None), Weapon("Rocks",range(5), None) ]

class Equipment:
    def __init__(self):
        # every time you instantiate a new equipment, generate a random weapon
        # for this instance you just created. They are not static, they differ
        # between each Troll (who instantiates its own Equipment)
        self.weapon = random.choice(troll_weapons)

class Troll:    
    name = 'Troll'
    def __init__(self):
        self.equipment = Equipment() # get a new instance of Eq for this troll
                                     # instance
        self.weapon = self.equipment.weapon  # "link" the troll weapon to its equipment
                                             # as shortcut - do smth similar to an 
                                             # instance of your "Stat" block

    def __str__(self):
        return f"Troll with: {self.weapon.name}"

# create a troll army
trolls = [Troll() for _ in range(10)]
for t in trolls:
    print(t)

Выход:

Troll with: Rocks
Troll with: Wooden Stick
Troll with: Rocks
Troll with: Rocks
Troll with: Wooden Stick
Troll with: Rocks
Troll with: Wooden Stick
Troll with: Wooden Stick
Troll with: Wooden Stick
Troll with: Wooden Stick

Читает, чтобы проверить:

Классы
Переменные класса и переменные экземпляра

Sidenotes:

  • существует соглашение о схемах именования, классы начинаются с заглавной буквы, члены в нижнем регистре
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...