文本冒险,全局和局部变量的问题

2024-09-27 23:17:57 发布

您现在位置:Python中文网/ 问答频道 /正文

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)

这应该是一个简单的战斗系统在一个文本为基础的冒险。现在我的问题是,怪物惠普总是回到原来的山谷后,playerAtk被执行。如果我选择monsterhp作为全局变量,那么在fight()结束后它将保持为0,其他所有怪物的hp也将保持为0。现在我可以有多个变量将不同的hp值分配给不同的怪物,但是有没有任何方法可以使用fight()函数的参数来实现这一点


Tags: fromimportdefsleepprintdu怪物dmg
1条回答
网友
1楼 · 发布于 2024-09-27 23:17:57

你的直接问题是在你的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类,我们可以用于玩家和怪物,但即使我们开始用子类来定制它们,例如战斗现在更通用了一些,我们也可以让怪物攻击玩家,因为它刚刚成为两个战斗角色的函数

对于您最初的问题,尽管这里追求的好处是属性与它们的实例对象一起保持和持久化,这通常比处理和跟踪全局变量要容易得多

相关问题 更多 >

    热门问题