【问题标题】:Convert type string object to type class object in python在python中将类型字符串对象转换为类型类对象
【发布时间】:2021-11-18 17:44:30
【问题描述】:

我有一些我正在构建的不和谐机器人的代码,我想让它变得更干净。我不想在新敌人出现时编写新的 if 语句,而是想检查用户输入是否已经是敌人(类对象),然后对该同名的类对象执行操作。

下面是构建敌人的代码。

class EnemyCreator:

type = 'enemy'

def __init__(self, name, enemy_type, health, ap):
    self.name = name
    self.enemy_type = enemy_type
    self.health = health
    self.ap = ap
    info = (name + ', ' + str(health) + ', ' + str(ap))
    npc_info.append(info)

这是一个敌人的例子:

skeleton = EnemyCreator('Randy Bones', 'skeleton', 100, 2)

我有一个攻击功能:

def attack(enemy):
    enemy.health = enemy.health - playerChar.ap
    if enemy.health > 0:
        playerChar.health = playerChar.health - enemy.ap
        return ('You attacked ' + enemy.name + '. ' + str(enemy.health) + ' life remaining. \n'
                + enemy.name + ' attacks back! You take ' + str(enemy.ap) + ' damage. You have ' + str(playerChar.health)
                + ' remaining!')
    if enemy.health <= 0:
        return enemy.name + ' has been defeated!'
    if playerChar.health <= 0:
        return 'You died idiot.'

然后我用这段代码检查输入:

async def on_message(message):
    print(message.content)
    if message.author != client.user:
        if 'test' in message.content.lower():
            print(npc_info)
        if '!attack' in message.content.lower():
            await message.channel.send(
                attack(message.content[8::))

但是,这会导致一个问题,因为传递给attack(enemy) 函数的对象是一个字符串,我需要它是一个类对象。关于如何添加此功能的任何想法?

【问题讨论】:

  • 你在哪里存储消息之间的上下文?您需要从某个地方检索 Enemy ...您可以创建一个 EnemyList 或只是将您创建的所有敌人保存在 Enemy 类中(丑陋,但有效),然后询问具有您在消息中收到的名称的敌人.. .
  • 所以做一个EnemyList,然后检查列表中对象的str是否=字符串,然后从列表中返回匹配字符串的对象?
  • 我会提出一个答案
  • 您不想将其转换为“类对象”,您想将其转换为EnemyCreator 对象。

标签: python string class discord.py


【解决方案1】:

我找到了解决方案。我已经列出了所有敌人的名单以及他们的名字。然后我将对应值的索引返回给敌人的名字。以下是我想出的。

创建敌人:

boss = EnemyCreator('Charles Hammerdick', 'boss', 10000, 200)
npc_list.append(boss)
npc_list.append(boss.name)

攻击功能:

def attack(enemy):
for thing in npc_list:
    if str(enemy) in str(thing):
        enemy = (npc_list[npc_list.index(thing) - 1])
        enemy.health = enemy.health - playerChar.ap
        if enemy.health > 0:
            playerChar.health = playerChar.health - enemy.ap
            return ('You attacked ' + enemy.name + '. ' + str(enemy.health) + ' life remaining. \n'
                    + enemy.name + ' attacks back! You take ' + str(enemy.ap) + ' damage. You have ' + str(playerChar.health)
                    + ' remaining!')
        if enemy.health <= 0:
            return enemy.name + ' has been defeated!'
        if playerChar.health <= 0:
            return 'You died idiot.'

【讨论】:

  • 有效!不过,我建议您尝试将这些概念(玩家、NPC、敌人)拆分为类,您的代码很难在几个月内为他人或您自己阅读。
【解决方案2】:

你应该有办法对付现有的敌人。 我将建议使用内存解决方案,但对于更健壮/可扩展的解决方案,您应该使用数据库(sqlite、Postgresql、Mysql),并且为了便于开发,使用 ORM(SQLalchemy 或 Django)。

一个 EnemyList 将是:

class EnemyList:
    def __init__(self):
        self._enemies = {}
    def new_enemy(name, enemy_type, health, ap):
        enemy = EnemyCreator(name, enemy_type, health, ap)
        self._enemies[name] = enemy
        return enemy
    def find_enemy(name):
        return self._enemies[name]

那么您需要更改您的 on_message 函数才能使用它

async def on_message(message):
    print(message.content)
    if message.author != client.user:
        if 'test' in message.content.lower():
            print(npc_info)
        if '!attack' in message.content.lower():
            await message.channel.send(
                attack(EnemyList.find_enemy(message.content[8::)))

这是简短的答案,我不会在这里添加其他建议,因为它们与问题无关,但您也可以查看:

  • 字符串格式
  • OO -> 攻击函数应该是 playerChar 对象的方法?
  • 我已经谈到了 DB。

【讨论】:

  • 为什么不使用字典,而不是列表,每个敌人的名字是关键?
  • @Jasmijn,确定!我改了,谢谢反馈!
猜你喜欢
  • 1970-01-01
  • 2011-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-27
相关资源
最近更新 更多