簡體   English   中英

我不得不幫助我理解我做錯了(Python,再次)

[英]I can't but help get the idea I'm doing it all wrong (Python, again)

我最近問過的關於Python的所有問題都是針對這個項目的。 我已經意識到我問這么多問題的原因可能不是因為我對Python這么新(但我知道很多PHP)並且可能不是因為Python有一些固有的缺陷。

因此,我現在將說明項目是什么以及我目前的想法是什么,你可以告訴我,我做錯了,我需要學習一些東西,或者Python根本不適合處理這種類型在這種情況下,項目和語言XYZ會更好,甚至可能還有一些我想參與的開源項目。

該項目
我運行一個基於免費轉彎的策略游戲(從整個戰爭系列中考慮戰役模式,但具有更多的復雜性和深度)並且正在為它創建一個戰斗模擬器(再次,將全面戰爭視為它是如何工作的一個想法) 。 我完全沒有被認為我會做出與單純的戰爭游戲一樣好的東西,但我確實認為我可以自動化我目前手工制作的過程。

它會做什么
它必須考慮到單位,設備,訓練,天氣,地形等的大量變量等。 我知道這是一項艱巨的任務,我打算在空閑時間一次做一件事。 我沒有預算,但是我已經准備好把時間投入(並且已經)了。

我目前的絆腳石
在PHP中,一切都可以訪問其他所有內容,“錯誤”雖然有些人可能會認為這對它來說非常方便。 如果我有一系列設備供單位使用,我可以從任何地方獲取該陣列。 使用Python我每次導入相關數據文件時都必須重新創建該數組,對於一種經驗深思熟慮的語言來說,這似乎是一個非常愚蠢的解決方案。 我已經建立了一個記錄函數調用和類創建的系統(因為我從PHP的一個非常基本的版本中知道它曾經在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個月與3年的PHP相比)。

使用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]

“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模塊。

    一種。 import theLoggerThing 不管這是什么。

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

    C。 def createFormations( logger ): 創建一個函數createFormations

    d。 formations = 創建一個對象, formations

  2. import someOtherModule someOtherModule已導入。

    一種。 import data 什么都沒發生。 data已在全球范圍內提供 這是對 - 有效 - 單身人士的參考 所有Python模塊都是單例

    def function 創建一個功能function

  3. print data.formations['Arrowhead'] 評估data.formations ,它是一個字典對象。 在字典上做一個get('Arrowhead')做一些神奇的查找並返回那里找到的對象( Formation一個實例)。

  4. someOtherModule.function()

    在此功能評估期間會發生什么。

    一種。 print data.formations['Tight'] 評估data.formations ,它是一個字典對象。 在字典上做一個get('Tight')做一些神奇的查找並返回那里找到的對象(一個Formation的實例)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM