利用Python進行遊戲腳本編程,不愧是最強的腳本語言!

2021-03-02 python

使用腳本語言可以更加快速地開發遊戲邏輯,而不必擔心由於 C++ 程式設計師的粗心大意所造成的後果。使用已有的腳本語言可以節省開發新型自定義語言的時間和開銷,並且這些語言通常要比自己創造的語言更加的強大。

當然小編這裡有一份Python學習資料,加小編QQ群:696541369即可免費領取!

Python 對於遊戲腳本語言來說是一種不錯的選擇,它很強大,容易嵌入使用,能夠無縫地使用 C/C++ 進行擴展,包含很多腳本語言所具有的高級特性,並且它可以用來實現自動化過程[TR1: automating production]。另外,關於 Python 的書籍、開發工具 和 庫 很豐富,使得我們很容易從其他開發者那裡受益。

下來就談一談我們在 Humongous 娛樂公司將 Python 集成進新遊戲引擎的一些經驗。說明我們選擇 Python 的原因、獲得的收益、遇到的問題,以及我們是怎樣解決它們的。

為什麼要使用腳本語言

C++ 是一種強大的語言,並且是 C 語言的巨大改進,但它並不是完成所有任務的最佳選擇。C++ 非常強調運行時性能 [Stroustrup94],譬如,假如一個語言特性使得程序跑起來變慢,那麼這個特性便不會加入 C++ 語言中。C++ 程式設計師也因此背負了很多的限制和煩惱。

這裡列出一些限制,C++ 程式設計師經常遭遇這些事情但很少注意它們的存在:

手工管理內存:C++ 程式設計師的大量時間都花在考慮調用 delete 的適當時機。

連結過程:C++ 模塊(在編譯時或加載時)連結在一起,因此在運行時,無需進行的函數地址的解析。這提高了運行時的性能,但是卻使 編輯/測試 周期變長了。

缺乏自省能力 [TR2: introspection]:C++ 有自己的方式知道一個類中包含哪些成員,但是這種方式需要編寫過多的加載和存儲對象的代碼,而在一些腳本語言中這只需調用一個內建函數就可以完成。

C++ 是靜態的,而腳本語言是動態的。簡單地說,C++ 的程序運行地很快,但是腳本語言能讓你編碼更快。

所以,C++ 應該只用在你希望優化運行時性能的地方。現在計算機的運行速度都足夠快,對於大多數代碼來說性能都不是問題。如果你用 C++ 開發那些用腳本語言也能實現的程序,那麼你是在錯誤的事情上進行優化。

SCUMM 的問題

Humongous 公司已經使用 SCUMM (Script Creation Utility for Maniac Mansion) 創造了 50 多個遊戲。SCUMM 是一個強大的 冒險遊戲 開發語言,但是它有一些局限性。SCUMM 是十多年前寫的,它缺少一些現代語言的特性。

儘管 SCUMM 有持續的補丁和維護,它也沒有辦法像其它語言一樣健壯和有完備的功能了。

為什麼選擇 Python

我們有過創造一種新型的、現代的 私有語言的想法,但最終明智地放棄了這種想法。我們的職責是在做遊戲,而不語言。

我們在每年花費大量開銷維護一套私有工具的情況下,確實希望使用一種已有的腳本語言而不是重新創造一種。使用已有語言更快地投入工作,花費更少的開銷,並且通常情況下要比我們創造的好,並且以後會發展地更好,即使我們不用它工作。

一旦我們決定要使用已有的腳本語言,就需要從中選擇一種。我們需要一種支持 面向對象編程,並且能嵌入到我們遊戲中的語言,而且它不存在任何技術和許可授權上的問題。

我們考慮了 Lua [Lua01] 和 Python [Python02],這兩種語言已經被應用在某些遊戲中了。

Lua 較小,更加容易嵌入到應用程式中,並且有一些很棒的語言結構。但是,那時我們發覺 Lua 的文檔有些粗略,這大概是因為 Lua 是比 Python 更新的語言。

Python 比 Lua 有更多的擴展模塊,更多的參考書籍,並且 stackless Python [Tismer01] 很適合為對象 AI 創建微線程[TR3: micro-threads]。最後我們沒有選擇 Python 的 stackless 版本,但開始用 Python 寫自動生成腳本,這給了我們繼續使用 Python 的動力。當了解了 Python 後,我們喜歡上了它的語法,最後選擇了它。

