我如何根据已经创建的对象创建一个怪物列表,玩家可以与之交互

2024-10-02 08:18:04 发布

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

我是python和编程新手,我正在尝试制作一个基于文本的rpg,迄今为止我从中学到了很多,我只是想了解更多:)

我有一些对象(可能添加到战斗中的怪物),基于上面NPC的类,分配给一些变量

goblin = Monsters('Goblin', 10, 10, 0, 0, 0, 0, 0, 'melee', 1, 0, 0, 1) 

bear = Monsters('Bear', 15, 15, 0, 0, 2, 0, 0, 'melee', 2, 0, 0, 2) 

boar = Monsters('Boar', 10, 10, 0, 0, 1, 0, 0, 'melee', 1, 0, 0, 1) 

wolf = Monsters('Wolf', 15, 15, 0, 0, 2, 0, 0, 'melee', 2, 0, 0, 2) 

kobold = Monsters('Kobold', 10, 10, 0, 0, 0, 0, 0, 'caster', 1, 0, 0, 3) 

sprite = Monsters('Sprite', 10, 10, 10, 10, 0, 0, 2, 'support', 2, 0, 0, 3) 

我把它们加入一个列表


easyBattleMonsters = [goblin, bear, boar, wolf, kobold, sprite]

我有一个功能,这可能很糟糕,但我是新来的,所以我想我是这样做的,在一场战斗中,根据玩家的等级,这将增加5个怪物

def easyBattle():

    if playerCharacter.level < 6:

        easyBattle.easyMobOne = []

        easyMobLevel = []

        easyMobLevelSum = sum(easyMobLevel)

        easyBattle.easyMonsterOne = random.choice(easyBattleMonsters)

        easyBattle.easyMobOne.append(easyBattle.easyMonsterOne.name)

        easyMobLevel.append(easyBattle.easyMonsterOne.level)

        easyMobLevelSum = sum(easyMobLevel)

        if easyMobLevelSum < playerCharacter.level:

            easyMonsterTwo = random.choice(easyBattleMonsters)

            easyBattle.easyMobOne.append(easyMonsterTwo.name)

            easyMobLevel.append(easyMonsterTwo.level)

            easyMobLevelSum = sum(easyMobLevel)

            if easyMobLevelSum < playerCharacter.level:

                easyMonsterThree = random.choice(easyBattleMonsters)

                easyBattle.easyMobOne.append(easyMonsterThree.name)

                easyMobLevel.append(easyMonsterThree.level)

                easyMobLevelSum = sum(easyMobLevel)

                if easyMobLevelSum < playerCharacter.level:

                    easyMonsterFour = random.choice(easyBattleMonsters)

                    easyBattle.easyMobOne.append(easyMonsterFour.name)

                    easyMobLevel.append(easyMonsterFour.level)

                    easyMobLevelSum = sum(easyMobLevel)

                    if easyMobLevelSum < playerCharacter.level:

                        easyMonsterFive = random.choice(easyBattleMonsters)

                        easyBattle.easyMobOne.append(easyMonsterFive.name)

                        easyMobLevel.append(easyMonsterFive.level)

                        easyMobLevelSum = sum(easyMobLevel) 

        easyMobLevelSum = sum(easyMobLevel)

我觉得我上面的代码是我需要更改的,但不确定我应该做什么,我希望能够根据我添加到easyBattle.easyMobOne的内容实例化一个临时对象列表。比如,当它导入一只狼时,会变成一个新的“怪物1”,名字来自于这个对象,他们可以攻击它并杀死它,而不会影响狼的原始对象。然后,当他们完成这场战斗后,他们就失去了他们正在战斗的变量,他们可以开始另一场战斗并拥有新的怪物。我只想让他们有多种选择来攻击,他们都有自己的数据,但不确定目前最好的方式


Tags: 对象nameifrandomlevelsumchoiceappend
1条回答
网友
1楼 · 发布于 2024-10-02 08:18:04

为了扩展我的评论,您可能需要对事物进行建模,以便所有怪物都有一个基类,以及其中各种各样的怪物子类,单个怪物(Goblin 1、Goblin 2等)就是这些类的实例。这是一个相当简单的实现(相当简单,因为我忍不住添加了一个名称生成器…)

希望这能对事情有所启发

import random


# A helper to generate a random integer from a 2-tuple.
# Saves some typing below.
def _rand_range(minmax):
    return random.randint(minmax[0], minmax[1])


class Monster:
    # Class-level variables to govern how monsters are instantiated.
    hp_range = (0, 0)
    str_range = (0, 0)
    dex_range = (0, 0)
    name_characters = ""
    name_length_range = (0, 0)

    def __init__(self):
        # Use the class-level variables to set instance variables for
        # each individual monster.
        self.hp = _rand_range(self.hp_range)
        self.str = _rand_range(self.str_range)
        self.dex = _rand_range(self.dex_range)
        # If the name generator returns a falsy value (such as an empty string),
        # substitute Anonymous for this individual's name.
        self.name = self.generate_name() or "Anonymous"

    def generate_name(self):
        # This could be overridden in a subclass (I'm sure elves would have much more graceful
        # names than just random letters one after the other).

        name_length = _rand_range(self.name_length_range)
        # Pick `name_length` random letters from `name_characters` and join them.
        return "".join(random.choice(self.name_characters) for x in range(name_length)).title()

    def __str__(self):
        return f"{self.__class__.__name__} named {self.name} ({self.hp} HP, {self.str} STR, {self.dex} DEX)"


class Goblin(Monster):
    """
    A relatively weak monster type with high dexterity.
    """

    hp_range = (10, 15)
    str_range = (1, 3)
    dex_range = (3, 5)
    name_characters = "ppiao"
    name_length_range = (3, 7)


class Wolf(Monster):
    """
    A sturdy wolf-type thing that's kind of slow, but packs a punch.
    Would really just like to be scratched.
    """

    hp_range = (15, 25)
    str_range = (3, 5)
    dex_range = (1, 2)
    name_characters = "rwegrhr"
    name_length_range = (2, 9)


def generate_battle(monster_classes, battle_total_hp):
    # Instantiate a list to hold the monster instances.
    monsters = []
    # Compute the sum of the HPs of all monsters in this battle so far;
    # so long as that number is less than the requested total HP, keep
    # adding new monsters to the fray.  This will not guarantee that the
    # total HP of the battle is as prescribed, since the last monster generated
    # may be too powerful, but it's in the ballpark.
    while sum((m.hp for m in monsters), 0) < battle_total_hp:
        # Pick a monster class at random...
        monster_cls = random.choice(monster_classes)
        # Instantiate the monster, just as if you'd done `w = Wolf()`, etc.
        monster = monster_cls()
        # Add it to the list.
        monsters.append(monster)
    return monsters


# Generate a battle of about 100 HP using goblins and wolves.
# As a neat trick, to make goblins twice as likely to appear as wolves,
# simply repeat Goblin: [Goblin, Goblin, Wolf]
battle = generate_battle([Goblin, Wolf], battle_total_hp=100)

print("A battle begins!")
for monster in battle:
    print(monster)

运行此程序,您将看到如下内容

A battle begins!
Wolf named Eergrwheh (21 HP, 4 STR, 1 DEX)
Goblin named Ppi (13 HP, 2 STR, 5 DEX)
Goblin named Ipa (12 HP, 3 STR, 4 DEX)
Goblin named Ppiip (11 HP, 3 STR, 4 DEX)
Wolf named Ergrrrh (21 HP, 5 STR, 2 DEX)
Goblin named App (10 HP, 3 STR, 4 DEX)
Goblin named Ppappia (10 HP, 1 STR, 3 DEX)
Goblin named Apopi (13 HP, 1 STR, 3 DEX)

相关问题 更多 >

    热门问题