2016-08-20 54 views
0

我对python(3)的编码相当陌生,因为它有点像一个爱好,但是玩了一些游戏机制而不用担心GUI。我目前正在研究基于文本的文本游戏,其基础在于一个旧的Excel文档。它相当集中在数学和逻辑上,我认为这是一个非常简单但深入的机制。Python中基于文本的机制:类,字典或列表?

无论如何,游戏允许研究科技,生产建筑物,成长中的公民,聚集文化等。我正在努力的一件事是军事系统。

我有许多不同的单位供玩家制作。假设每个单位都有名称,实力和韧性(例如'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

您应该显示更多代码。像你在那里做的那样定义力量等等,意味着它们只适用于特定的单位,而不是*适用于所有这类单位;人们通常犯的错误是在课堂上定义这些价值观,但是你没有这样做。 –

+0

感谢您的反馈。我不确定哪些代码真的是相关的,因为它没有太多我有错误的代码,这只是我玩弄Python的逻辑,并不能完全弄清楚正确的结构。下面的答案是接近的,我只是在用户选择产生对象时创建对象的唯一ID的问题。 – Jammydude44

回答

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 

由于所有的弓箭手单位与同一统计(我认为)开始,这将消除需要指定您创建一个新的弓箭手单位strengthresilience每次(你可以做archer4= Archer()现在),你可以仍然改变一个单位的统计数据而不影响其他单位。

+0

谢谢。这与我所寻找的接近,至少表明我处在正确的轨道上。我正在努力的部分是当用户从生产菜单中选择它们时,即时生成独特的对象。你能推荐一个'archer'或'spearman'的用户输入如何让我达到我创建对象'archer3'或'spearman4'的程度?我似乎无法弄清楚如何在运行时为对象创建唯一的ID。 – Jammydude44

+0

@ Jammydude44我怀疑你是误会。只需调用构造函数'Archer()'或'Unit()',就可以创建一个新的,独特的独立单元/射手。不需要动态创建变量,即'archer386 = Archer()'。您只需要将所有其他单元与''all_my_archers.append(Archer())''一起存储到列表中。如果你真的需要每个单元的唯一ID,你可以使用内置的'id'函数:'id(archer1)'。 –

+0

是的,谢谢你,我是误会。我认为print(all_my_archers.name)正在返回'弓箭手,弓箭手,弓箭手',他们是同一个实例,我在我的问题中犯了同样的错误。但经过进一步测试,我可以看到它们是独特的实例。我现在正在理解关于对象的列表的魔力。时间来整理我的代码的其余部分!谢谢,完美回答。 – Jammydude44

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 
+0

感谢Kostas Pelelis,虽然这不是我正在寻找的东西(虽然我们会责怪那些模糊的帖子),但当我为系统添加更多深度时,我一定会保持方便。 – Jammydude44