在我們決定之後,這兩種語言都發生了改進:Lua 已經變成 stackless,而 Python 有了生成器,這個能提供一些相似的功能。現在任何一種都是安全的選擇。

誰在遊戲中使用了 Python

Python 已經被使用在很多遊戲中,包括:

ToonTown - http://www.toontown.com/

EveOnline - http://www.eve-online.com/

Blade of Darkness - http://www.codemastersusa.com/blade/

還有很多其它的遊戲,只是我們很難確認,例如至少有一個 PS2 遊戲使用了 Python。

同時 Python 也至少用在兩個遊戲引擎中:

一個生成腳本示例

下面是一段 Python 代碼示例,它是一個遞歸生成所有 VC++ 工作區的簡單生成腳本。它只有以下幾行:

源碼列印?

加上更多的代碼,可以讓這個腳本 [Dawson02] 分析輸出結果,然後給團隊中的每個人發送一份結果報告郵件。不像某些其它腳本語言,上面代碼有很好的可讀性。使用 Python 來寫生成腳本和遊戲腳本將會省卻很多學習的時間。

這個生成腳本示例也顯示了一些對 Python 新手很頭疼的問題。Python 的流程控制由縮進指明,而不使用 begin/end 聲明或大括號。

我用了很短的時間來適應這種規則,最後我發現這種規則很有效。我曾經不止一次討論過 C/C++ 中的大括號應該寫在哪裡,我想 Python 程式設計師有更高的工作效率,因為他們不用花費時間爭論 K&R 及其它縮進風格[TR4: indenting style] 的事情。因為代碼塊由縮進定義,編寫時便不會出現任何不符合 Python 編譯器規則的縮進(因為那樣的話,程序就會出錯)。

要注意的是,當你混用 TAB 和空格進行縮進時,可能出現問題。大多數程式設計師使用寬度為 3 個或 4 個空格的 TAB 縮進,但是在 Python 編譯器內部卻使用 8 個空格的縮進,混合使用 TAB 和空格可能導致語法錯誤。如果你完全地使用空格或 TAB 進行縮進,並且使用一個能夠提示混用空格、TAB 縮進警告的 IDE,那麼便沒有什麼問題。

遊戲腳本示例

下面的示例是我們的第一個 Python/C++ 遊戲中的一些 Python 代碼。這些代碼是 Python 正在執行的一個主循環,它調用了其它的模塊,這些模塊甚至可以用其它語言編寫:

源碼列印?

因此,我們的遊戲由 Python 啟動,並在需要時調用 C++ 程序。

它是如何工作的

Python 程序由模塊組成,當在一個源文件中使用另一個源文件中定義的函數時,需要導入那個文件。例如,gameai.py 有一個 UpdateAI 函數,那麼在其它 Python 源文件中可以這樣調用它:

源碼列印?

遊戲程式設計師能夠想到的一個很棒的事情是,如果 UpdateAI() 跑起來很慢,那麼可以用 C++ 來重寫它。為了做到這點,在 gameai.py 中的函數和類型需要用 C++ 實現,並且在 Python 中註冊為原先的模塊名。之後,使用者能夠繼續導入並使用 gameai 模塊,而不需要任何更改。

因此,Python 模塊能夠幫你簡單地用 Python 搭建你的整個遊戲框架,而在適當的地方用 C++ 代碼實現。

粘合代碼 (Glue Code)

如果你自己手工編寫讓 C++ 代碼和 Python 協同工作的粘合代碼,那將是一件枯燥繁瑣的事情 [TR5: glue code]。一個能夠產生粘合代碼的系統框架是很重要的。

Swig, Boost, CXX 等 [Abrahams01] 能幫你產生代碼,更方便地將 Python 和 C++ 粘合起來。還有 Fubi[Bilas01],它是一個通用的框架,可以將 C++ 的函數和類映射到一種腳本語言中。

早期,大多數這些粘合代碼框架都依靠分析 C++ 頭文件工作。因此,它們受到暴露的 C++ 頭文件的限制,並且一些框架不支持從 C++ 類派生出 Python 類。後來,這些框架都有所改進,所以現在還是值得考慮的。

