2009-01-01 15 views
2

我最近問到的關於Python的所有問題都是針對這個項目的。我意識到我問這麼多問題的原因可能不是因爲我對Python很新穎(但我知道很多PHP),可能並不是因爲Python有一些固有的缺陷。我只能幫助明白我做的全部錯誤(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) 

該單元包含鏈接到諸如此類的東西在主列表的有關地形,形成和索引/鍵的整數。臨時變量用於縮短第三行,但從長遠來看,如果我忘記獲取一個,並且它使用的是之前的值而不正確(這就是日誌記錄派上用場的地方),可能會導致問題。

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

單元類包含了相關的地形它是在和它在形成的指標(可能是一個字符串)。

也許這會顯示一些大規模的缺陷在我的Python的理解(6月vs PHP的3年)。

+0

「我必須在每次導入相關數據文件時重新創建該數組」。請輸入Post code snippet。 – 2009-01-01 16:39:12

+0

data.py創建一個數組(well,list),從另一個文件中使用這個列表,我需要導入data.py並重新制作所述列表。 – Teifion 2009-01-01 16:41:52

回答

1

「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 datadata模塊已導入。

    a。 import theLoggerThing。無論如何。

    b。 class Formation(object):。創建一個類Formations

    c。 def createFormations(logger):。創建一個功能createFormations。 d)。 formations =。創建一個對象,formations

  2. import someOtherModulesomeOtherModule已導入。

    a。 import data。什麼都沒發生。全球已有data。這是對什麼是 - 有效 - 一個Singleton的參考。所有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的一個實例)。

3

我已經縮小您的問題到:

使用Python我要重拍那 陣列每次我導入相關 數據文件

那麼你有兩種選擇真的,首先也是最簡單的是將結構保留在記憶中。這樣(就像PHP一樣),理論上你可以從「任何地方」訪問它,你稍微受限於命名空間,但那是爲了你自己的好處。它會翻譯爲「任何你想要的地方」。

第二種選擇是存儲一些數據抽象(如數據庫或數據文件),並從中檢索數據。這可能比第一種選擇更好,因爲你可能有太多的數據不能立即適應內存。再次,獲取這些數據的方式將像「PHP」一樣「隨處可用」。

您可以直接傳遞這些東西實例以明確的方式,也可以使用模塊級的全局變量,並將其導入到地方,你需要它們,因爲你繼續說:

和我已經把在 一個地方的數據的方式是我的每一個 類的實例傳遞給我的日誌列表

我可以向你保證,這不是黑客攻擊。這是非常合理的,取決於用途,例如配置對象可以以相同的方式使用,因爲您可能想要使用同時不同的配置來測試您的應用程序。日誌記錄可能更適合作爲只是導入和調用的模塊級別的全局,因爲您可能只需要一種日誌記錄方式,但它又取決於您的要求。

我想總結一下,你真的走在正確的軌道上。儘量不要讓這種「駭人聽聞」的氣味,尤其是在使用你不熟悉的語言時。一種語言的黑客可能是另一種語言的黃金標準。當然,與你的項目一樣好運 - 聽起來很有趣。

+0

感謝您的積極評論:) – Teifion 2009-01-01 16:45:18

+0

@Ali答:「保留內存中的結構」 - 我認爲這樣做的方式是「data.py應該實現一個單例,所有其他類可以並應該訪問這個唯一的實例「我說錯了嗎?你的意思是在內存sqllite數據庫或其他東西? – 2009-01-01 17:28:58

5

使用Python我有我的每個導入相關 數據文件

你在這裏失蹤的Python語義的微妙的時間點來改造該 陣列。當您第二次導入模塊時,您不會重新執行該模塊中的代碼。該名稱位於所有已導入模塊的列表中,並返回給您相同的模塊。所以第二次導入你的模塊時,你會得到對同一個列表的引用(在Python中,不要說數組,比如列表)。

您可能需要發佈特定的代碼示例以獲得更多幫助,似乎有一些Python混淆的誤解,並且一旦清除了這些誤解,您將擁有更簡單的時間。

+0

我不會稱之爲「微妙」的一點。我會稱之爲「中心」。 – 2009-01-01 21:30:22

3

請不要重新發明輪子。您的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]