【问题标题】:How to use an object orientated approach to creating a character for a text based game如何使用面向对象的方法为基于文本的游戏创建角色
【发布时间】:2019-10-30 01:31:55
【问题描述】:

我正在尝试使用 python 学习面向对象的编程来创建一个简单的基于文本的游戏。作为这种编码方法的新手,我目前正在苦苦挣扎。

所以我的想法是创建一个角色的子类,以包含如下代码所示的“统计数据”之类的内容,这将在角色创建过程中由角色的“种族”决定。就上下文而言,种族将包括矮人、精灵、人类、兽人。

从我失败的尝试中可以看出,我显然错过了一条重要的信息来解决我在这里所做的事情。不幸的是,我想象互联网上到处都是 python 游戏,但大多数都没有使用我正在尝试学习的面向对象的方法。

class Character:
    def __init__(self, playerName, playerGender, playerRace, playerFaction):
        self.playerName = playerName
        self.playerGender = playerGender
        self.playerRace = playerRace
        self.playerFaction = playerFaction
        self.playerStats = []

    def setPlayerStats(self, mining, manufacturing, exploration, invention, trading):
        self.mining = 0
        self.manufacturing = 0
        self.exploration = 0
        self.invention = 0 
        self.trading = 0
        self.playerStats.append(setPlayerStats)

我正在寻找一种面向对象的方法来将“统计”分组到字符类,但不幸的是,我的研究(可能与我缺乏理解有关)让我感到难过,任何指导都将不胜感激。

【问题讨论】:

  • 您能否发布您从Character 扩展的比赛课程以获取上下文?如果您打算使用继承,则无需声明 playerRace 属性,因为它将是您的子类的名称。
  • 我还没有做到这一点,因为我目前的问题是在我的角色类中存储种族派系统计数据和性别的类子集。然而,在某些情况下,Race 将包括 Dwarf[3,1,0,1,0] ~ 与“统计数据”相关,并且到目前为止该部分的概念扩展。

标签: python-3.x


【解决方案1】:

如果我正确理解了您的问题,您将需要修改您的基类并执行以下操作(更改属性名称以更好地符合 PEP8):

class Character:
    def __init__(self, name, gender, faction):
        self.player_name = name
        self.gender = gender
        self.faction = faction
        self.set_player_stats()

    def _set_player_stats(self, mining, manufacturing, exploration, invention, trading):
        self.mining = mining
        self.manufacturing = manufacturing
        self.exploration = exploration
        self.invention = invention
        self.trading = trading

    def set_player_stats(self):
        raise NotImplementedError()

class Dwarf(Character):
    def set_player_stats(self):
        self._set_player_stats(3, 1, 0, 1, 0)

那么您可以执行以下操作:

>>> john_the_dwarf = Dwarf("John Doe", "M", "Foo Faction")
>>> john_the_dwarf.mining
3

【讨论】:

  • 按照您的示例,我稍微修改了它以在某种程度上显示我正在尝试做的事情def setPlayerRace(dwarf, elf, human, orc): self.dwarf = dwarf self.elf = elf self.human = human self.orc = orc def playerRace(self): raise NotImplementedError() class playerRace(Character): def playerRace(self): self.setPlayerRace() 如果您遵循我在这里尝试做的事情,那么在某种程度上。由于我缺乏技术术语,因此很难理解我的意思。
  • 这不是面向对象设计的工作方式。班级本身的比赛。您不会将比赛存储在单独的属性中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多