Python 中基于文本的机制:Class、字典或列表?

Text Based Mechanics in Python: Class, Dictionary, or List?

我对 python (3) 中的编码相当陌生,这在某种程度上是一种爱好,但我很喜欢玩一些游戏机制而不用担心 GUI。我目前正在开发一个文明类型的基于文本的游戏,它的基础是一份旧的 excel 文档。它以数学和逻辑为中心,我认为这是一套非常简单但深入的机制。

无论如何,游戏允许研究技术、生产建筑、培养公民、收集文化等。我正在努力解决的一件事是军事系统。

我有许多不同的单位供玩家生产。假设每个单位都有名称、强度和弹性(例如 'Archer'、'10'、'80')。战争是基于玩家的总实力(我可以计算出来)。在每个 war 之后,该单位的强度会随着它的弹性而降低,即。在 war 到强度 8 后,这个弓箭手会降低到其原始强度的 80%。

但是,我无法弄清楚用户如何以允许此机制的方式创建单位。我最初使用 Unit() class(不同的单位,例如弓箭手、长矛手作为对象)和 'quantity' 参数以及 name/strength/resilience 来表示建造的单位数量,但每次我 运行 计算弹性效果的函数 我意识到我不仅影响了当前生产的单元,而且也影响了单元的所有未来版本。我 运行 是这样的:

class Unit():
  def __init__(self, name, quantity, strength, resilience)
  self.name = name
  self.quantity = quantity
  self.strength = strength
  self.resilience = resilience

archer = Unit('archer', 0, 10, 80)

等...

用户每建造一个单位,'quantity'就会增加。但是我开始明白,可能是这种编码方法限制了我。阅读其他线程告诉我,我的目标应该是不以这种方式存储对象数据,对吗?

我一直在尝试和研究,但我似乎无法理解解决方案(我确信它存在)。我很难找到正确的方法来存储每个单元的基本数据(名称、强度、弹性),同时允许用户为每个单元生成多个唯一的副本。每个单元应该是一个class?一个子class?它应该存储在字典中?一个列表?

对于此 post 中缺少代码,我深表歉意,但我并没有完全错误的代码 - 我只是缺乏逻辑和 python 知识来找到正确的系统使它正常工作。一直在玩字典、列表、循环、继承 classes,但我就是做不对。

如何在不影响未来可能产生的弓箭手的情况下创建多个弓箭手,每个弓箭手都会受到伤害?

如果有人能提出建议,谢谢。除此之外,我在 python!

中享受了很多编码乐趣

class 的要点在于,它可以让您创建 class 的许多 实例 。您不需要(也不能't/shouldn')为每个单元子class Unit。您只需要 实例化 Unit class:

 archer1= Unit('archer', 0, 10, 80)
 archer2= Unit('archer', 0, 10, 80)

现在你有两个独立的弓箭手单位,拥有不同的统计数据。如果其中一个在war中战斗并且其属性发生变化,另一个不会受到影响:

 archer1.strength= 0
 print(archer2.strength) # prints 10

当然,这意味着您不需要 quantity 属性,您需要将所有单元存储在某种数据结构中,例如列表:

 all_my_archers= [archer1, archer2]
 #create a 3rd archer
 all_my_archers.append(Unit('archer', 0, 10, 80))

这不太重要,但您还应该考虑子classing Unit 来创建一个 Archer class:

class Unit:
    def fight_war(self):
         self.strength= self.strength * self.resilience / 100.0

class Archer(Unit):
    name= 'archer'
    strength= 10
    resilience= 80

因为所有弓箭手单位都以相同的统计数据开始(我假设),这将消除每次创建新弓箭手单位时指定 strengthresilience 的需要(你可以只archer4= Archer() 现在),你仍然可以在不影响其他单位的情况下更改一个单位的统计数据。

对我来说,尤其是当您创建游戏时,子类化是编写优质代码的一种非常好的方式。主要是因为您可以在子类上实现独立的功能。例如,每个 Unit 可能具有相同的移动机制,但 Archer Unit 可能会在攻击过程中延迟。谈代码:

class Unit(object):

    def __init__(self, movement_speed=10, health=100):
        self.movement_speed = movement_speed
        self.health = health
        self.position = 0

    def move(self):
        self.position += movement_speed

    def get_hit(self, damage=0):
        self.health -= damage

    #etc

class Archer(Unit):

    def __init__(self, arrows=10):
        super(self.__class__, self).init()
        self.arrows = 10

    # Archer has all the Unit methods

    def attack(self, other_unit_instance):
        # Here you can check if he is in range, etc
        other_unit_instance.get_hit(damage=1)
        self.arrows -= 1