為什么說Python和Pygame最適合編程初學者?
我們有三個理由來說明 Pygame 對初學編程者是最好的選擇。
上個月,Scott Nesbitt 發(fā)表了一篇標題為 Mozilla 支出 50 萬美元來支持開源項目的文章。其中一個基于 HTML/JavaScript 的游戲平臺項目 Phaser 獲得了 50,000 美元的獎勵。整整一年里,我都在使用 Phaser 平臺來教我的小女兒,用來學習的話,它是最簡單也是最好的 HTML 游戲開發(fā)平臺。然而,對于初學者來說,使用 Pygame 也許效果更好。原因如下:
1、 小段代碼塊
Pygame,基于計算機課程中最流行的語言 Python。Python 非常適合用一小段代碼來實現(xiàn)我們的想法,孩子們可以從單個文件和單個代碼塊起開始學習,在掌握函數(shù)(function)或類(class)對象之前,就可以寫出意大利面條似的代碼。 很像手指畫,所想即所得。
以這樣的方式來學習,當編寫的代碼越來越難于管理的時候,孩子們很自然的就會把代碼分解成函數(shù)模塊和類模塊。在學習函數(shù)之前就學習了 Python 語言的語法,學生將掌握基本的編程知識,對了解全局作用域和局部作用域起到更好的作用。
大多數(shù) HTML 游戲在一定程度上會將結(jié)構(gòu)、樣式和編程邏輯分為 HTML、CSS 和 JavaScript,并且需要 CSS 和 HTML 的知識。從長遠來看,雖然拆分更好,但對初學者來說是個障礙。一旦孩子們發(fā)現(xiàn)他們可以用 HTML 和 CSS 快速構(gòu)建網(wǎng)頁,很有可能就會被顏色、字體和圖形的視覺刺激分散注意力。即使僅僅只專注于 JavaScript 代碼,也需要學習基本的文檔結(jié)構(gòu)模型(DOM),以使 JavaScript 代碼能夠嵌入進去。
2、 全局變量更清晰
Python 和 JavaScript 都使用動態(tài)類型變量,這意味著變量只有在賦值才能確定其類型是一個字符串、一個整數(shù)還是一個浮點數(shù),然而在 JavaScript 更容易出錯。類似于類型變量,JavaScript 和 Python 都有全局變量和局部變量之分。Python 中,如果在函數(shù)塊內(nèi)要使用全局變量,就會以 global
關(guān)鍵字區(qū)分出來。
要理解在 Phaser 上教授編程初學者所面臨的挑戰(zhàn)的話,讓我們以基本的制作您的第一個 Phaser 游戲教程為例子,它是由 Alvin Ourrad 和 Richard Davey 開發(fā)制作的。在 JavaScript 中,程序中任何地方都可以訪問的全局變量很難追蹤調(diào)試,常常引起 Bug 且很難解決。因為 Richard 和 Alvin 是專業(yè)程序員,所以在這兒特意使用全局變量以使程序簡潔。
var game = new Phaser.Game(800, 600, Phaser.AUTO, '', { preload: preload, create: create, update: update });
function preload() {
game.load.image('sky', 'assets/sky.png');
}
var player;
var platforms;
function create() {
game.physics.startSystem(Phaser.Physics.ARCADE);
...
在他們的 Phaser 編程手冊 《Interphase》 中,Richard Davey 和 Ilija Melentijevic 解釋說:在很多 Phaser 項目中通常都會使用全局變量,原因是使用它們完成任務更容易、更快捷。
“如果您開發(fā)過游戲,只要代碼量到一定規(guī)模,那么(使用全局變量)這種做法會使您陷入困境的,可是我們?yōu)槭裁催€要這樣做?原因很簡單,僅僅只是要使我們的 Phaser 項目容易完成,更簡單而已。”
針對一個 Phaser 應用程序,雖然可以使用局部變量和拆分代碼塊來達到關(guān)注點隔離這些手段來重構(gòu)代碼,但要使第一次學習編程的小孩能理解,顯然很有難度的。
如果您想教你的孩子學習 JavaScript,或者如果他們已經(jīng)知道怎樣使用像 Python 來編程的話,有個好的 Phaser 課程推薦: 完整的手機游戲開發(fā)課程,是由 Pablo Farias Navarro 開發(fā)制作的。雖然標題看著是移動游戲,但實際是關(guān)于 JavaScript 和 Phaser 的。JavaScript 和 Phaser 移動應用開發(fā)已經(jīng)轉(zhuǎn)移到 PhoneGap 話題去了。
3、 Pygame 無依賴要求
由于 Python Wheels 的出現(xiàn),Pygame 超級容易安裝。在 Fedora/Red Hat 系統(tǒng)下也可使用 yum
包管理器來安裝:
sudo yum install python3-pygame
更多信息請參考官網(wǎng) Pygame 安裝說明文檔。
相比來說,雖然 Phaser 本身更容易安裝,但需要掌握更多的知識。前面提到的,學生需要在 HTML 文檔中組裝他們的 JavaScript 代碼,同時還需要些 CSS。除了這三種語言(HTML、CSS、JavaScript),還需要使用火狐或谷歌開發(fā)工具和編輯器。JavaScript 最常用的編輯器有 Sublime、Atom、VS Code(按使用多少排序)等。
由于瀏覽器同源策略的原因,如果您直接在瀏覽器中打開 HTML 文件的話,Phaser 應用是不會運行的。您必須運行 Web 服務,并通過服務訪問這些文件。還好,對于大多數(shù)工程項目,可以不用在本地運行 Apache 服務,只需要運行一些輕量級的服務就可以,比如 httpster。
Phaser 和 JavaScript 的優(yōu)勢
JavaScript 和 Phaser 有著種種的不好,為什么我還繼續(xù)教授他們?老實說,我考慮了很長一段時間,我在擔心著學生學習變量申明提升和變量作用域的揪心。我開發(fā)出基于 Pygame 和 Python 的課程,隨后也開發(fā)出一濤基于 Phaser 的。最終,我決定使用 Pablo 預先制定的課程作為起點。
我轉(zhuǎn)用 JavaScript 有兩個原因。首先,JavaScript 已經(jīng)成為正式應用的正式語言。除了 Web 應用外,也可使用于移動和服務應用方面。JavaScript 無處不在,其廣泛應用于孩子們每天都能看到的應用中。如果他們的朋友使用 Javascript 來編程,他們很可能也會受影響而使用之。正如我看到了 JavaScript 背后的動力,所以深入研究了可編譯成 JavaScript 的替代語言,主要是 Dart 和 TypeScript 兩種。雖然我不介意額外的轉(zhuǎn)換步驟,但還是最喜歡 JavaScript。
最后,我選擇使用 Phaser 和 JavaScript 的組合,是因為我意識到上面那些問題在 JavaScript 可以被解決,僅僅只是一些工作量而已。高質(zhì)量的調(diào)試工具和一些大牛們的工作使得 JavaScript 成為教育孩子編碼的可用和有用的語言。
最后話題: Python 對壘 JavaScript
當家長問我使用的什么語言作為孩子的入門語言時,我會立即推薦 Python 和 Pygame。因為有成千上萬的課程可選,而且大多數(shù)都是免費的。我為我的兒子選擇了 Al Sweigart 的 使用 Python 和 Pygame 開發(fā)游戲 課程,同時也在使用 Allen B. Downey 的 Python 編程思想:如何像計算機科學家一樣思考。在 Android 手機上可以使用 Tom Rothame 的 PAPT Pyame 來安裝 Pygame 游戲。
盡管有我的建議, 我總是懷疑孩子們很快就會搬到 JavaScript。這沒關(guān)系 —— JavaScript 是一門成熟的編程語言,有很多很多輔助工具。但有多年的幫助大兒子使用 Python 創(chuàng)建炫酷游戲經(jīng)歷的我,依然鐘情于 Python 和 Pygame。