Проблема с текстовым приключением, глобальными и локальными переменными - PullRequest
0 голосов
/ 17 сентября 2018
from random import randint
from time import sleep

pminatk = 0
pmaxatk = 4
playerhp = 15

def atk(minatk, maxatk):
    return randint(minatk, maxatk)

def playerAtk(monsterhp):
    dmg = atk(pminatk, pmaxatk)
    monsterhp -= dmg
    print ("Du gjorde %i skade. Monsteret har nå %i liv igjen" % (dmg, monsterhp))
    sleep(1)
    return monsterhp

def monsterAtk(mminatk, mmaxatk):
    global playerhp
    dmg = atk(mminatk, mmaxatk)
    playerhp -= dmg
    print ("Monsteret gjorde %i skade. Du har nå %i liv igjen" % (dmg, playerhp))
    sleep(1)

def fight(monsterhp, mminatk, mmaxatk):
    global playerhp
    while monsterhp > 0 and playerhp > 0:
        playerAtk(monsterhp)
        if monsterhp > 0:
            monsterAtk(mminatk, mmaxatk)
    if playerhp > 0:
        print ("Gratulerer! Du beseiret monsteret!")
    else:
        print ("Du døde!")

fight(5, 1, 2)
fight(6, 0, 2)

Предполагается, что это простая боевая система в текстовом приключении.Теперь моя проблема в том, что monsterhp всегда возвращается к своему первоначальному значению после выполнения playerAtk.Если я выберу monsterhp в качестве глобальной переменной, он останется равным 0 после завершения fight (), оставляя hp всех ДРУГИХ монстров также равным нулю.Теперь у меня может быть несколько переменных для назначения разных значений hp разным монстрам, но есть ли способ сделать это, используя параметры для функции fight ()?

1 Ответ

0 голосов
/ 18 сентября 2018

Ваша непосредственная проблема в цикле while, когда вы звоните playerAtk(), вы возвращаете из него monsterhp, но фактически не используете его в этом цикле, и поэтому вы видите, что очки здоровья монстра возвращаются вверхк первоначальному значению.Строка 28 должна выглядеть следующим образом:

monsterhp = playerAtk(monsterhp)

вместо:

playerAtk(monsterhp)

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

from random import randint
from time import sleep

PLAYERNAME = "Player1"
PLAYERHP = 15
PMINATK = 0
PMAXATK = 4


class CharacterDied(Exception):
    def __init__(self, msg):
        self.msg = msg


class Character:
    def __init__(self, name, initial_hp, minatk, maxatk):
        self.name = name
        self.hp = initial_hp
        self.minatk = minatk
        self.maxatk = maxatk

    def take_damage(self, damage_hp):
        self.hp -= damage_hp
        msg = "{} takes {:d}HP damage and has {:d} left."
        print(msg.format(self.name, damage_hp, self.hp))
        if self.hp < 0:
            msg = "{} died."
            raise CharacterDied(msg.format(self.name))

    def attack(self, other):
        dmg = randint(self.minatk, self.maxatk)
        sleep(1)
        other.take_damage(dmg)


def fight(char1, char2):
    try:
        while True:
            char1.attack(char2)
            char2.attack(char1)
    except CharacterDied as death_exception:
        print(death_exception.msg)


if __name__ == "__main__":
    player = Character(PLAYERNAME, PLAYERHP, PMINATK, PMAXATK)
    fight(player, Character("Monster1", 5, 1, 2))
    if player.hp > 0:
        fight(player, Character("Monster2", 6, 0, 2))

Есть много способов сделать это.Для простоты я написал только один общий класс Character, который мы можем использовать для игроков и монстров, но даже если мы начали настраивать их с помощью подклассов, например, бой теперь стал немного более общим, и мы также можем провести атаку монстров.игрок в том виде, в котором он только что стал функцией двух сражающихся персонажей.

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

...