而我們決定做一個自己的方案,它可以根據類的 IDL 描述或導出函數來生成粘合代碼。它的代碼叫做 Yaga,是一個遞歸命名法,表示 Yaga is A Game Architecture。

一個典型的 Yaga IDL 代碼如下:

它可以生成以下粘合代碼,還有其它一些代碼:

源碼列印?

使用這個框架可以很簡單地導出類和函數,從 C++ 類派生 Python 類,將 C++ 的數組和 vector 映射為 Python 的序列類型,以及更多的事。

內存分配

Python 之中任何東西都是對象,對象被分配內存。因為所有的對象都有引用計數,所有你不用擔心釋放內存。但是,如果你是在編寫遊戲,尤其是控制臺遊戲(譯註:指次時代及專用遊戲機平臺遊戲),你必需要明白這些內存從何處分配而來,以及分配過程會產生內存碎片的嚴重性。

為了控制這個性能問題,你需要隔離 Python,使其有自己的內存分配場。你需要重定向所有的內存分配操作到一個自定義的分配器上,它從一個固定大小的分配場中分配內存。只要你預留足夠大小的緩衝區,大於最大的 Python 歷史分配額度(原文:leave enough of a buffer above the maximum Python memory footprint),應該就能避免內存碎片問題。

另一個內存問題是沒有釋放的塊。這通常在 Python 中不是問題,因為每個對象都有引用計數,當變量離開作用域或者被顯式刪除,其引用計數就會減一,當計數為 0 時,對象就被釋放,對象生命結束。

試想這樣情況,一個被忘記的變量,它關聯了一串其它的對象,這時就會阻礙這些對象的釋放,所以你應該對清理對象保持警惕。然而,更糟糕的事情是循環引用問題,例如:對象 A 包含對象 B,但是對象 B 有一個回調指針指向對象 A,那麼這兩個對象永遠都不會被刪除。Python 的開發者們意識到這個問題,在最近的 Python 版本中加入了一個垃圾收集器,它搜尋無法訪問到達的對象,並將其全部清除。

垃圾收集器對於遊戲是很糟的,因為無法預知它們的運行時間,並且可能運行很長時間,使得畫面的幀率降低。因此,遊戲程序中需要禁用垃圾收集器,這個做起來很簡單,隨後在每個遊戲關卡後顯式地調用它。垃圾收集器同時也能告訴你 有多少無法訪問到達的對象仍然在分配中,這個可以幫助你跟蹤循環引用的情況,之後你可以手工地解決它們,這相當於 Python 的內存洩露檢查。

性能

如果你用 Python 做一些繁重的浮點計算工作,和 C++ 的性能相比會很讓人失望。Python 是一個慢語言,每個對象引用都意味著進行哈希表查詢,每個函數調用也一樣。這根本不能和 C++ 的性能相提並論,後者的變量位置和函數調用地址在編譯時就決定了。

但這並不意味著 Python 不適合做遊戲編程,而是你需要在適當的地點用它。如果拿字符串操作或 C++ STL 的 set 和 map 類型操作做對比,那麼 Python 代碼也許會做地更快。Python 的字符串操作函數是用 C 寫的,並且 Python 的引用計數對象模型能夠避免一些 C++ string 類的字符串複製過程。set 和 map 的大多數操作的複雜度是 O(log n),而對於 Python 的哈希表複雜度則是 O(1)。

你一定想,最好不要用 Python 寫 場景圖形遍歷 或 BSP 衝突檢測代碼。但是如果你用 C++ 寫它們,而後又導出到 Python 中使用,那麼你就可以更快地編寫 AI 代碼。

請牢記 90/10 原則,這意味著對於 90% 的代碼,你不必過多操心它們的運行時性能,而代碼的明確表達力和編碼的效率才是關鍵。

控制臺遊戲

內存和性能問題在控制臺遊戲平臺上尤其重要。當不存在虛擬內存可以讓你漫不經心做內存分配的時候,保證在獨立的內存分配場中分配 Python 內存就顯得格外重要。同時,也要更明智地使用垃圾收集器 (as is using the garbage collector wisely)。

控制臺平臺沒有鍵盤、滑鼠和多顯示器,所以在控制臺平臺上運行 Python 調試器用起來很不方便。遠程調試是關鍵,它能讓你知道 Python 代碼的運行過程。很幸運,使用免費的 HapDebugger[Josephson02] 可以很容易建立遠程調試環境。

