python貪吃蛇核心功能實(shí)現(xiàn)上
本次做一個(gè)最簡(jiǎn)單的貪食蛇雛形游戲,就是一個(gè)小蛇在畫(huà)面上移動(dòng),我們可以控制蛇的移動(dòng)方向,但是不能吃東西,蛇不會(huì)長(zhǎng)大。但是基礎(chǔ)的有了,完整版的貪食蛇還遠(yuǎn)嗎?雙人貪食蛇不也就那么回事嗎?
先做一個(gè)簡(jiǎn)單的,有機(jī)會(huì)再放出不那么簡(jiǎn)單,但依舊簡(jiǎn)陋的標(biāo)準(zhǔn)貪食蛇和雙人貪食蛇。
首先,pygam的各種配置參數(shù),直接使用之前的配置,多退少補(bǔ)。
import random import time import pygame fps = 30 fps_clock = pygame.time.Clock() screen_width = 640 screen_height = 480 display = pygame.display.set_mode((screen_width, screen_height), 0, 32) pygame.display.set_caption('貪食蛇') tile_size = 20 tile_width = 20 tile_height = 20 #橫縱間距 x_margin = 100 y_margin = 100 #列 columns = int((screen_width - 100) / 20) #行 rows = int((screen_height - 100) / 20) directions = ['up', 'down', 'left', 'right'] #配色RGB white = 'white' black = 'black' bg_color = 'sky blue' border_color = white if __name__ == '__main__': while True: display.fill(bg_color) for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() pygame.display.update() fps_clock.tick(fps)
基本的配置函數(shù),棋盤(pán)類(lèi)游戲常規(guī)操作。
運(yùn)行游戲會(huì)得到一個(gè)天藍(lán)色的畫(huà)布,什么都沒(méi)有。
接下來(lái),在畫(huà)布上畫(huà)出二維棋盤(pán),也就是貪食蛇運(yùn)動(dòng)的場(chǎng)地。這里我們有幾種選擇,此處我選擇一種最簡(jiǎn)單的方式,也就是整個(gè)棋盤(pán)不對(duì)應(yīng)二維列表,只為貪食蛇本身創(chuàng)建一個(gè)列表,用來(lái)儲(chǔ)存貪食蛇的身體。
首先繪制一個(gè)大棋盤(pán)。
def draw_chest(): for i in range(rows + 1): pygame.draw.line(display, border_color, (x_margin/2, y_margin/2 + i * tile_size), (x_margin/2 + (columns * tile_size), y_margin/2 + i * tile_size), 2) for j in range(columns + 1): pygame.draw.line(display, border_color, (x_margin/2 + j * tile_size, y_margin/2), (x_margin/2 + j * tile_size, y_margin/2 + (rows * tile_size)), 2)
然后主循環(huán)里調(diào)用,然后運(yùn)行程序。
貪食蛇的運(yùn)動(dòng)空間已經(jīng)出現(xiàn)了。
創(chuàng)建一個(gè)列表,用來(lái)存放貪食蛇的身體。默認(rèn)貪食蛇的長(zhǎng)度為3。具體大小可以根據(jù)自己的喜歡修改,我就寫(xiě)3了。
那么需要基于這兩個(gè)數(shù)值來(lái)生成蛇的身體的第一個(gè)位置。例如,我們生成的蛇的身體的第一個(gè)位置是[3][3],那么對(duì)應(yīng)的在屏幕中[3][3]所對(duì)應(yīng)的坐標(biāo)位置,繪制一個(gè)小方塊,同時(shí)默認(rèn)蛇的身體是往右延伸,那么蛇的身體參數(shù)則為[3][3],[3][4],[3][5]
考慮到讓蛇隨機(jī)出現(xiàn)在畫(huà)面中的某些地方,所以生成蛇的身體是照顧到各方,隨機(jī)數(shù)的范圍如下:
在主循壞外創(chuàng)建列表,添加身體,身體保持在畫(huà)面中央部分。
snake_body = [] snake_x = random.randint(5, rows - 5) snake_y = random.randint(5, columns - 5) snake_body.append([snake_x, snake_y]) snake_body.append([snake_x, snake_y + 1]) snake_body.append([snake_x, snake_y + 2]) return snake_body
為繪制蛇的身體,編寫(xiě)繪制函數(shù)。
def draw_snake_shape(shapes): for shape in shapes: left_position = shape[1] * tile_size + x_margin/2 top_position = shape[0] * tile_size + y_margin/2 # 畫(huà)出整個(gè)身體背景色 pygame.draw.rect(display, body_color, (left_position, top_position, tile_size, tile_size)) # 畫(huà)出內(nèi)部顏色 pygame.draw.rect(display, inter_body_color, (left_position+4, top_position+4, tile_size-8, tile_size-8))
在主循環(huán)中調(diào)用,運(yùn)行游戲,每次運(yùn)行,蛇都在不同的位置,同時(shí)不會(huì)出現(xiàn)在邊緣。
接下來(lái)就是讓蛇動(dòng)起來(lái)。
讓蛇動(dòng)起來(lái)的核心思想就是,根據(jù)蛇當(dāng)前的前進(jìn)方向,增加和刪除snake_body中的坐標(biāo)值。比如,下一步蛇的運(yùn)動(dòng)方向是up,那么確認(rèn)當(dāng)前up方向是合法的時(shí)候,即往上走一步不會(huì)走到邊界,或者當(dāng)前正在往下走,那么,我們得出新的坐標(biāo)點(diǎn),加入到snake_body中,同時(shí)刪除列表最后一個(gè)數(shù)據(jù),因?yàn)楫?dāng)前沒(méi)有蘋(píng)果可以吃嘛。
先定義一個(gè)判斷下一個(gè)坐標(biāo)點(diǎn)是否合法的函數(shù)。
def is_right_direction(body, x_location, y_location): valid_direction = False if 0 <= x_location <= rows-1 and 0 <= y_location <= columns - 1: valid_direction = True return valid_direction
在主循環(huán)中加入程序處理貪食蛇按照某個(gè)固定的方向移動(dòng)時(shí)對(duì)于貪食蛇身體列表的操作。
首先在進(jìn)入主循環(huán)前,獲取當(dāng)前需要移動(dòng)的方向
direction = directions[random.randint(0, 3)] while True:
在主循環(huán)內(nèi)部,增加代碼處理身體移動(dòng)
#未按下按鍵時(shí),默認(rèn)的初識(shí)移動(dòng)方向 new_body_location = (None, None) match direction: case 'left': new_body_location = snake_body[0][0], snake_body[0][1] - 1 case 'right': new_body_location = snake_body[0][0], snake_body[0][1] + 1 case 'up': new_body_location = snake_body[0][0] - 1, snake_body[0][1] case 'down': new_body_location = snake_body[0][0] + 1, snake_body[0][1] snake_body.insert(0, new_body_location) del snake_body[-1]
此時(shí)運(yùn)行程序,貪食蛇會(huì)像閃電一般快速移動(dòng)到屏幕邊緣。
根本來(lái)不及截圖,因?yàn)槲覀兊乃⑿侣适?0幀每秒,所以太快了,此時(shí)有多種解決方案,最簡(jiǎn)單的一種是修改刷新率,比如修改為2,那么就會(huì)看到蛇緩慢移動(dòng)了。非常簡(jiǎn)單啦。也可以考慮在移動(dòng)部分做定時(shí),或者做累加延遲等等。這里我修改了fps=2。
接下來(lái)增加控制部分,這部分很簡(jiǎn)單。
在按鍵部分設(shè)定上下左右按鍵控制方向,同時(shí)要注意,貪食蛇不能直接掉頭走。
#鍵盤(pán)控制改變貪食蛇的方向 elif event.type == pygame.KEYUP: if event.key == pygame.K_LEFT and direction != 'right': direction = 'left' elif event.key == pygame.K_RIGHT and direction != 'left': direction = 'right' elif event.key == pygame.K_UP and direction != 'down': direction = 'up' elif event.key == pygame.K_DOWN and direction != 'up': direction = 'down'
游戲結(jié)束機(jī)制,也就是蛇碰到邊界游戲結(jié)束。
if is_right_direction(snake_body, new_body_location[0], new_body_location[1]): snake_body.insert(0, new_body_location) del snake_body[-1] else: snake_body = [] snake_x = random.randint(5, columns - 5) snake_y = random.randint(5, rows - 5) snake_body.append([snake_x, snake_y]) snake_body.append([snake_x, snake_y + 1]) snake_body.append([snake_x, snake_y + 2])
框架級(jí)別的貪食蛇制作完成了,如果再加入一個(gè)小蘋(píng)果,增加一個(gè)增加身體條件就有一個(gè)完整的貪食蛇了。再追加一個(gè)追尾機(jī)制,和一條新的蛇就可以雙人對(duì)戰(zhàn)了。
到此這篇關(guān)于python貪吃蛇核心功能實(shí)現(xiàn)上的文章就介紹到這了,更多相關(guān)python貪吃蛇內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談Python采集網(wǎng)頁(yè)時(shí)正則表達(dá)式匹配換行符的問(wèn)題
今天小編就為大家分享一篇淺談Python采集網(wǎng)頁(yè)時(shí)正則表達(dá)式匹配換行符的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12Django數(shù)據(jù)庫(kù)操作的實(shí)例(增刪改查)
下面小編就為大家?guī)?lái)一篇Django數(shù)據(jù)庫(kù)操作的實(shí)例(增刪改查)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09使用python自動(dòng)追蹤你的快遞(物流推送郵箱)
本文講解如何讓 python自動(dòng)為你查詢快遞信息 ,并在物流發(fā)生更新或者到達(dá)指定地點(diǎn)時(shí)第一時(shí)間將 物流推送至你的郵箱,本文通過(guò)實(shí)例代碼截圖的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2020-03-03Python實(shí)現(xiàn)程序的單一實(shí)例用法分析
這篇文章主要介紹了Python實(shí)現(xiàn)程序的單一實(shí)例用法,較為詳細(xì)的分析了Python窗口的相關(guān)操作技巧,需要的朋友可以參考下2015-06-06簡(jiǎn)單的連接MySQL與Python的Bottle框架的方法
這篇文章主要介紹了簡(jiǎn)單的連接MySQL與Python的Bottle框架的方法,主要基于mysql-connector插件,需要的朋友可以參考下2015-04-04Python3實(shí)現(xiàn)爬取指定百度貼吧頁(yè)面并保存頁(yè)面數(shù)據(jù)生成本地文檔的方法
這篇文章主要介紹了Python3實(shí)現(xiàn)爬取指定百度貼吧頁(yè)面并保存頁(yè)面數(shù)據(jù)生成本地文檔的方法,涉及Python基于urllib模塊的頁(yè)面爬取與文件讀寫(xiě)相關(guān)操作技巧,需要的朋友可以參考下2018-04-04python基于pyDes庫(kù)實(shí)現(xiàn)des加密的方法
這篇文章主要介紹了python基于pyDes庫(kù)實(shí)現(xiàn)des加密的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了pyDes庫(kù)的下載、安裝及使用pyDes庫(kù)進(jìn)行加密的相關(guān)操作技巧,需要的朋友可以參考下2017-04-04python編程實(shí)現(xiàn)隨機(jī)生成多個(gè)橢圓實(shí)例代碼
這篇文章主要介紹了python編程實(shí)現(xiàn)隨機(jī)生成多個(gè)橢圓實(shí)例代碼,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01Python Dask庫(kù)處理大規(guī)模數(shù)據(jù)集的強(qiáng)大功能實(shí)戰(zhàn)
Dask是一個(gè)靈活、開(kāi)源的Python庫(kù),專(zhuān)為處理大規(guī)模數(shù)據(jù)集而設(shè)計(jì),與傳統(tǒng)的單機(jī)計(jì)算相比,Dask能夠在分布式系統(tǒng)上運(yùn)行,有效利用集群的計(jì)算資源,本文將深入介紹Dask的核心概念、功能和實(shí)際應(yīng)用,通過(guò)豐富的示例代碼展示其在大數(shù)據(jù)處理領(lǐng)域的強(qiáng)大能力2023-12-12