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
因为所有弓箭手单位都以相同的统计数据开始(我假设),这将消除每次创建新弓箭手单位时指定 strength
和 resilience
的需要(你可以只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
我对 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
因为所有弓箭手单位都以相同的统计数据开始(我假设),这将消除每次创建新弓箭手单位时指定 strength
和 resilience
的需要(你可以只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