Python 使用 C 編寫,並且已經被移植到多種編譯環境和平臺下,包括 PDA。因此,在某個控制臺遊戲平臺下 Python 可能已經有了很充分的發展。

Python 會花費掉一小部分和控制臺遊戲無關的內存,但是在新一代遊戲平臺上可以不用擔心這個,它們最小都有 24M 內存。

法律問題

推向一種新的語言對於我們公司來說是個重大的決定,我覺得在進行之前,它定是受到了公司律師們的祝福。

律師懂得法律,但他們通常不太懂編程。大多數程式設計師在引入開原始碼前都不會諮詢公司的律師,當你確實問他們時,他們會認為你正在問一些奇怪且偏僻的事情。他們的立即反應是,認為那是有風險、沒有保證的計劃。

如果你和一個擅長智慧財產權的律師長談,他會一直向你灌輸「使用開源軟體會讓你焦頭爛額」的思想。有一些案例指明,在「免費發布」的源碼中包含專利或有版權的內容時,有嚴重的法律問題隱患。當你從商業軟體供應商那裡得到授權代碼時,他們會保護你免受法律責任,但對於開源軟體沒有人能給予授權許可 (with open source software there is no one to license it from)。

然而,開源社區對智慧財產權法律總是很警惕。例如 JPEG 已經從它們的開發庫中移除了 LZW 算法代碼以避免專利問題 [IJG]。負責的程式設計師會關心授權許可問題,並且通常對 GPL 和 LPGL[FSF01] 以及他們的區別很熟悉。

將開原始碼引入商業產品存在很多風險。這些風險應嚴肅對待,但不應該阻止對開原始碼的使用。有很多開源的開發庫使用在遊戲開發中,Python 實在沒什麼理由不被使用。

缺點

多語言開發增加了額外的複雜層次。同時調試兩種語言的代碼很困難,而且必須花費時間維護綁定兩種語言的粘合代碼。

類似 Python 的動態語言沒有編譯時類型檢查。這種情況初看讓人驚恐,但它的實際意味著,相比 C++ 你會遇到各式各樣不同的運行時錯誤,通常它們都很容易解決。

不同類型的換行符

UNIX (LF)、Mac OS (CR) 和 Windows (CR LF) 對待文本文件中一行的結束有不同的約定,這實在很糟。

Windows 上的 C/C++ 庫(譯註:指 Windows API 和 VC 運行時庫)會做換行符轉換,所以 UNIX 文件能夠在 Windows 上讀取,可以將 Windows 文件像 UNIX 文件一樣的操作。UNIX 和 Macintosh 文本文件之間的共同點更少,只能依靠假定某個平臺上的文件都只是這個平臺上曾經創建的,這個假設進行轉換。這個假設在當今的網絡環境下站不住腳,Python 也深受其害。直到現在,在 Windows 下寫的 Python 代碼可能無法在 Macintosh 下編譯,反之亦然。

這個問題的解決方法是,在運行 Python 代碼前,將 Python 源文件通過一個文件過濾器(可以用 Python 開發?)執行,另一種方法是以編譯後的字節碼形式發布 Python 代碼。但是,這兩種辦法都有缺點。最理想的是在計算機工業中標準化文本文件格式,或者讓所有的文件 IO 庫實現讀取任意類型文本文件的能力。

這個問題在蘋果的 OS X 上更加有趣,換行符由運行程序的模式而定,你可以運行 UNIX 或 Macintosh 兩種模式程序。這會在一個系統下出現兩種不同的換行符,甚至不用重啟。

Python 的 Macintosh 版本最近修正了這個問題,在打開文件時檢查換行符並對每個文件進行調整。將所有的換行符都規定為 UNIX 類型是一種可行的方法,它在所有平臺下都能工作,但是還是要留心這個問題。

調試器問題

很多 Python 程式設計師認為自動化測試和列印語句是他們唯一需要的調試工具,而使用調試器會影響編碼的產能。或許這對他們來說的確如此,但我已經習慣於進行源碼級調試,並且不會輕易放棄它。

PythonWin 是一個在 Windows 下的 Python 調試器兼 IDE(奇特吧?)。它是免費的,有一些不錯的功能,但也有一些缺點,如:只能在 Windows 下運行,無法調試有自身消息循環的 Python 程序。

