所有的问题,我们已经问了最近关于蟒蛇已经为这个项目。我们意识到,原因,我要问这么多问题可能不是因为我新的Python(但是我知道一个好一点的PHP)和也许是不是因为蟒蛇具有一些固有的缺陷。

因此,我现在说什么项目是什么,我现在的想法是,你可以告诉我我这样做是完全错误的,这有几件事我需要学习或蟒是根本不适合于处理这种类型的项目和语言XYZ会更好,在这一实例或甚至有一些开放源项目,我可能会想参与进来。

项目
我运行一个免费的战略游戏(认为该活动的模式,从全面战争的系列,但是有更复杂性和深度)并创造一个作战模拟对于这(再次认为总战争作为一个想法如何会的工作)。我决不自欺欺人认为我会永远做什么都好,因为总战争游戏独自一人但我不认为我可以自动一个进程,目前我做手。

会是什么做的
它将必须考虑到一个大范围的变量单位、装备、培训、天气、地形等等。我知道这是一个很大的任务,我计划做到这一段时间我自由的时间。我已经预算零,但它是一个爱好,我准备把时间进入(已).

我现在的绊脚石
在PHP一切都可以访问其他的一切,"错误的",虽然有些人可能认为这是真的真的很方便。如果我有一系列的设备使用的单位,我可以抓住这一阵列从任何地方。与Python我要重拍,列每次我进口的相关数据文件,这似乎相当愚蠢的解决方案的语言,从我的经验,是经过深思熟虑的。我已经放在一个系统的记录日志功能的电话和类创作(因为我知道,从一个非常基本的版本的这个,我没有在PHP一次,这将帮助了很多的路线)和办法,我们保存的数据在一个地方,是通过我的每个课程的一个实例,向我的日志记录列表中,闻起来像一破解我,但这是唯一的办法我已经得到了它的工作。

因此,我的结论我失去了一些东西,并将非常赞赏的洞察力的人都愿意给它。谢谢你。

代码样本

这将创建一个清单的编队,迄今为止只有一个值(另外的名称),但我预计增加更多的对这就是为什么他们有的列表类,而不仅仅是一个标准清单。这是内发现的data.py

formations = []
formationsHash = []
def createFormations(logger):
    """This creates all the formations that will be used"""

    # Standard close quarter formation, maximum number of people per square metre
    formationsHash.append('Tight')
    formations.append(Formation(logger, 'Tight', tightness = 1))

    # Standard ranged combat formation, good people per square metre but not too cramped
    formationsHash.append('Loose')
    formations.append(Formation(logger, 'Loose', tightness = 0.5))

    # Standard skirmishing formation, very good for moving around terrain and avoiding missile fire
    formationsHash.append('Skirmish')
    formations.append(Formation(logger, 'Skirmish', tightness = 0.1))

    # Very unflexible but good for charges
    formationsHash.append('Arrowhead')
    formations.append(Formation(logger, 'Arrowhead', tightness = 1))


def getFormation(searchFor):
    """Returns the fomation object with this name"""
    indexValue = formationsHash.index(searchFor)
    return formations[indexValue]

我没有代码样本的时候我需要访问它,因为我已经不经得到尽可做,但我预计的代码如下:

Python
tempFormation = data.getFormation(unit.formationType)
tempTerrain = data.getTerrain(unit.currentTerrain)
unit.attackDamage = unit.attackDamage * tempTerrain.tighnessBonus(tempFormation.tightness)

本单元包含一个整数,链接到指标/键的相关地形、地层和诸如此类的东西中的主的名单。临时变量使用第3条线更短,但在很长的运行可能会引起问题,如果我忘了拿到一个和它的使用价值从前这是不正确,然后(这是记录在方便的).

PHP
$unit->attackDamage *= $terrain[$unit->currentTerrain]->tighnessBonus($unit->currentTerrain)

单位类包含的指标(可能是一个string)相关的地形,它是在形成。

也许这会展示一些大规模的缺陷,在我了解的蟒蛇(6个月与3年的PHP)。

有帮助吗?

解决方案

"data.py 创建一个阵列(嗯,列表),要使用这个名单是从另一文件我需要导入data.py 和改造所述清单"。

