我最近提出的关于 Python 的所有问题都是针对这个项目的。我已经意识到,我问这么多问题的原因可能不是因为我对 Python 太陌生(但我对 PHP 了解很多),也可能不是因为 Python 有一些固有的缺陷。
因此我现在会说这个项目是什么以及我目前的想法是什么,你可以告诉我我做错了,我需要学习一些东西或者 Python 根本不适合处理在这种情况下,使用这种类型的项目和语言 XYZ 会更好,甚至有一些我可能想参与的开源项目。
项目
我运行一个免费的回合制策略游戏(想一想全面 war 系列的战役模式,但更加复杂和有深度)并正在为它创建一个战斗模拟器(再次,把全面 war 想成它如何运作的一个想法) .我绝不会自欺欺人地认为我会单独制作出与全面 war 游戏一样出色的游戏,但我确实认为我可以将我目前手动完成的流程自动化。
它会做什么
它必须考虑单位、装备、训练、天气、地形等的大量变量。我知道这是一项艰巨的任务,我计划在空闲时间一次完成它。我的预算为零,但这是我准备投入时间(并且已经投入)的爱好。
我目前的绊脚石
在 PHP 中,一切都可以访问其他一切,这是“错误的”,尽管有些人可能认为这真的很方便。如果我有一个供单位使用的设备阵列,我可以从任何地方获取该阵列。使用 Python 时,我每次导入相关数据文件时都必须重新制作该数组,对于一种根据我的经验经过深思熟虑的语言来说,这似乎是一个相当愚蠢的解决方案。我已经安装了一个记录函数调用和类创建的系统(因为我从一个非常基本的版本中知道我在 PHP 中做过一次,它会帮助很多)以及我一直保持的方式一个地方的数据是将我的每个类的一个实例传递到我的日志记录列表,这对我来说听起来像是一个 hack,但这是我让它工作的唯一方法。
因此我得出结论,我遗漏了一些东西,非常感谢任何愿意提供它的人的见解。谢谢。
代码示例
这会创建一个构造列表,到目前为止只有一个值(除了名称之外),但我预计会添加更多值,这就是为什么它们是一个类列表而不仅仅是一个标准列表。这是在 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)
单位类包含它所在的相关地形及其所在编队的索引(可能是一个字符串)。
也许这会显示我对 Python 的理解存在一些重大缺陷(6 个月与 3 年的 PHP)。
最佳答案
With Python I have to remake that array each time I import the relevant data file
您在这里遗漏了 Python 语义的一个微妙之处。当您第二次导入模块时,您并没有重新执行该模块中的代码。在所有导入模块的列表中找到该名称,并返回给您相同的模块。因此,第二次导入模块时,您将获得对同一列表的引用(在 Python 中,不要说数组,而是列表)。
您可能需要发布特定的代码示例以获得更多帮助,似乎其中混入了一些 Python 误解,一旦这些误解被清除,您就会有一个更简单的时间。
关于php - 我忍不住想到我做错了(又是 Python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/405106/