在 Humongous 娛樂公司,我們為 Macintosh 和 Windows 開發遊戲,同時也涉及控制臺遊戲的開發。我們需要一種能工作在所有三個平臺上的調試器,而最好的方案就是使用遠程調試器。Python 的架構使得編寫它的調試器很容易,再加上其它一些免費組件,我們開發出了自己的 Python 調試器,我覺得它的效果比 PythonWin 好,並且具有遠程調試功能。被調試的客戶端需要運行一些額外代碼。調試接口是 socket 上的 ASCII 文本,另外,我們還沒考慮將調試器客戶端移植到更多其它平臺的問題。

因為我們希望集中精力開發遊戲本身,而不是語言工具,所以決定再次借用開源的力量。我們在 Python 社區發布了 HAP 調試器 (Humongous Addition to Python),將其作為一個開源項目[Josephson02]。這是一個回饋社區的好機會,並且我們也從維護這個調試工具的事務中解放出來。

我們還沒有解決的問題是調試器的性能問題。大多數編譯式語言實現調試斷點的方法是,將常規指令替換為導致 CPU 異常的指令,如 x86 處理器的 int 3 中斷。這讓程序可以全速執行,直到觸發中斷點。Python 不支持從異常處恢復執行,所以不能使用斷點異常的方法。Python 調試器處理斷點的方法是 單步檢查代碼,即不停地在問自己「這一行有沒有斷點?」

這個性能影響的後果可能很嚴重。我們現在減小此影響的方法是,保證開發機器要比目標機器快得多。還有,將所有重量級計算用 C++ 擴展實現,這樣即使 Python 代碼拖慢了調試器,也不至於讓整個遊戲速度太慢。這是一個可以解決的問題,只是 Python 的主要開發者還沒考慮過。

代碼安全和遊戲作弊

C++ 程式設計師有時開玩笑說,刪除注釋和縮短變量名可以優化代碼。然而,在 Python 中確實如此。

Python 代碼在運行時被編譯成字節碼,並緩存起來以備後續運行,所以刪除注釋的方法不會起到優化程序的效果,但是縮短變量名則是另外一回事。大多數腳本語言都是在運行時通過名字定位變量的,這也是腳本語言強大的原因之一,因為它可以突破很多由 C++ 編譯時綁定造成的限制。然而,這也意味著變量名會一直伴隨著代碼而存在(譯註:C/C++ 等傳統編譯式語言則不同,經優化編譯後的 C/C++ 程序中沒有變量名而只有地址的概念)。

遊戲程序中包含語義清晰 (scatological) 的變量名,會被人當做笑談。更嚴重的問題是,如果在多人遊戲中使用 Python 腳本,作弊者反編譯 Python 程序後會得到完整的變量和函數名,這比起通過反編譯 C++ 程序來破解遊戲要更簡單。

Python 的優點

Python 編程很有趣。Python 易於學習,有更高的生產效率,並且促使你使用另一種思維編程。學習 Python 編程讓我成為更好的 C++ 程式設計師。

快樂的程式設計師有更高的學習效率和生產效率,他們傾向創造更好的遊戲。Humongous 公司中使用 Python 開發遊戲的團隊,在整個公司中擁有最高的工作士氣。

Python 遊戲編程系統(譯註:應指開發工具、框架、類庫等)具有很高的生產效率,而且它們仍然在發展之中。因為採用了它們,我們節省了很多資金。(原文:Productivity is higher with the Python game programming system, even though development is still being done on it. It is already clear that we will save a lot of money from this switch.)

用戶界面的開發,在 C++ 中可能花費較長的時間,而在 Python 中可以使用一些新意的方式進行實現。通常使用文本文件定義 GUI 元素的位置和關聯圖形資源,進而定義菜單。在 C++ 中會使用硬編碼的函數和控制項對象,掛鈎 GUI 元素;而在 Python 中,可將函數及對象名放入文本文件中,並在運行時掃描它們。Python 的動態和內省特性 (introspective) 使得做起這些事來很自然。(譯註:C++ 也可使用讀取文本配置方式,自動生成菜單,只是用 Python 的反射特性做起來更自然)

很多起先我們擔憂的 Python 語言限制問題都已成為過去。Python 的開發者們對該語言進行持續地改進,有時他們就像一直在滿足我們對 Python 特性需求的渴望一樣。

