我对python(3)中的编码相当陌生,这有点像一种爱好,但玩得开心玩游戏机制而不用担心GUI。我目前正在开发一种基于文明类型的文本游戏,其基础在于一个旧的excel文档。它主要集中在数学和逻辑上,我认为这是一个非常简单但深入的机制。
无论如何,游戏允许研究技术,生产建筑物,成长公民,收集文化等。我正在努力的一件事是军事系统。
我有很多不同的单位供玩家制作。假设每个单位都有名字,力量和弹性(例如'Archer','10','80')。战争是基于玩家的总体力量(我可以计算出来)。每次战争结束后,单位的力量会因其弹性而降低。在战争结束后,这个弓箭手将减少到原来力量的80%。力量8。
但是,我无法弄清楚用户如何以允许此机制的方式创建单元。我最初使用Unit()类(使用不同的单位,例如archer,spearman作为对象),其中包含名称/强度/弹性的'数量'参数以及建立的单位数量,但每次我运行该函数来计算效果时弹性我意识到我不仅影响了目前生产的单位,也影响了该单位的所有未来版本。我正在运行以下内容:
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)
等...
每次用户构建单位时,“数量”都会增加。但是我已经明白,可能这种编码方法可能限制了我。阅读其他线程告诉我,我的目标应该是不以这种方式存储对象数据,对吗?
我一直在玩和研究,我似乎无法理解解决方案(我确信在那里)。我无法找到存储每个单元的基本数据(名称,强度,弹性)的正确方法,同时允许用户生成每个单元的多个唯一副本。每个单位应该是一个班级?一个子类?它应该存储在字典中?一个列表?
我为这篇文章中缺少代码道歉,但我并没有错误的代码 - 我只是缺乏逻辑和python知识来找到合适的系统来使这项工作正常运行。一直在玩字典,列表,循环,继承的类,但我无法正确使用它。
如何创造多个每个都受到伤害的弓箭手,而不影响未来可能产生的弓箭手?
谢谢,如果有人可以提出建议。除此之外,我在python中有很多有趣的编码!
答案 0 :(得分:1)
类的关键在于它允许您创建该类的许多实例。对于每个单元,您不需要(并且不能/不应该)子类Unit
。您只需要实例化 Unit
类:
archer1= Unit('archer', 0, 10, 80)
archer2= Unit('archer', 0, 10, 80)
现在你有两个独立的射手单位,分别有统计数据。如果他们中的一个人在战争中战斗并且其属性发生变化,那么另一个人就不会受到影响:
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))
这不太重要,但您还应考虑将Unit
子类化以创建Archer
类:
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
(你可以{现在{1}},你仍然可以在不影响其他单位的情况下更改单位的统计数据。
答案 1 :(得分:0)
对我而言,特别是在创建游戏时,子类化是编写优秀代码的一种非常好的方式。主要是因为您可以在子类上实现独立功能。例如,每个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