不知道有多少同學(xué)跟我一樣,最初接觸編程的動(dòng)機(jī)就是為了自己做個(gè)游戲玩? Python 雖然并不是一個(gè)“為游戲而生”的語(yǔ)言,但也有著自己的游戲引擎。最常用的就是 pygame。另外還有一個(gè)知名游戲引擎 cocos2d,它的最初版本就是基于 python 的 cocos2d-python。這兩個(gè)引擎我們都有過案例,其中 pygame 更是做過一個(gè)較為詳盡的入門教程 --《打飛機(jī)》小游戲,鏈接見文末。 今天要給大家分享的是一個(gè) pygame 寫的“貪吃蛇”小游戲: “貪吃蛇”這個(gè)小游戲在編程學(xué)習(xí)中的???,因?yàn)椋?/span> 1. 簡(jiǎn)單,最基本的游戲元素只需要蛇和食物兩個(gè)就可以進(jìn)行了。(打飛機(jī)還需要三個(gè)元素呢,想想分別是什么?)方向的話只要上下左右4個(gè)固定方向就可以了。 2. 有基本的數(shù)據(jù)結(jié)構(gòu)和面向?qū)ο?/strong>的思想在其中。游戲開發(fā)本身就會(huì)用到很多面向?qū)ο蟮母拍睿叩纳眢w又是一個(gè)天然的“鏈表”結(jié)構(gòu),太適合用來(lái)練習(xí)數(shù)據(jù)結(jié)構(gòu)了。 另外比較有趣的一點(diǎn)是,Python 這個(gè)單詞在英語(yǔ)里就是蟒蛇的意思,貪吃蛇可以算是“同名游戲”了。 很多學(xué)校里程序開發(fā)課程的作業(yè)都會(huì)有貪吃蛇的選題,也經(jīng)常會(huì)有同學(xué)問到我們相關(guān)的代碼。(諾基亞手機(jī)對(duì)這款游戲也是情有獨(dú)鐘。)之前我做過一個(gè)《貪吃蛇大作戰(zhàn)》的 Python 版本,基于 cocos2d-python 開發(fā)。但那個(gè)對(duì)于初學(xué)者來(lái)說有些復(fù)雜了。這次是由我們的助教 @清風(fēng)小筑 開發(fā)的一個(gè)更加適合初學(xué)者學(xué)習(xí)的簡(jiǎn)易版本。 對(duì)于整個(gè)開發(fā)過程及代碼的詳細(xì)說明,我們都寫在了文檔里,一并上傳了 github。需要的同學(xué)可自行下載練習(xí),可嘗試更改蛇的速度、顏色,添加多個(gè)食物等。(獲取地址請(qǐng)?jiān)诠娞?hào) Crossin的編程教室 里回復(fù)關(guān)鍵字 貪吃蛇) 這里我們做個(gè)簡(jiǎn)要介紹: 此代碼基于 pygame 開發(fā),所以運(yùn)行前請(qǐng)確保你的 Python 里已成功安裝 pygame。然后直接運(yùn)行代碼中的 mySnake.py 即可開始游戲。 除了最終的代碼外,我們還特意分解了幾個(gè)過程中的 py 文件,供想要自己開發(fā)的同學(xué)參考。 開發(fā)思路 游戲開發(fā)通常都會(huì)采用面向?qū)ο?/strong>的設(shè)計(jì)。這里我們有三個(gè)類:蛇、食物,另外還有背景(用來(lái)繪制格子)。 游戲的主循環(huán)里主要依次做這么幾件事:
蛇和食物的繪制都是通過 pygame 里的 Surface 對(duì)象實(shí)現(xiàn),繪制不同顏色的格子。 蛇的身體使用 Rect 對(duì)象,通過 list 保存。 蛇的移動(dòng)是這個(gè)游戲的核心操作。我們沒有選擇修改蛇的位置,而是每次移動(dòng)時(shí),根據(jù)蛇的前進(jìn)方向增加一個(gè)頭部節(jié)點(diǎn),其余位置都向前移動(dòng)一個(gè)節(jié)點(diǎn),并刪除尾端節(jié)點(diǎn),這樣就等于實(shí)現(xiàn)了蛇的移動(dòng)。如果是吃到了食物,就在尾部再加上節(jié)點(diǎn),就實(shí)現(xiàn)了增長(zhǎng)。 游戲中要做碰撞檢測(cè),這個(gè)用 pygame 的 colliderect 就行。我們要判斷:1.撞墻了沒?2.撞自己了沒?3.撞到食物了沒?然后分別做不同的處理 游戲主循環(huán)的核心代碼: while going: lastt = clock.tick(60) # 幀率 60 dt += lastt # 累計(jì)時(shí)間 c += 1 # 0 鍵盤按壓等事件響應(yīng) for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() elif event.type == KEYDOWN: if event.key == K_UP and validDirect != 0: direct = 1 # 按了向上 1 并且當(dāng)前方向不是向下 0 ,則向上 elif event.key == K_DOWN and validDirect != 1: direct = 0 # 向上 1 ,向下 0 elif event.key == K_LEFT and validDirect != 2: direct = 3 # 向左 3, 向右 2 elif event.key == K_RIGHT and validDirect != 3: direct = 2 # 0.1 畫全屏的黑色背景 screen.fill(black) # 1 判斷是否移動(dòng) if dt > interval: # 移動(dòng)的時(shí)間間隔 validDirect = direct dt = 0 # 初始化時(shí)間 endPop = s.move(snake,direct) # 1.1 畫蛇 for i in snake: screen.blit(s.ball, i) # 2 畫線條 b.drawGrid(screen) # 3.1 分?jǐn)?shù)更新 scoret=b.scoref.render(str(score), True, (255, 255, 255)) # 實(shí)時(shí)得分 screen.blit(scoret, (0, 0)) # 實(shí)時(shí)分?jǐn)?shù) scoret2=b.scoref.render('best:'+str(best), True, (255, 255, 255)) # 最佳得分 screen.blit(scoret2, (width-6*edge, 0)) # 最佳分?jǐn)?shù) # 3.2 食物 screen.blit(f.food, foodr) # 根據(jù) fr(Rect 對(duì)象) 更新 food(Surface 對(duì)象) 位置 ,繪圖 # 4 判斷撞擊 clli = s.strike(snake,foodr) if clli == 0: # 撞墻 撞自己 going = False elif clli == 1: # 吃果實(shí) snake.append(endPop) # 長(zhǎng)尾巴 score += 1 if not f.get_foodpos(foodr,snake): going = False # 生成 food 新位置, 如果占滿全屏,則退出 # 5 屏幕刷新 pygame.display.flip() # 顯示圖形 完整代碼和詳細(xì)說明比較長(zhǎng),就不都貼在這里了,大家可以下載項(xiàng)目到本地后查看及運(yùn)行。獲取項(xiàng)目地址請(qǐng)?jiān)诠娞?hào) Crossin的編程教室 里回復(fù)關(guān)鍵字 貪吃蛇 還有之前的兩篇相關(guān)文章供參考: 爆款游戲《貪吃蛇大作戰(zhàn)》的 Python 實(shí)現(xiàn) 【Pygame 第1課】 hello pygame(回復(fù)關(guān)鍵詞game查看此系列文章) |
|