我不知道你在说什么.严重。

这里有一个主要程序,其进口的数据,以及另一个模块。

SomeMainProgram.py

import data
import someOtherModule

print data.formations['Arrowhead']
someOtherModule.function()

someOtherModule.py

import data
def function():
    print data.formations['Tight']

data.py

import theLoggerThing
class Formation( object ):
    pass # details omitted.
def createFormations( logger ):
    pass # details omitted
formations= createFormations( theLoggerThing.logger )

所以主要程序的工作原理是这样的。

  1. import data.的 data 模块是进口的。

    a. import theLoggerThing.不管这是什么.

    b. class Formation( object ):.创建一个类 Formations.

    c. def createFormations( logger ):.创建一个函数 createFormations.

    d。 formations =.创建一个对象, formations.

  2. import someOtherModule.的 someOtherModule 是进口的。

    a. import data.什么也不会发生。 data 已经可以在全球范围。这是一个参考是什么--有效地--一个 单独.所有Python模块 单身.

    b. def function.创建一个函数 function.

  3. print data.formations['Arrowhead'].评估 data.formations, ,这是一个典对象。做一个 get('Arrowhead') 在字典不会一些神奇的查找和返回的目发现有(一个实例 Formation).

  4. someOtherModule.function().

    什么发生过这种功能的评价。

    a. print data.formations['Tight'].评估 data.formations, ,这是一个典对象。做一个 get('Tight') 在字典不会一些神奇的查找和返回的目发现有(一个实例 Formation).

其他提示

  

使用Python我必须重新制作   每次我导入相关的数组   数据文件

你在这里错过了Python语义的微妙之处。第二次导入模块时,不会重新执行该模块中的代码。该名称位于导入的所有模块的列表中,并返回相同的模块。因此,第二次导入模块时,您将获得对同一列表的引用(在Python中,不要说数组,比如列表)。

您可能需要发布特定的代码示例以获得更多帮助,似乎有一些Python误解混入其中,一旦这些被清除,您将有一个更简单的时间。

我已将您的问题缩小到:

  

使用Python我必须重新制作   每次我导入相关的数组   数据文件

嗯,你真的有两个选择,第一个也是最容易将结构保留在内存中。这样(就像PHP一样)你理论上可以从“任何地方”访问它,你受到命名空间的限制,但这是为了你自己的利益。它将翻译为“您想要的任何地方”。

第二种选择是拥有一些数据抽象(如数据库或数据文件),它存储并从中检索数据。这可能比第一选择更好,因为您可能有太多的数据不能同时适应内存。再次获得这些数据的方式将在“任何地方”可用。就像PHP一样。

您可以以明确的方式将这些内容直接传递给实例,也可以使用模块级全局变量并将它们导入到需要它们的位置,然后继续说:

  

以及我保存数据的方式   一个地方是通过我的每一个   将实例分类到我的日志列表

我可以向你保证,这不是黑客攻击。这是非常合理的,具体取决于用途,例如配置对象可以以相同的方式使用,因为您可能希望同时使用不同的配置来测试您的应用程序。记录可能更适合作为刚刚导入和调用的模块级全局,因为您可能只想要一种记录方式,但同样,它取决于您的要求。

我想总结一下,你真的走在了正确的轨道上。尽量不要屈服于“hackish”。特别是在使用您并不完全熟悉的语言时会闻到异味。一种语言的黑客可能是另一种语言的黄金标准。当然,祝你的项目好运 - 听起来很有趣。

请不要重新发明轮子。您的 formationsHash 作为键值列表没有用,它会复制字典的功能。

def createFormations(logger):
    """This creates all the formations that will be used"""
    formations = {}
    formations['Tight']= Formation(logger, 'Tight', tightness = 1)
    formations['Loose']= Formation(logger, 'Loose', tightness = 0.5)
    formations['Skirmish']= Formation(logger, 'Skirmish', tightness = 0.1)
    formations['Arrowhead']= Formation(logger, 'Arrowhead', tightness = 1)
    return formations

注意,您实际上并不需要 getFormation ,因为它对您没有好处。你可以简单地使用这样的东西。

formations = createFormations( whatever )
f= formations[name]
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top