遊戲存檔和讀檔

C++ 程式設計師要花費很多時間解決腳本語言中不會出現的困難問題。例如,用 C++ 進行遊戲狀態的存儲和讀取就是一個麻煩問題,經常要編寫大量的代碼。而且這種方法通常會導致,存檔只能和特定版本的遊戲程序配合工作。而在 Python 中,使用 cPickle 模塊可以很方便的解決此問題,它可以存儲和讀取任何複雜的數據結構。

下面例子中聲明了一個對象 mainObject,通常它是一個用戶自定義類對象,包含各種需要存儲的狀態的句柄,但為簡單起見,這裡只把它做成一個列表。最初該列表包含數字 0 和一個字符串,然後將列表的第一個元素賦值為另外一個列表。這個過程可以繼續下去,讓 mainObject 包含任意複雜嵌套層次的對象,包括循環引用。

源碼列印?

接下來保存著這個 mainObject,這需要兩行代碼。一行導入 cPickle 模塊,另一行打開一個文件,將對象保存為二進位格式。在開發時,保存為文本格式很有用,只需省略掉 dump() 的最後一個參數即可。

源碼列印?

然後是裝載文件數據,這同樣需要兩行代碼。一行導入 cPickle 模塊,另一行重建 mainObject 對象,以及包含的子對象、列表、成員變量等。第三行列印出 mainObject 對象,可以看出已經正確地恢復了嵌套的列表。

源碼列印?

這個 Python 特性在 C++ 基本功能中不存在。

生成器:遊戲 AI 的微線程

微線程將對象狀態信息放到局部變量中(這是恰當的位置),從而極大簡化 AI 和對象更新代碼 [Carter01]。可以使用彙編語言的技巧將微線程放進 C++ 中,但是那樣很凌亂。在最近版本的 Python 中,微線程內建於語言之中。現在使用微線程會工作地很好。

在 Python 中它們叫做生成器 (generator),使用它們編寫函數,函數產生某個結果後,控制返回到主程序。主程序稍後可以重新喚醒它們,並從中斷處繼續運行,並保持原來的局部變量值。下面的示例代碼展示創建一個對象,並移動它們穿過屏幕。這個簡單例子並不能從微線程/生成器中得到實際的好處,它只是基本展示它們怎樣用來簡化 AI 和對象更新代碼。

源碼列印?

即使你不使用生成器,在 Python 中實現 AI 更新方法也比用 C++ 更乾淨。因為如果你的某部分 AI 代碼需要一些額外的臨時狀態時,Python 可以將它加入到對象中,然後在不需要時刪除它。而 C++ 因其靜態特點,不能在運行時加入新的成員變量,這使你的對象在任何時候都必須包含所需的所有狀態。

開始使用 Python

如果你開始使用 Python,第一件事是訪問 Python 的官方網站 http://www.python.org/ 下載你的平臺上的 Python 版本。

Python 文檔在 http://www.python.org/doc/current/download.html,也有編譯的 HTML 版本 (CHM) 更便於檢索。

Windows 開發者可以使用 PythonWin 和各種 Win32 擴展http://users.bigpond.net.au/mhammond/win32all-142.exe

調試器 HapDebugger https://sourceforge.net/projects/hapdebugger/

你可以下載並編譯 Python 源碼,構建自己的 Debug 和 Release 版 Python。Python 2.2 源碼下載ftp://ftp.python.org/pub/python/2.2/Python-2.2.tgz

最後,你可以閱讀關於手工創建 Python 擴展的細節http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/66509,然後選擇一種粘合代碼包來幫你做這些事情,參考http://www.boost.org/libs/python/doc/comparisons.html

參考

[Stroustrup94] Stroustrup, Bjarne "The Design and Evolution of C++", Addison Wesley, 115

[Lua01] "The Programming Language Lua"

http://www.lua.org/

[Python02] Python Language Website

http://www.python.org/

[Tismer01] Tismer, Christian "Stackless Python"

http://www.stackless.com/

[Dawson02] Dawson, Bruce "Python Scripts"

ftp://ftp.cygnus-software.com/pub/pythonscripts.zip

[Abrahams01] Abrahams, David, "Comparisons with Other Systems"

