我最近提出的关于 Python 的所有问题都是针对这个项目的。我已经意识到我问这么多问题的原因可能不是因为我对 Python 太陌生(但我对 PHP 有一点了解),也可能不是因为 Python 有一些固有的缺陷。
因此,我现在将说明项目是什么以及我目前的想法是什么,你可以告诉我我做错了,我需要学习一些东西,或者 Python 根本不适合处理这种类型在这种情况下,项目和语言 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)
单位类包含它所在的相关地形的索引(可能是一个字符串)以及它所在的地层。
也许这会在我对 Python 的理解中显示出一些巨大的缺陷(6 个月与 PHP 的 3 年)。