前言
前兩章我們學習了遊戲的初步實戰,利用所學的知識編寫了一個記憶迷宮小遊戲,較綜合地練習了用pygame開發遊戲的流程及相關的知識,這一章,我們繼續進入遊戲實戰,利用所學的知識開發一個「數字華容道」小遊戲。
數字華容道簡介喜歡玩智力遊戲的同學們應該會熟悉這個玩法,以通常的4階為例,即在4X4的方格中填寫1~15共15個數字棋子,空出一個方格,通過不斷移動棋子,將所有數字按順序從小到大排列完畢,下面動畫是我們遊戲完成的最終形態:
如果有看過《最強大腦》的同學,應該還記得在有一季選拔賽中,就有用《數字華容道》這道題目來選拔選手。在本章,我們將來學習如何用pygame來開發這一款小遊戲。
遊戲思路作為遊戲開發者,自然不只是要研究如何去解答題目,而是要對遊戲各種意外進行分析並編寫相應代碼來規範用戶輸入行為,下面列舉一下這個遊戲的開發步驟:
繪製背景及初始布局。
根據數字序列的逆序數奇偶性來生成新題目。
處理鍵盤四個方向鍵的響應。
處理滑鼠點擊響應。
計時、計步並進行結束判斷。
保存玩家成績。
疑難問題處理計算數字序列的奇偶性需要注意的是:並不是任意生成的隨機數列均存在答案,由於初始空位的存在位置及生成數列的逆序數奇偶性,需要對這些情況進行一一計算,我們可固定初始位置於位4X4方格的右下角,在這種情況下,只需要保證1~15這十五個數隨機生成序列的逆序數為偶數即可,計算逆序數的函數如下:
構建數字棋子節點
由於每個數字棋子需要記錄其位置、顯示其上數字以及記錄其將移動的方向,所以可將每一個棋子元素設計為如下形式:
m = [位置數據,數字,可移動標記]
因為每個數字棋子最多只有四個方向可移動,且其每一次只可能有一個移動方向,所以這裡將可移動標記設為'0000'字符串,分別代表「左上右下」位置,當每個位置上變為1時,即代表相關的位置可移動,比如'0100'即代表該數字棋子可向上移動,假如此時玩家按下「向上」鍵時,該棋子即向上移動一格。
代碼如下:
以上代碼完成了題目的生成,該函數所帶參數是區分初始狀態和解題狀態。
當我們固定了一個空位後,需要即時計算出該空位四周的數字棋子,並將其可移動方向標記下來,這個應該不困難,根據行、列加減1後即可判斷,代碼如下:
由於我們設置的標記是字符串,每次變更需要對其進行修改,這段代碼還可以優化。
當玩家按下方向鍵後,需要判斷當前是否有數字棋子可供移動,若有,則將可移動棋子與空位交換,此時用動畫處理,代碼如下:
需要注意的是,對於列表而言,交換其兩個元素,需要直接引用列表,這樣才能交換列表中兩元素的次序。
處理方向鍵比較容易,這一點在上一次遊戲中我們有專門講述,這裡只列舉一段代碼,有練習過的同學很容易看明白:
對於滑鼠的處理,上一章中,我們直接獲取滑鼠的位置,自己寫了代碼來檢測當前滑鼠是否在相關方塊上點擊,這一次我們採取另一種更有效的方法,即直接可用pygame.Rect的collidepoint方法,如果滑鼠在該區域點擊,該方法返回True,否則返回False。代碼如下:
細心的同學應該注意到鍵盤和滑鼠的響應我們調用的是同一個函數,因為這部分功能是相同的,所以可將其單獨提取出來成一個函數,這將起到代碼重用的作用。
在本章,我們講述了如何開發一個「數字華容道」的基本步驟,其中有部分功能與上一個記憶迷宮的遊戲類似,本章只對部分關鍵內容進行了講解,當然在遊戲開發過程中還有不少的開關變量需要設置,這一部分內容細瑣繁雜,短短一篇文章很難表述清楚,有願意進一步了解的可在公眾號內留言。
其它教程:
pygame教程(一):基礎知識
pygame教程(二):繪製幾何圖形
pygame教程(三):動畫初步
pygame教程(四):添加文字和播放聲音
pygame教程(五):添加滑鼠和鍵盤響應
pygame教程(六):迷宮小遊戲(1)
pygame教程(七):迷宮小遊戲(2)