通過構建一個交互式遊戲來教小孩學習Python

開源工具可以幫助任何人以一種簡單而有趣的方式開始學習Python,那就是製作遊戲。


通過構建一個交互式遊戲來教小孩學習Python


Python已經贏得了最佳初學者編程語言的美譽。但是我們要從哪裡開始呢?


我最喜歡的讓人們對編程感興趣的方法之一就是寫遊戲。


PursuedPyBear(ppb)是一個為教學而優化的遊戲編程庫,我最近用它來教我的孩子們更多關於我最喜歡的編程語言的知識。


Jupyter項目是一個基於瀏覽器的Python控制檯,最初是為數據科學家處理數據而設計的。


我有一個專門設計來教你如何製作一個簡單的互動遊戲的Jupyter Notebook,你可以從這裡下載。為了打開該文件,你需要安裝最新的Jupyter項目——JupyterLab。


先決條件:


  • 運行Python的最新版本(關於Linux、Mac和Windows的說明)
  • 運行Git的最新版本(這裡有說明)


我們將簡要地配置一個虛擬環境,為我們所需的庫創建一個單獨的空間。(你可以在這裡瞭解更多關於虛擬環境如何工作的信息。)


通過構建一個交互式遊戲來教小孩學習Python


最後一條命令應該會在你的默認瀏覽器中以地址http://localhost:8888/lab打開JupyterLab。在左邊的列中選擇dynamic_penguin.ipynb文件,然後我們就可以開始了!


通過構建一個交互式遊戲來教小孩學習Python


將會運行該遊戲的事件循環

Jupyter在內部運行一個事件循環,該循環是一個管理後續異步操作運行的進程。在Jupyter中這個事件循環是asyncio,並且PursuedPyBear也運行了自己的事件循環。


我們可以使用另一個庫Twisted來集成這兩者,就像膠水一樣。這聽起來很複雜,但謝天謝地,這種複雜性隱藏在庫之後,它將為我們完成所有艱苦的工作。


Jupyter中下面的單元格將負責處理集成Twisted與asyncio事件循環的前半部分。


要集成PursuedPyBear 與 Jupyter,__file__ = None 是必需的。


通過構建一個交互式遊戲來教小孩學習Python


接下來,我們需要一個“setup”函數。setup函數是一個常見的術語,用於配置關鍵的遊戲元素。但是,我們的函數將只把遊戲“場景”放在一個全局變量中。你可以把它想象成我們定義了要在上面玩遊戲的桌子。


Jupyter Notebook中下面的單元格將完成該操作。


通過構建一個交互式遊戲來教小孩學習Python


現在,我們需要將PursuedPyBear的事件循環與Twisted集成。我們使用txppb模塊來實現:


通過構建一個交互式遊戲來教小孩學習Python


如果遊戲因為錯誤而崩潰,最後的print將會幫助我們——它將打印出對Jupyter輸出的回溯。


這將顯示一個空窗口,為遊戲元素做好準備。


通過構建一個交互式遊戲來教小孩學習Python


這就是我們開始利用Jupyter的地方——傳統上,在我們開始玩之前我們需要編寫完整個遊戲。然而,我們打破慣例,立即開始玩遊戲!


通過交互使遊戲變得有趣

不過,這並不是一個很有趣的遊戲。它什麼都沒有,只是呆在那裡。如果我們想要一些東西,我們最好加上它。


在電子遊戲編程中,在屏幕上移動的東西被稱為“小精靈”。在PursuedPyBear中,小精靈是由類來表示的。小精靈會自動使用與類同名的圖像。我從Kenney上獲得了一個小企鵝的圖像,Kenny是一個免費和開源的電子遊戲資源的集合。


通過構建一個交互式遊戲來教小孩學習Python


現在我們把企鵝放在正中間。


通過構建一個交互式遊戲來教小孩學習Python

通過構建一個交互式遊戲來教小孩學習Python


它認真地坐在中間。這比什麼都沒有要有趣一點。那很好——這正是我們想要的。在漸進式遊戲開發中,每一步都應該更加有趣一點。


使用ppb向我們的企鵝遊戲中添加運動

但企鵝按道理來說不應該一直坐著不動!企鵝應該四處走動。我們將讓玩家通過箭頭鍵控制企鵝。首先,我們將這些鍵映射為向量:


通過構建一個交互式遊戲來教小孩學習Python


現在我們將使用一個實用程序庫。set_in_class函數用來設置類中的方法。Python在類中回溯性地添加函數的能力確實派上了用場!


通過構建一個交互式遊戲來教小孩學習Python


