pygame實(shí)現(xiàn)貪吃蛇游戲(下)
接著上篇pygame實(shí)現(xiàn)貪吃蛇游戲(上)繼續(xù)介紹
1.豆子的吃掉效果
只需在代碼最后移動(dòng)蛇頭的代碼后增加一個(gè)蛇頭和豆子坐標(biāo)的判斷即可
if snake_x == bean_x and snake_y == bean_y: bean_x,bean_y = get_bean_pos()
體驗(yàn)一下,現(xiàn)在蛇頭碰到豆子后,豆子已經(jīng)會(huì)消失了
2.蛇身的加長(zhǎng)
前面我們給蛇身只設(shè)置了一個(gè)坐標(biāo),既然蛇身會(huì)越加越長(zhǎng),當(dāng)然我們用一個(gè)數(shù)組去存這個(gè)身體是更合適的,于是我們把蛇身的變量做一些修改。
在初始化body_x和body_y完成后,將這個(gè)坐標(biāo)加入一個(gè)名叫body_arr的數(shù)組
body_arr = [(body_x,body_y)]
將繪制蛇身的pygame.draw.rect做下修改,用遍歷數(shù)組去繪制
for body_x,body_y in body_arr: pygame.draw.rect(screen,yellow,[body_x-20,body_y-20,40,40],5)
蛇身的移動(dòng)也同樣要改成循環(huán),分別使身體的后一節(jié)使用前一節(jié)的位置
body_arr = [(snake_x,snake_y)]+body_arr[:-1]
最后吃到豆子后蛇身的加長(zhǎng)我們可以這么做,先把蛇最后一節(jié)的位置備份一下
last_body_x,last_body_y = body_arr[-1]
如果吃到豆子,那么把這備份下的最后一節(jié)加到身體數(shù)組最后就好了
body_arr.append((last_body_x,last_body_y))
現(xiàn)在基本的游戲效果可以看到了

3.蛇自身碰撞的游戲失敗判斷
用一個(gè)標(biāo)記表示游戲狀態(tài)
game_state = 1 # 游戲狀態(tài)1.表示正常 2.表示失敗
將移動(dòng)判斷的代碼加入標(biāo)記的判斷改成
if game_state == 1 and pygame.time.get_ticks() >= ticks:
在移動(dòng)的最后增加一個(gè)頭和身體、身體和身體的重合判斷
for body_x,body_y in body_arr: # 判斷下蛇頭和身體是否有重合
if snake_x == body_x and snake_y == body_y:
game_state = 2
break
for i in range(len(body_arr)-1):
for j in range(i+1,len(body_arr)):
if body_arr[i][0] == body_arr[j][0] and body_arr[i][1] == body_arr[j][1]: # 判斷下身體每節(jié)是否有重合
game_state = 2
break
游戲失敗后的效果的圖如下

再把網(wǎng)格線去了,看起來干凈一點(diǎn)

