2013-11-24 44 views
0

我剛剛完成了教程製作流氓樣的比賽,我對我的方式來實現freatures。多個文件相互依賴處理 - Python的

問題是,整個遊戲是具有1K +線的單個文件。

正如你可以看到:

http://roguebasin.roguelikedevelopment.org/index.php?title=Complete_Roguelike_Tutorial,_using_python%2Blibtcod,_part_13_code

我想將它劃分在不同的文件/文件夾來處理器具better.Maybe的遊戲像圖/播放/籌備的各個方面的文件/項目...但至少分爲類/函數/主。

的問題是,當我把這個在Main.py:

from Classes import * 
from Functions import * 

我得到

NameError: name 'libtcod' is not defined 

這是主要使用的模塊。 然後我試圖導入Main.py在Classes.py和Functions.py

,並獲得

NameError: global name 'MAP_WIDTH' is not defined 

地圖寬度是一個全局變量在Main.py

我也試着導入整個Main.py在Classes.py和Functions.py

,但我得到:

NameError: name 'Fighter' is not defined 

戰鬥機裏面Classes.py

一類

誰能幫我排序了這一點,所以我就可以開始實施freatures。

編輯:一個簡單的例子是:

Main.py

from Functions import * 
def plus_one(ab): 
    return ab +1 

a = 1 
b = 2 
c = add_things() 
print plus_one(c) 

Functions.py

from Main import * 
def add_things(): 
    global a,b 
    return a + b 

這是一個簡單的例子,但在該項目就得到了很多的相互類/函數和主文件之間的依賴關係。

+0

如果您在Classes.py或Functions.py中使用libtcod,那麼您需要將它導入到這些模塊中,就像您當前將其導入到Main.py中一樣。 –

+0

我做了,我得到了一個班的NameError。 –

+0

我的建議是你讀了一本書/用Python做面向對象編程的教程。例如,Beginning Python:從新手到專業by Magnus Lie Hetland是一個好的開始。 –

回答

0

有你的代碼和你的計劃程序架構的許多問題。請閱讀我對你的文章的評論。你需要提高你對面向對象編程的知識。

首先,強烈建議千萬不要用from Classes import *。你應該使用import Classes。然後,要從模塊訪問函數或常量,可以使用Classes.function_name或Classes.constant。請參閱有關如何在Python中正確導入更多的信息:http://effbot.org/zone/import-confusion.htm

其次,在Python不建議全局變量。但是如果你確實需要它們,你需要記住,在python中,global variable意味着全局到模塊,而不是整個程序。 Python中的全局變量是一個奇怪的野獸。如果您需要讀取全局變量,則不需要任何特殊的東西。但是,如果要從函數內修改全局變量,則必須使用關鍵字global

第三,你在做什麼叫做圓形依賴。模塊A,導入模塊B和模塊B導入模塊A.您可以在第三個模塊C中定義共享函數,類等。然後A和B都可以導入模塊C.您還可以在模塊C中定義常量,如MAP_WIDTH,以及如果您有import C,請使用C.MAP_WIDTH從A或B訪問它們。

+0

哦,我明白了,感謝您的信息......我對Python和編程一般來說還很新。 我提供的代碼不是我的,它來自教程。我不會使用這麼多全局變量,因爲我已經被告知它並不是建議的。 我想過要製作第四個文件來保存所有全局變量以便從其他變量中訪問3? 我會檢查你提到的那本書。 –