http://www.boost.org/libs/python/doc/comparisons.html

[Bilas01] Bilas, Scott, "FuBi: Automatic Function Exporting for Scripting and Networking"

http://www.gdconf.com/archives/proceedings/2001/bilas.doc

[IJG] http://www.ijg.org/ - docsREADME in the source distribution

[FSF01] "What is Copyleft?"

http://www.gnu.org/copyleft/

[Josephson02] Josephson, Neal "HAP Python Remote Debugger"

http://sourceforge.net/projects/hapdebugger/

[Carter01] Carter, Simon "Managing AI with Micro-Threads", Game Programming Gems II, Charles River Media, 265-272

相關焦點

  • 基於Python腳本的R語言的函數
    本文介紹了採用創建一個Python腳本,用該腳本模仿R風格的函數的方法來方便地進行統計。 是用R語言還是用Python語言?這是一個曠日持久的爭論。在此,我們可以嘗試採用折中路線:創建一個Python腳本,用該腳本模仿R風格的函數,來方便地進行統計!
  • 什麼是腳本語言,你用過哪些腳本語言
    本文轉載自【微信公眾號:手機電腦雙黑客,ID:heikestudio】經微信公眾號授權轉載,如需轉載與原文作者聯繫腳本語言又被稱為擴建的語言,或者動態語言,是一種程式語言,用來控制軟體應用程式,腳本通常以文本(如Python)保存,只在被調用時進行解釋或編譯。
  • Linux 平臺下 Python 腳本編程入門(一)
    眾所周知,系統管理員需要精通一門腳本語言,而且招聘機構列出的職位需求上也會這麼寫。
  • 用Python DB-API開發MySQL腳本
    【IT168 技術文檔】本文將向讀者詳細介紹如何利用DB-API模塊方便地開發MySQL腳本。我們首先介紹了有關軟體的安裝方法,隨後分別用兩個實例對DB-API模塊做了深入的介紹,最後討論了用Python DB-API編寫的MySQL腳本的移植注意事項。
  • 一次使用 Go 語言編寫腳本的經歷
    本文介紹了我如何嘗試使用 Go 語言進行腳本編程的經歷。文中我將討論 Go 腳本的必要性,我們預期的表現以及可能的實現方式。在討論過程中,我講深入探討腳本、Shell 和 Shebang。最終,我們將會討論讓 Go 腳本工作的解決方案。為什麼 Go 語言適合編寫腳本?
  • Python 的一個腳本錯誤可能會廢掉 150 多個項目!
    以下為譯文:最近,一組用於計算分析的Python腳本中的一個編程錯誤可能會導致150篇已發表的化學研究論文作廢。夏威夷大學在最近發表的一篇研究論文中揭示了這個名為Willoughby-Hoye腳本中的一處編程錯誤。
  • Maya藝術家的Python腳本
    測試是以maya2020中的python為主的。介紹該教程面向沒有腳本或編程經驗的學生。在教程結束之前,您將具備在Maya內外編寫和運行Python腳本的知識。您不會從本教程上學習有關Python的所有知識。該教程會包括您應該掌握的所有基本信息,以精通閱讀,編寫,運行和修改Python腳本。
  • python將腳本與交互模式結合
    您將需要使包含名為 python.exe 的文件的目錄 永久或臨時 地列在 名為 path的 系統環境變量中 。如果您已經知道如何設置路徑,並且想對路徑進行永久更改,請繼續進行。如果您還不知道如何操作,則可能需要獲得一些幫助。
  • Python腳本計算RDF
    徑向分布函數rdf計算方法和程序在做化學鍵分析時經常會用到徑向分布函數RDF,為了省事,寫了個Python腳本快速計算出相應原子或離子的RDF。文獻中經常見到原子的徑向分布函數圖,是如何畫出的呢?本文將進行簡要介紹。圖片來源於Inorg. Chem. 2016, 55, 9, 4616-4625.
  • Python 腳本案例:為流域插值雨量計
    我們不僅更新完善了諸多功能,最重要的是加入了Python 腳本。什麼是Python?Python是一種解釋型腳本語言。作為全球公認的「膠水語言」,擁有強大的第三方庫,可以將其他語言製作的各種模塊輕鬆連接到一起。Python自誕生之日起,便有類、函數、異常處理,並且可以調用很多C語言庫文件。隨著人工智慧大數據的快速發展,Python一路綠燈,備受關注。
  • Java、Python、C語言?5大熱門程式語言,我該怎麼選?
    一提到編程,大家就會想到一堆莫名其妙的縮寫,比如C、C++、JAVA、VB、VC、FoxPro、Delphi、SQL、PHP、ASP、JSP等等,那麼程式語言究竟多少種呢?主要是以縮寫英文作為標符進行編寫的,但彙編語言在程序方面較為冗長,所以具有較高的出錯率。這種語言主要是利用二進位編碼進行指令的發送,能夠被計算機快速地識別,其靈活性相對較高,且執行速度較為可觀。
  • 如何用python寫遊戲腳本?
    前言最近在玩兒公主連結,之前也玩兒過陰陽師這樣的遊戲,這樣的遊戲都會有個初始號這樣的東西,或者說是可以肝的東西。
  • Python 或將取代 VBA 成為 Excel 官方腳本語言
    近日,據國外媒體 BLEEPINGCOMPUTER 報導,微軟正考慮添加 Python 為官方的一種 Excel 腳本語言,如果獲得批准,Excel 用戶將能夠像目前使用 VBA 腳本一樣,使用 Python 腳本與 Excel 文檔、數據以及一些 Excel 核心函數進行交互。 VBA vs.
  • 《零基礎學按鍵精靈》遊戲宅腳本製作秘籍
    在國內眾多的軟體腳本編程工具中,「按鍵精靈」在簡易編程領域,可算是翹楚。  軟體支持動作錄製功能,可以讓不懂編程的用戶輕鬆做出模擬鍵盤滑鼠動作的軟體,實現遊戲自動打怪等功能。只要在電腦前用雙手可以完成的動作,按鍵精靈都可替你完成。
  • 舊文|什麼是「腳本語言」
    很多人都會用一些「腳本語言」(scripting language),卻很少有人真正的知道到底什麼是腳本語言。其實程式語言只是程式設計師用來表達思想的工具,本就沒有本質意義上的區別。他們的區別就在於表現形式上的不同。
  • Pyinstaller 打包Python腳本踩坑之旅
    Pyinstaller 打包Python腳本踩坑之旅 前言:眾所周知,python是一門強大的膠水語言,尤其憑藉其豐富的第三方庫近些年來十分火熱
  • 用python寫遊戲腳本原來這麼簡單
    ,這樣的遊戲都會有個初始號這樣的東西,或者說是可以肝的東西。遊戲腳本其實並不高深,最簡單的體驗方法就是下載一個Airtest了,直接截幾個圖片,寫幾層代碼,就可以按照自己的邏輯玩兒遊戲了。當然,本篇文章不是要講Airtest這個怎麼用,而是用原始的python+opencv來實現上面的操作。這兩天我寫了一個公主連結刷初始號的程序,也不能算寫遊戲腳本的老手,這篇文章主要是分享一些基礎的技術和使用上的心得吧。
  • 初探Groovy——無縫兼容Java的腳本語言
    那麼,有沒有什麼辦法能讓計算機幫我進行這些操作呢?我自然而然地想到了各式各樣的腳本語言。相較於我自己在WEB端上點擊滑鼠,利用腳本來直接調用WEB端的Java接口才是上策。Groovy語言就是在這種情況下進入我的視野的。Groovy是一門基於JVM的腳本語言。它在兼容Java語法的同時,借鑑了Ruby、Python等語言的特性,有自己一套簡潔而靈活的語法。
  • 寫 Python 腳本時,一定要加上這個
    我發現有不少朋友寫 Python 腳本非常隨意,要麼不用函數,要麼函數隨處定義,反正第一眼看不出要執行的第一行代碼位於何處,這樣的腳本可讀性很差,而且容易隱藏 bug,解決這個問題很簡單,當我們寫 Python 腳本時,一定要加上這個:def main():    # do
  • 腳本的作用
    腳本是一種根據格式編寫的語言,又成為可擴展性語言,有時被當成程式語言,用來編寫可執行文件。但是,腳本語言內涵豐富,並非應用在計算機領域。說評書的、唱戲的都需要腳本,演電影的也需要腳本,警方審問犯人的時候需要腳本,甚至騙子們也需要腳本。那麼,腳本到底起了怎樣的作用?