最后再附一下完整的程序
# -*- coding=utf-8 -*-
import random
import pygame
from pygame.locals import KEYDOWN,K_LEFT,K_RIGHT,K_UP,K_DOWN
pygame.init()
screencaption = pygame.display.set_caption('first pygame')
screen = pygame.display.set_mode((400,400)) #設(shè)置400*400窗口
snake_x = random.randint(0,9)*40+20
snake_y = random.randint(0,9)*40+20
game_state = 1 # 游戲狀態(tài)1.表示正常 2.表示失敗
def get_bean_pos():
return random.randint(0,9)*40+20,random.randint(0,9)*40+20
yellow = 255,255,0
bean_x,bean_y = get_bean_pos()
diff_ticks = 300 # 移動(dòng)一次蛇頭的事件,單位毫秒
ticks = pygame.time.get_ticks()
ticks += diff_ticks
#dire = random.randint(0,3) # 假設(shè)0、1、2、3分別代表方向左、右、上、下
if snake_x < 200:
dire = 1 # 往右移動(dòng)
else:
dire = 0 # 往左移動(dòng)
body_y = snake_y
if dire == 0: # 向左移動(dòng)
if snake_x + 40 < 400:
body_x = snake_x + 40
else: # 身體不能放右側(cè)了,只能往上下方向放
if snake_y > 200:
body_x = snake_x
body_y -= 40
else:
body_x = snake_x
body_y += 40
else: # 向右移動(dòng)
if snake_x - 40 > 0:
body_x = snake_x - 40
else: # 身體不能放左側(cè)了,只能往上下方向放
if snake_y > 200:
body_x = snake_x
body_y -= 40
else:
body_x = snake_x
body_y += 40
body_arr = [(body_x,body_y)]
def set_snake_next_pos(snake_x, snake_y):
if dire == 0:
if snake_x - 40 > 0:
snake_x -= 40
if dire == 1:
if snake_x + 40 < 400:
snake_x += 40
if dire == 2:
if snake_y - 40 > 0:
snake_y -= 40
if dire == 3:
if snake_y + 40 < 400:
snake_y += 40
return snake_x,snake_y
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
exit()
if event.type == KEYDOWN:
if event.key == K_LEFT:
if dire!=0 and dire!=1 and snake_x - 40 > 0: # 和當(dāng)前方向不是同方向或反方向并且可以左移
dire = 0
if event.key == K_RIGHT:
if dire!=0 and dire!=1 and snake_x + 40 < 400: # 和當(dāng)前方向不是同方向或反方向并且可以右移
dire = 1
if event.key == K_UP:
if dire!=2 and dire!=3 and snake_y - 40 > 0: # 和當(dāng)前方向不是同方向或反方向并且可以上移
dire = 2
if event.key == K_DOWN:
if dire!=2 and dire!=3 and snake_y + 40 < 400: # 和當(dāng)前方向不是同方向或反方向并且可以下移
dire = 3
screen.fill((0,0,255)) # 將界面設(shè)置為藍(lán)色
#for x in range(0,400,40):
# pygame.draw.line(screen,(255,255,255),(x,0),(x,400),1)
#for y in range(0,400,40):
# pygame.draw.line(screen,(255,255,255),(0,y),(400,y),1)
pygame.draw.circle(screen,yellow,[snake_x,snake_y],20,2)
for body_x,body_y in body_arr:
pygame.draw.rect(screen,yellow,[body_x-20,body_y-20,40,40],5)
pygame.draw.circle(screen,yellow,[bean_x,bean_y],10,10)
if game_state == 2:
myfont = pygame.font.Font(None,30)
white = 255,255,255
textImage = myfont.render("Game over", True, white)
screen.blit(textImage, (160,190))
pygame.display.update() # 必須調(diào)用update才能看到繪圖顯示
if game_state == 1 and pygame.time.get_ticks() >= ticks:
last_body_x,last_body_y = body_arr[-1]
body_arr = [(snake_x,snake_y)]+body_arr[:-1]
snake_x,snake_y = set_snake_next_pos(snake_x,snake_y)
ticks += diff_ticks
#if snake_x == bean_x and snake_y == bean_y:
# bean_x,bean_y = get_bean_pos()
# body_arr.append((last_body_x,last_body_y))
for body_x,body_y in body_arr:
if snake_x == body_x and snake_y == body_y: # 判斷下蛇頭和身體是否有重合
game_state = 2
break
for i in range(len(body_arr)-1):
for j in range(i+1,len(body_arr)):
if body_arr[i][0] == body_arr[j][0] and body_arr[i][1] == body_arr[j][1]: # 判斷下身體每節(jié)是否有重合
game_state = 2
break
if snake_x == bean_x and snake_y == bean_y:
bean_x,bean_y = get_bean_pos()
body_arr.append((last_body_x,last_body_y))
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 使用Python第三方庫pygame寫個(gè)貪吃蛇小游戲
- python 使用pygame工具包實(shí)現(xiàn)貪吃蛇游戲(多彩版)
- pygame實(shí)現(xiàn)貪吃蛇游戲(上)
- python實(shí)戰(zhàn)之利用pygame實(shí)現(xiàn)貪吃蛇游戲(一)
- python實(shí)戰(zhàn)之利用pygame實(shí)現(xiàn)貪吃蛇游戲(二)
- Pygame代碼?制作一個(gè)貪吃蛇小游戲
- pygame實(shí)現(xiàn)貪吃蛇游戲
- 基于pygame實(shí)現(xiàn)貪吃蛇小游戲示例
- pygame實(shí)現(xiàn)貪吃蛇小游戲
- 教你用Pygame制作簡(jiǎn)單的貪吃蛇游戲
相關(guān)文章
Python OpenCV實(shí)現(xiàn)鼠標(biāo)畫框效果
這篇文章主要為大家詳細(xì)介紹了Python OpenCV實(shí)現(xiàn)鼠標(biāo)畫框效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08
python+opencv實(shí)現(xiàn)動(dòng)態(tài)物體識(shí)別
這篇文章主要為大家詳細(xì)介紹了python+opencv實(shí)現(xiàn)動(dòng)態(tài)物體識(shí)別,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01
Keras 切換后端方式(Theano和TensorFlow)
這篇文章主要介紹了Keras 切換后端方式(Theano和TensorFlow),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-06-06
Python寫的一個(gè)簡(jiǎn)單監(jiān)控系統(tǒng)
這篇文章主要介紹了Python寫的一個(gè)簡(jiǎn)單監(jiān)控系統(tǒng),本文講解了詳細(xì)的編碼步驟,并給給出相應(yīng)的實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-06-06
python3.8與pyinstaller沖突問題的快速解決方法
這篇文章主要介紹了python3.8與pyinstaller沖突問題及解決方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01
結(jié)合OpenCV與TensorFlow進(jìn)行人臉識(shí)別的實(shí)現(xiàn)
這篇文章主要介紹了結(jié)合OpenCV與TensorFlow進(jìn)行人臉識(shí)別的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
selenium執(zhí)行js并繞過webdriver監(jiān)測(cè)常見方法
這篇文章主要為大家介紹了selenium執(zhí)行js并繞過webdriver監(jiān)測(cè)常見方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04
Anaconda3中的Jupyter notebook添加目錄插件的實(shí)現(xiàn)
這篇文章主要介紹了Anaconda3中的Jupyter notebook添加目錄插件的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05