set_in_class的代碼並不長,但它使用了一些複雜的Python技巧。我們將把完整的實用程序庫放在本文的最後以供回顧,出於工作流的考慮,我們暫時跳過它。


回到企鵝身上!


嗯,好。


企鵝正在努力地移動...以零速度,確切地說,哪裡都沒去。讓我們手動設置方向,看看會發生什麼。


通過構建一個交互式遊戲來教小孩學習Python


通過構建一個交互式遊戲來教小孩學習Python


方向是向上的,但有點慢。這樣我們就有足夠的時間手動將企鵝的方向設置為零。我們現在就開始吧!


通過構建一個交互式遊戲來教小孩學習Python


向我們的企鵝遊戲添加互動性

唷,那很刺激——但不是我們想要的。我們希望企鵝能對按鍵作出響應。通過代碼控制它就是玩家們所說的“作弊”。


讓我們設置它來設置按鍵的方向,並在釋放鍵時返回到0。


通過構建一個交互式遊戲來教小孩學習Python


通過構建一個交互式遊戲來教小孩學習Python


企鵝有點無聊了,不是嗎?也許我們應該給它一個橙色的球玩。


通過構建一個交互式遊戲來教小孩學習Python


同樣,我確保有一個名為orangeball.png的圖像。現在讓我們把這個球放在屏幕的左邊。


通過構建一個交互式遊戲來教小孩學習Python


通過構建一個交互式遊戲來教小孩學習Python


不管企鵝怎麼努力,它都踢不到球。當企鵝靠近時,我們讓球遠離它。


首先,讓我們定義一下“踢”球的意思。踢這個球意味著決定它在一秒內的位置,然後將它的狀態設置為“移動”。


首先,我們通過讓第一個更新將它移動到目標位置來移動它。


通過構建一個交互式遊戲來教小孩學習Python


現在,我們來踢球!


通過構建一個交互式遊戲來教小孩學習Python


但這只是傳送了球;它立即改變了位置。在現實生活中,球會在中間點之間運動。當它移動時,它會在它的位置和它要去的位置之間插入。


我們會天真地使用線性插值。但是一個很酷的電子遊戲技巧是使用“easing”函數。在這裡,我們使用常見的“smooth step”。


通過構建一個交互式遊戲來教小孩學習Python


現在,讓我們再次嘗試踢這個球。


通過構建一個交互式遊戲來教小孩學習Python


通過構建一個交互式遊戲來教小孩學習Python


但實際上,應該是企鵝來踢球。當球發現自己與企鵝相撞時,它會朝相反的方向踢自己。如果企鵝正好在球的上方,球就會隨機選擇一個方向。


更新函數現在會調用maybe_move,並且只在我們現在沒有移動的情況下檢查碰撞。


通過構建一個交互式遊戲來教小孩學習Python

通過構建一個交互式遊戲來教小孩學習Python


但僅僅來回踢球並沒有那麼有意思。讓我們添加一個目標。


通過構建一個交互式遊戲來教小孩學習Python


讓我們將目標放置在屏幕的右邊。


通過構建一個交互式遊戲來教小孩學習Python


通過構建一個交互式遊戲來教小孩學習Python


獎勵我們的企鵝

現在,當企鵝把球踢進目標時,我們將會給它一個獎勵。來條魚怎麼樣?


通過構建一個交互式遊戲來教小孩學習Python


當目標得到球時,它應該移除這個球並在屏幕的另一端創建一個新球。然後,它會導致一條魚出現。


通過構建一個交互式遊戲來教小孩學習Python


通過構建一個交互式遊戲來教小孩學習Python


我們想讓這個企鵝吃魚。當魚看到企鵝時,它應該會消失。


通過構建一個交互式遊戲來教小孩學習Python


完美運行!


迭代遊戲設計對企鵝和人來說一樣是有趣的!


這具備了一個遊戲的所有設計過程:玩家控制的企鵝把球踢進目標,得到一條魚,吃掉魚,然後踢一個新球。這將是遊戲中一個“艱難的關卡”,或者我們可以添加一些障礙物來讓企鵝的生活更加艱難一些。


無論你是一個有經驗的程序員,還是一個剛入門的新手,電子遊戲編程都是很有趣的。PursuedPyBear與Jupyter為我們帶來了具有經典環境(如Logo和SmallTalk)的交互式編程能力的經典2D遊戲的所有的樂趣。是時候享受一點80年代的復古風了!


附錄

這裡是我們的實用程序庫的完整源代碼。它提供了一些有趣的概念來使這個遊戲鍵盤運行。更多關於它是如何做到這一點的信息,請閱讀碰撞檢測、setattr以及__name__屬性。


通過構建一個交互式遊戲來教小孩學習Python


分享到:


相關文章: