您好,登錄后才能下訂單哦!
接著上篇pygame實現貪吃蛇游戲(上)繼續介紹
1.豆子的吃掉效果
只需在代碼最后移動蛇頭的代碼后增加一個蛇頭和豆子坐標的判斷即可
if snake_x == bean_x and snake_y == bean_y: bean_x,bean_y = get_bean_pos()
體驗一下,現在蛇頭碰到豆子后,豆子已經會消失了
2.蛇身的加長
前面我們給蛇身只設置了一個坐標,既然蛇身會越加越長,當然我們用一個數組去存這個身體是更合適的,于是我們把蛇身的變量做一些修改。
在初始化body_x和body_y完成后,將這個坐標加入一個名叫body_arr的數組
body_arr = [(body_x,body_y)]
將繪制蛇身的pygame.draw.rect做下修改,用遍歷數組去繪制
for body_x,body_y in body_arr: pygame.draw.rect(screen,yellow,[body_x-20,body_y-20,40,40],5)
蛇身的移動也同樣要改成循環,分別使身體的后一節使用前一節的位置
body_arr = [(snake_x,snake_y)]+body_arr[:-1]
最后吃到豆子后蛇身的加長我們可以這么做,先把蛇最后一節的位置備份一下
last_body_x,last_body_y = body_arr[-1]
如果吃到豆子,那么把這備份下的最后一節加到身體數組最后就好了
body_arr.append((last_body_x,last_body_y))
現在基本的游戲效果可以看到了
3.蛇自身碰撞的游戲失敗判斷
用一個標記表示游戲狀態
game_state = 1 # 游戲狀態1.表示正常 2.表示失敗
將移動判斷的代碼加入標記的判斷改成
if game_state == 1 and pygame.time.get_ticks() >= ticks:
在移動的最后增加一個頭和身體、身體和身體的重合判斷
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]: # 判斷下身體每節是否有重合 game_state = 2 break
游戲失敗后的效果的圖如下
再把網格線去了,看起來干凈一點
最后再附一下完整的程序
# -*- 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)) #設置400*400窗口 snake_x = random.randint(0,9)*40+20 snake_y = random.randint(0,9)*40+20 game_state = 1 # 游戲狀態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 # 移動一次蛇頭的事件,單位毫秒 ticks = pygame.time.get_ticks() ticks += diff_ticks #dire = random.randint(0,3) # 假設0、1、2、3分別代表方向左、右、上、下 if snake_x < 200: dire = 1 # 往右移動 else: dire = 0 # 往左移動 body_y = snake_y if dire == 0: # 向左移動 if snake_x + 40 < 400: body_x = snake_x + 40 else: # 身體不能放右側了,只能往上下方向放 if snake_y > 200: body_x = snake_x body_y -= 40 else: body_x = snake_x body_y += 40 else: # 向右移動 if snake_x - 40 > 0: body_x = snake_x - 40 else: # 身體不能放左側了,只能往上下方向放 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: # 和當前方向不是同方向或反方向并且可以左移 dire = 0 if event.key == K_RIGHT: if dire!=0 and dire!=1 and snake_x + 40 < 400: # 和當前方向不是同方向或反方向并且可以右移 dire = 1 if event.key == K_UP: if dire!=2 and dire!=3 and snake_y - 40 > 0: # 和當前方向不是同方向或反方向并且可以上移 dire = 2 if event.key == K_DOWN: if dire!=2 and dire!=3 and snake_y + 40 < 400: # 和當前方向不是同方向或反方向并且可以下移 dire = 3 screen.fill((0,0,255)) # 將界面設置為藍色 #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() # 必須調用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]: # 判斷下身體每節是否有重合 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))
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。