python實(shí)現(xiàn)貪吃蛇小游戲
關(guān)于編寫(xiě)游戲,是博主非常向往的東西(博主喜愛(ài)游戲),編寫(xiě)游戲得一步一步的走!今天我簡(jiǎn)單的編寫(xiě)一下非常經(jīng)典的游戲貪吃蛇!?。?!
效果圖:
首先引入pygame模塊
pip install pygame
關(guān)于編寫(xiě)貪吃蛇有如下幾個(gè)步驟!依次思考
1、設(shè)置背景大小,即游戲框大小,---像素(px)
2、設(shè)置顏色,蛇的顏色,背景顏色,豆子的顏色
#pygame游戲庫(kù),sys操控python運(yùn)行的環(huán)境 import pygame,sys,random #這個(gè)模塊包含所有pygame所使用的常亮 from pygame.locals import * #1,定義顏色變量 #0-255 0黑色 255白色 redColor = pygame.Color(255,0,0) #背景為黑色 blackColor = pygame.Color(0,0,0) #貪吃蛇為白色 whiteColor = pygame.Color(255,255,255)
3、設(shè)置蛇的初始位置和長(zhǎng)度,豆子的初始位置及被吃后隨機(jī)出現(xiàn)的位置(如下),及蛇的速度
4、設(shè)置按鍵,控制蛇的上下左右
5、設(shè)置蛇通過(guò)與豆子的位置重合判斷是否吃了豆子,此時(shí)蛇長(zhǎng)度加一,豆子消失同時(shí)隨機(jī)出現(xiàn)
6、設(shè)置開(kāi)始函數(shù)(1,,3,4,5都可以設(shè)置在開(kāi)始函數(shù)里),結(jié)束函數(shù),并判斷死亡方式,及游戲結(jié)束方式(直接退出,或者游戲結(jié)束)
def main(): #初始化pygame pygame.init() #定義一個(gè)變量來(lái)控制速度 fpsClock=pygame.time.Clock() #創(chuàng)建pygame顯示層,創(chuàng)建一個(gè)界面 playsurface=pygame.display.set_mode((640,480)) pygame.display.set_caption('貪吃蛇') #初始化變量 #貪吃蛇初始坐標(biāo)位置 (先以100,100為基準(zhǔn)) snakePosition = [100,100] #初始化貪吃蛇的長(zhǎng)度列表中有個(gè)元素就代表有幾段身體 snakeBody = [[100,100],[80,100],[60,100]] #初始化目標(biāo)方向額位置 targetPosition = [300,300] #目標(biāo)方塊的標(biāo)記 目的:判斷是否吃掉了這個(gè)目標(biāo)方塊1 就是沒(méi)有吃 0就是吃掉 targetflag = 1 #初始化方向 --》往右 direction = 'right' #定義一個(gè)方向變量(人為控制 按鍵) changeDirection = direction
def gameover(): #游戲結(jié)束 pygame.quit() sys.exit()
關(guān)于游戲運(yùn)行可以當(dāng)做一個(gè)時(shí)間,通過(guò)不斷地循環(huán)是蛇不斷地前進(jìn)(設(shè)置按鍵,憑個(gè)人喜好按鍵)
while True: for event in pygame.event.get(): #從隊(duì)列中獲取事件 if event.type == QUIT: pygame.quit() sys.exit() elif event.type == KEYDOWN: if event.key == K_d: changeDirection = 'right' if event.key == K_a: changeDirection = 'left' if event.key ==K_w: changeDirection = 'up' if event.key ==K_s: changeDirection = 'down' #對(duì)應(yīng)鍵盤(pán)上的esc文件 if event.key == K_ESCAPE: pygame.event.post(pygame.event.Event(QUIT))
確定方向!當(dāng)蛇在運(yùn)行時(shí)不可掉頭!不可前后,左后!
#確定方向 if changeDirection =='left' and not direction =='right': direction = changeDirection if changeDirection =='right' and not direction =='left': direction = changeDirection if changeDirection =='up' and not direction =='down': direction = changeDirection if changeDirection =='down' and not direction =='up': direction = changeDirection
這里通過(guò)像素的加減確定蛇頭的移動(dòng)向上或向下加減20px相當(dāng)于向上下移動(dòng)一步
#根據(jù)方向移動(dòng)蛇頭 if direction =='right': snakePosition[0] +=20 if direction =='left': snakePosition[0] -=20 if direction =='up': snakePosition[1] -=20 if direction =='down': snakePosition[1] +=20 #增加蛇的長(zhǎng)度 snakeBody.insert(0,list(snakePosition)) #如果貪吃蛇和目標(biāo)方塊的位置重合 if snakePosition[0] == targetPosition[0] and snakePosition[1] ==targetPosition[1]: targetflag= 0 else: snakeBody.pop() if targetflag ==0: x = random.randrange(1,32) y = random.randrange(1,24) targetPosition = [int(x*20),int(y*20)] targetflag =1 #填充背景顏色 playsurface.fill(blackColor)
設(shè)置蛇與豆子的顏色長(zhǎng)寬
for position in snakeBody: #第一個(gè)參數(shù)serface指定一個(gè)serface編輯區(qū),在這個(gè)區(qū)域內(nèi)繪制 #第二個(gè)參數(shù)color:顏色 #第三個(gè)參數(shù):rect:返回一個(gè)矩形(xy),(width,height) #第四個(gè)參數(shù):width:表示線條的粗細(xì) width0填充 實(shí)心 #化蛇 pygame.draw.rect(playsurface,redColor,Rect(position[0],position[1],20,20)) pygame.draw.rect(playsurface, whiteColor, Rect(targetPosition[0], targetPosition[1], 20, 20))
將上面的所作為顯示到桌面,通過(guò)下面的方法實(shí)現(xiàn)
pygame.display.flip()
判斷游戲結(jié)束
if snakePosition[0] > 620 or snakePosition[0] < 0: gameover() elif snakePosition[1] >460 or snakePosition[1] <0: gameover() #控制游戲速度 fpsClock.tick(2)
基本的貪吃蛇步驟如上,如果要是添加得分或者開(kāi)始和結(jié)束界面都憑自身能力了,大佬們肯定是灑灑水了
以下是完整代碼
#pygame游戲庫(kù),sys操控python運(yùn)行的環(huán)境 import pygame,sys,random #這個(gè)模塊包含所有pygame所使用的常亮 from pygame.locals import * #1,定義顏色變量 #0-255 0黑色 255白色 redColor = pygame.Color(255,0,0) #背景為黑色 blackColor = pygame.Color(0,0,0) #貪吃蛇為白色 whiteColor = pygame.Color(255,255,255) #定義游戲結(jié)束的函數(shù) def gameover(): pygame.quit() sys.exit() #定義main函數(shù)--》定義我們的入口函數(shù) def main(): #初始化pygame pygame.init() #定義一個(gè)變量來(lái)控制速度 fpsClock=pygame.time.Clock() #創(chuàng)建pygame顯示層,創(chuàng)建一個(gè)界面 playsurface=pygame.display.set_mode((640,480)) pygame.display.set_caption('貪吃蛇') #初始化變量 #貪吃蛇初始坐標(biāo)位置 (先以100,100為基準(zhǔn)) snakePosition = [100,100] #初始化貪吃蛇的長(zhǎng)度列表中有個(gè)元素就代表有幾段身體 snakeBody = [[100,100],[80,100],[60,100]] #初始化目標(biāo)方向額位置 targetPosition = [300,300] #目標(biāo)方塊的標(biāo)記 目的:判斷是否吃掉了這個(gè)目標(biāo)方塊1 就是沒(méi)有吃 0就是吃掉 targetflag = 1 #初始化方向 --》往右 direction = 'right' #定義一個(gè)方向變量(人為控制 按鍵) changeDirection = direction while True: for event in pygame.event.get(): #從隊(duì)列中獲取事件 if event.type == QUIT: pygame.quit() sys.exit() elif event.type == KEYDOWN: if event.key == K_d: changeDirection = 'right' if event.key == K_a: changeDirection = 'left' if event.key ==K_w: changeDirection = 'up' if event.key ==K_s: changeDirection = 'down' #對(duì)應(yīng)鍵盤(pán)上的esc文件 if event.key == K_ESCAPE: pygame.event.post(pygame.event.Event(QUIT)) #確定方向 if changeDirection =='left' and not direction =='right': direction = changeDirection if changeDirection =='right' and not direction =='left': direction = changeDirection if changeDirection =='up' and not direction =='down': direction = changeDirection if changeDirection =='down' and not direction =='up': direction = changeDirection #根據(jù)方向移動(dòng)蛇頭 if direction =='right': snakePosition[0] +=20 if direction =='left': snakePosition[0] -=20 if direction =='up': snakePosition[1] -=20 if direction =='down': snakePosition[1] +=20 #增加蛇的長(zhǎng)度 snakeBody.insert(0,list(snakePosition)) #如果貪吃蛇和目標(biāo)方塊的位置重合 if snakePosition[0] == targetPosition[0] and snakePosition[1] ==targetPosition[1]: targetflag= 0 else: snakeBody.pop() if targetflag ==0: x = random.randrange(1,32) y = random.randrange(1,24) targetPosition = [int(x*20),int(y*20)] targetflag =1 #填充背景顏色 playsurface.fill(blackColor) for position in snakeBody: #第一個(gè)參數(shù)serface指定一個(gè)serface編輯區(qū),在這個(gè)區(qū)域內(nèi)繪制 #第二個(gè)參數(shù)color:顏色 #第三個(gè)參數(shù):rect:返回一個(gè)矩形(xy),(width,height) #第四個(gè)參數(shù):width:表示線條的粗細(xì) width0填充 實(shí)心 #化蛇 pygame.draw.rect(playsurface,redColor,Rect(position[0],position[1],20,20)) pygame.draw.rect(playsurface, whiteColor, Rect(targetPosition[0], targetPosition[1], 20, 20)) #更新顯示到屏幕表面 pygame.display.flip() #判斷是否游戲結(jié)束 if snakePosition[0] > 620 or snakePosition[0] < 0: gameover() elif snakePosition[1] >460 or snakePosition[1] <0: gameover() #控制游戲速度 fpsClock.tick(2) # 啟動(dòng)入口函數(shù) if __name__ =='__main__': main()
運(yùn)行結(jié)果:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
使用pandas讀取表格數(shù)據(jù)并進(jìn)行單行數(shù)據(jù)拼接的詳細(xì)教程
這篇文章主要介紹了使用pandas讀取表格數(shù)據(jù)并進(jìn)行單行數(shù)據(jù)拼接的詳細(xì)教程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03詳解flask中如何獲取不請(qǐng)求方式的參數(shù)
這篇文章主要詳細(xì)介紹了在flask中如何獲取不請(qǐng)求方式的參數(shù),文中給出了詳細(xì)的代碼示例和圖文介紹,對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-04-04Python實(shí)現(xiàn)Ollama的提示詞生成與優(yōu)化
這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)Ollama的提示詞生成與優(yōu)化的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-12-12Python語(yǔ)言實(shí)現(xiàn)SIFT算法
SIFT,即尺度不變特征變換,是用于圖像處理領(lǐng)域的一種描述,本文重點(diǎn)給大家介紹Python語(yǔ)言實(shí)現(xiàn)SIFT算法,感興趣的朋友一起看看吧2021-11-11Python打工人必備之windows倒計(jì)時(shí)鎖屏功能的實(shí)現(xiàn)
每個(gè)人的電腦里都會(huì)有不想讓別人知道的隱私,或者是上班時(shí)間偷偷摸魚(yú)怕被發(fā)現(xiàn)的小秘密。那怎么辦?就干脆把隱私鎖起來(lái)!從源頭上杜絕被他人偷窺自己的隱私。本文就來(lái)用Python實(shí)現(xiàn)一個(gè)windows倒計(jì)時(shí)鎖屏功能,需要的可以參考一下2023-04-04Python實(shí)現(xiàn)將xml導(dǎo)入至excel
本文給大家講解的是使用Python的Testlink實(shí)現(xiàn)將實(shí)現(xiàn)將xml導(dǎo)入至excel表格中,方法非常的簡(jiǎn)單,另外附上其他小伙伴的方法,有需要的童鞋們可以參考下。2015-11-11用Python展示動(dòng)態(tài)規(guī)則法用以解決重疊子問(wèn)題的示例
這篇文章主要介紹了用Python展示動(dòng)態(tài)規(guī)則法用以解決重疊子問(wèn)題的一個(gè)棋盤(pán)游戲的示例,動(dòng)態(tài)規(guī)劃常常適用于有重疊子問(wèn)題和最優(yōu)子結(jié)構(gòu)性質(zhì)的問(wèn)題,且耗時(shí)間往往遠(yuǎn)少于樸素解法,需要的朋友可以參考下2015-04-04Python?Setuptools的?setup.py實(shí)例詳解
setup.py是一個(gè)?python?文件,它的存在表明您要安裝的模塊/包可能已經(jīng)用?Setuptools?打包和分發(fā),這是分發(fā)?Python?模塊的標(biāo)準(zhǔn)。?它的目的是正確安裝軟件,本文給大家講解Python?Setuptools的?setup.py感興趣的朋友跟隨小編一起看看吧2022-12-12