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