ООП, атрибуты / функции помогают. Жесткое кодирование ... не уверен, что делать. (ПЕРВАЯ ПОПЫТКА) - PullRequest
0 голосов
/ 04 октября 2019

ПЕРВАЯ ПОПЫТКА на ООП. Я пишу игру с героями, которые имеют несколько «способностей». Я много повторяюсь и не знаю, как это упростить. Сейчас я пишу каждую новую способность, и я знаю, что это очень плохо ... Заранее спасибо ...

Я чувствую, что есть способ назвать что-то вроде ... "self.ability (стоимость, ущерб, модификатор защитника, специальный эффект) "Кроме того, все" способности "должны пройти несколько" проверок ", прежде чем они будут успешными. Это также очень неуклюже здесь, но я не уверен, как убрать это. Заранее спасибо ...

def lightning_bolt(self):
    if self.is_stunned:
        print("Stunned...ability unsuccessful.")
    elif self.is_confused:
        confused_test = roll_d_x(2)
        if confused_test == 1:
            print("Confused...ability unsuccessful.")
    else:
        defender.mobility = (defender.mobility / 2)
        success = self.success_check()
        defender.mobility = (defender.mobility * 2)
        if success:
            volatile_roll = roll_d_x(10)
            if volatile_roll == 1:
                self.volatile_magic()
            else:
                defender.lose_health(((self.energy * 0.5) + 10))
                self.lose_energy(25)
                stun_test = roll_d_x(4)
                if stun_test == 1:
                    defender.is_stunned = True
        else:
            print("Ability failed.")

def fireball(self):
    if self.is_stunned:
        print("Stunned...ability unsuccessful.")
    elif self.is_confused:
        confused_test = roll_d_x(2)
        if confused_test == 1:
            print("Confused...ability unsuccessful.")
    else:
        defender.mobility = (defender.mobility * (3/2))
        success = self.success_check()
        defender.mobility = (defender.mobility * (2/3))
        if success:
            volatile_roll = roll_d_x(10)
            if volatile_roll == 1:
                self.volatile_magic()
            else:
                defender.lose_health((self.energy * (7/10)) + 5)
                defender.is_terrified = True
                self.lose_energy(30)
        else:
            defender.lose_health(self.energy * (1/4))
            print("Ability failed. Damage reduced.")

Он делает то, что я хочу, но я знаю, что есть лучший способ. Есть 3 героя и 15 способностей, которые все должны запускаться с использованием одного и того же материала «if self.is_stunned ...». Это явно очень повторяющееся кодирование. Спасибо.

1 Ответ

0 голосов
/ 04 октября 2019

Один из способов сделать это - абстрагировать тесты к новому методу:

def check_status_effects(self):
    status = False
    if self.is_stunned:
        print("Stunned...ability unsuccessful.")
        status = True
    elif self.is_confused:
        confused_test = roll_d_x(2)
        if confused_test == 1:
            print("Confused...ability unsuccessful.")
        status = True
    return status

Затем, поскольку я предполагаю, что вы не хотите, чтобы способность преуспела, если они имеют эффект состояния, проверьтевозврат check_status_effects в ваших методах способностей:

def fireball(self):
    if self.check_status_effects():
        return
    # rest of ability code here
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...