基于Pygame實(shí)現(xiàn)簡(jiǎn)單的貪吃蛇游戲
導(dǎo)入相關(guān)的包
import pygame, sys, random from pygame.locals import *
設(shè)置屏幕大小以及基本參數(shù)
設(shè)置屏幕大小為400*400,mainClock = pygame.time.Clock()用來(lái)設(shè)置時(shí)間同步,不會(huì)根據(jù)計(jì)算機(jī)的運(yùn)行來(lái)決定運(yùn)行多少次, mainClock.tick(1) 一秒只會(huì)運(yùn)行一次,設(shè)置了屏幕的底色為白色。
# 定義屏幕的寬高
WIDTH = 400
HEIGHT = 400
# 初始化屏幕 設(shè)置窗口標(biāo)題
surface = pygame.display.set_mode((WIDTH, HEIGHT), 0, 32)
pygame.display.set_caption('貪吃蛇')
pygame.init()
mainClock = pygame.time.Clock()
# 定義使用的顏色
BLACK = (0, 0, 0)
GREEN = (0, 255, 0)
WHITE = (255, 255, 255)
while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
surface.fill(WHITE)
pygame.display.update()
mainClock.tick(1)

設(shè)置貪吃蛇的位置,以及移動(dòng)的大小
這里設(shè)置了貪吃蛇的長(zhǎng)度和起始位置,和食物和蛇的寬度,這里必須設(shè)置為可以被食物和蛇的寬度整除的數(shù),這樣才能保證蛇能到任意的位置
# 設(shè)置蛇的初始長(zhǎng)度
snakeWidth = 4
# 設(shè)置蛇的起始位置為(40,40)
snakeX = 40
snakeY = 40
# 食物和蛇的寬度設(shè)置為8
FOODSNAKEWIDTH = 8
# 定義四個(gè)方向
moveLeft = False
moveRight = False
moveUp = False
moveDown = False
# 定義初始的方向
moveRight = True
def getSnake():
# 設(shè)置蛇的初始長(zhǎng)度為4,并設(shè)置蛇的初始位置為(40,40)
# 因?yàn)樨澇陨邥?huì)拐彎,所以將蛇設(shè)置為一個(gè)列表
snake = []
for i in range(snakeWidth):
snake.append(pygame.Rect(snakeX + i * FOODSNAKEWIDTH, snakeY, FOODSNAKEWIDTH, FOODSNAKEWIDTH))
return snake
# 貪吃蛇
snake = getSnake()
繪制蛇
surface.fill(WHITE)
for s in snake:
pygame.draw.rect(surface, BLACK, s)
讓蛇動(dòng)起來(lái)
這里將蛇列表最后一位移除,然后將第一位的位置根據(jù)方向加減坐標(biāo)
snake.pop()
newTop = copy.deepcopy(snake[0])
# 改變蛇的位置
if moveRight:
newTop.left += FOODSNAKEWIDTH
if moveLeft:
newTop.left -= FOODSNAKEWIDTH
if moveUp:
newTop.top -= FOODSNAKEWIDTH
if moveDown:
newTop.top += FOODSNAKEWIDTH
snake.insert(0, newTop)

這樣會(huì)有一個(gè)問(wèn)題,如果超出屏幕呢,我們將超出屏幕,那么就會(huì)消失,我們只需要你移動(dòng)第一個(gè)元素的時(shí)候,如果超出則將元素移動(dòng)另一個(gè)位置。
# 改變蛇的位置
if moveRight:
if newTop.right == WIDTH:
newTop.left = 0
else:
newTop.left += FOODSNAKEWIDTH
if moveLeft:
if newTop.left == 0:
newTop.right == WIDTH
else:
newTop.left -= FOODSNAKEWIDTH
if moveUp:
if newTop.top == 0:
newTop.bottom = HEIGHT
else:
newTop.top -= FOODSNAKEWIDTH
if moveDown:
if newTop.bottom == HEIGHT:
newTop.top = 0
else:
newTop.top += FOODSNAKEWIDTH
實(shí)現(xiàn)貪吃蛇拐彎
為了實(shí)現(xiàn)對(duì)應(yīng)的功能,我們將方向變量改為一個(gè)變量,這樣我們方便修改方向
# 定義四個(gè)方向
# moveLeft moveRight moveUp moveDown
# 定義初始的方向
snakeDirection = "moveRight"
----
省略的代碼
----
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
if event.type == KEYDOWN:
if event.key == K_LEFT:
if snakeDirection == "moveRight":
snake.reverse()
snakeDirection = "moveLeft"
if event.key == K_RIGHT:
if snakeDirection == "moveLeft":
snake.reverse()
snakeDirection = "moveRight"
if event.key == K_UP:
if snakeDirection == "moveDown":
snake.reverse()
snakeDirection = "moveUp"
if event.key == K_DOWN:
if snakeDirection == "moveUp":
snake.reverse()
snakeDirection = "moveDown"
為了方便看到效果,我將mainClock.tick(1) 設(shè)置為mainClock.tick(3)

實(shí)現(xiàn)隨機(jī)食物
這里用了很啰嗦的代碼,我自己也看不下去,有點(diǎn)含糊,這里為了簡(jiǎn)單只設(shè)計(jì)了一個(gè)食物,遍歷屏幕上不是貪吃蛇的可以放食物的集合,然后隨機(jī)生成一個(gè)食物。
if len(foods) < foodnum:
canFoodColl = []
# 獲取當(dāng)前不是貪吃蛇的位置集合
for x in range(sizeNum):
for y in range(sizeNum):
foodExist = True
for sn in snake:
if x * FOODSNAKEWIDTH == sn.left and y * FOODSNAKEWIDTH == sn.top:
foodExist = False
break
if foodExist:
canFoodColl.append({'x': x, 'y': y})
f = canFoodColl[random.randint(0, len(canFoodColl))]
foods.append(pygame.Rect(f['x'], f['y'], FOODSNAKEWIDTH, FOODSNAKEWIDTH))

吃食物
這里用 colliderect判斷二者是否相撞,然后食物集合置空,不減去貪吃蛇集合的最后一個(gè)元素。
if len(foods) < foodnum:
canFoodColl = []
# 獲取當(dāng)前不是貪吃蛇的位置集合
for x in range(sizeNum):
for y in range(sizeNum):
foodExist = True
for sn in snake:
if x * FOODSNAKEWIDTH == sn.left and y * FOODSNAKEWIDTH == sn.top:
foodExist = False
break
if foodExist:
canFoodColl.append({'x': x, 'y': y})
f = canFoodColl[random.randint(0, len(canFoodColl))]
foods.append(pygame.Rect(f['x'] * FOODSNAKEWIDTH, f['y'] * FOODSNAKEWIDTH, FOODSNAKEWIDTH, FOODSNAKEWIDTH))
print(f['x'])
print(f['y'])
else:
if newTop.colliderect(foods[0]):
foods = []
eatFlg = True
print('xxx')

完整代碼?
import pygame, sys, random
from pygame.locals import *
import copy
# 定義屏幕的寬高
WIDTH = 400
HEIGHT = 400
# 初始化屏幕 設(shè)置窗口標(biāo)題
surface = pygame.display.set_mode((WIDTH, HEIGHT), 0, 32)
pygame.display.set_caption('貪吃蛇')
pygame.init()
mainClock = pygame.time.Clock()
# 定義使用的顏色
BLACK = (0, 0, 0)
GREEN = (0, 255, 0)
WHITE = (255, 255, 255)
# 設(shè)置蛇的初始長(zhǎng)度
snakeWidth = 4
# 設(shè)置蛇的起始位置為(40,40)
snakeX = 40
snakeY = 40
# 食物和蛇的寬度設(shè)置為8
FOODSNAKEWIDTH = 8
# 定義四個(gè)方向
# moveLeft moveRight moveUp moveDown
# 定義初始的方向
snakeDirection = "moveRight"
# 食物區(qū)間
foods = []
# 用去寬度處以對(duì)應(yīng)的 大小,減去1 就是食物矩形起點(diǎn)可以存在的區(qū)間
#sizeNum = HEIGHT / FOODSNAKEWIDTH - 1
# 這里為了減少計(jì)算
sizeNum = 39
# 為了簡(jiǎn)單我們只設(shè)置一個(gè)食物
foodnum = 1
def getSnake():
# 設(shè)置蛇的初始長(zhǎng)度為4,并設(shè)置蛇的初始位置為(40,40)
# 因?yàn)樨澇陨邥?huì)拐彎,所以將蛇設(shè)置為一個(gè)列表
snake = []
for i in range(snakeWidth):
snake.append(pygame.Rect(snakeX + i * FOODSNAKEWIDTH, snakeY, FOODSNAKEWIDTH, FOODSNAKEWIDTH))
return snake
# 貪吃蛇
snake = getSnake()
while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
if event.type == KEYDOWN:
if event.key == K_LEFT:
if snakeDirection == "moveRight":
snake.reverse()
snakeDirection = "moveLeft"
if event.key == K_RIGHT:
if snakeDirection == "moveLeft":
snake.reverse()
snakeDirection = "moveRight"
if event.key == K_UP:
if snakeDirection == "moveDown":
snake.reverse()
snakeDirection = "moveUp"
if event.key == K_DOWN:
if snakeDirection == "moveUp":
snake.reverse()
snakeDirection = "moveDown"
surface.fill(WHITE)
for s in snake:
pygame.draw.rect(surface, BLACK, s)
for f in foods:
pygame.draw.rect(surface, GREEN, f)
pygame.display.update()
# 是否吃了食物
eatFlg = False
newTop = copy.deepcopy(snake[0])
# 改變蛇的位置
if snakeDirection == "moveRight":
if newTop.right == WIDTH:
newTop.left = 0
else:
newTop.left += FOODSNAKEWIDTH
if snakeDirection == "moveLeft":
if newTop.left == 0:
newTop.right = WIDTH
else:
newTop.left -= FOODSNAKEWIDTH
if snakeDirection == "moveUp":
if newTop.top == 0:
newTop.bottom = HEIGHT
else:
newTop.top -= FOODSNAKEWIDTH
if snakeDirection == "moveDown":
if newTop.bottom == HEIGHT:
newTop.top = 0
else:
newTop.top += FOODSNAKEWIDTH
if len(foods) < foodnum:
canFoodColl = []
# 獲取當(dāng)前不是貪吃蛇的位置集合
for x in range(sizeNum):
for y in range(sizeNum):
foodExist = True
for sn in snake:
if x * FOODSNAKEWIDTH == sn.left and y * FOODSNAKEWIDTH == sn.top:
foodExist = False
break
if foodExist:
canFoodColl.append({'x': x, 'y': y})
f = canFoodColl[random.randint(0, len(canFoodColl))]
foods.append(pygame.Rect(f['x'] * FOODSNAKEWIDTH, f['y'] * FOODSNAKEWIDTH, FOODSNAKEWIDTH, FOODSNAKEWIDTH))
print(f['x'])
print(f['y'])
else:
if newTop.colliderect(foods[0]):
foods = []
eatFlg = True
print('xxx')
snake.insert(0, newTop)
if not eatFlg:
snake.pop()
mainClock.tick(3)
以上就是基于Pygame實(shí)現(xiàn)簡(jiǎn)單的貪吃蛇游戲的詳細(xì)內(nèi)容,更多關(guān)于Pygame 貪吃蛇游戲的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- python實(shí)戰(zhàn)之利用pygame實(shí)現(xiàn)貪吃蛇游戲(二)
- python實(shí)戰(zhàn)之利用pygame實(shí)現(xiàn)貪吃蛇游戲(一)
- 五分鐘學(xué)會(huì)怎么用Pygame做一個(gè)簡(jiǎn)單的貪吃蛇
- 使用Python第三方庫(kù)pygame寫個(gè)貪吃蛇小游戲
- python 使用pygame工具包實(shí)現(xiàn)貪吃蛇游戲(多彩版)
- pygame實(shí)現(xiàn)貪吃蛇游戲(下)
- pygame實(shí)現(xiàn)貪吃蛇游戲(上)
- PyGame貪吃蛇的實(shí)現(xiàn)代碼示例
- 使用pygame模塊編寫貪吃蛇的實(shí)例講解
- pygame實(shí)現(xiàn)貪吃蛇游戲
相關(guān)文章
解決python中使用PYQT時(shí)中文亂碼問(wèn)題
今天小編就為大家分享一篇解決python中使用PYQT時(shí)中文亂碼問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-06-06
pandas中std和numpy的np.std區(qū)別及說(shuō)明
這篇文章主要介紹了pandas中std和numpy的np.std區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
Python+Selenium實(shí)現(xiàn)無(wú)頭瀏覽器網(wǎng)頁(yè)截圖
這篇文章主要為大家詳細(xì)介紹了Python+Selenium實(shí)現(xiàn)無(wú)頭瀏覽器網(wǎng)頁(yè)截圖的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-03-03
python不支持i++運(yùn)算原理實(shí)例解析
這篇文章主要為大家介紹了python不支持 i++運(yùn)算原理實(shí)例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-02-02
python實(shí)現(xiàn)微信接口(itchat)詳細(xì)介紹
這篇文章主要介紹了python實(shí)現(xiàn)微信接口(itchat)詳細(xì)介紹,小編覺(jué)得挺不錯(cuò)的,這里分享給大家,供需要的朋友參考。2017-10-10
安裝pyecharts1.8.0版本后導(dǎo)入pyecharts模塊繪圖時(shí)報(bào)錯(cuò): “所有圖表類型將在 v1.9.0 版本開(kāi)始
這篇文章主要介紹了安裝pyecharts1.8.0版本后導(dǎo)入pyecharts模塊繪圖時(shí)報(bào)錯(cuò): “所有圖表類型將在 v1.9.0 版本開(kāi)始強(qiáng)制使用 ChartItem 進(jìn)行數(shù)據(jù)項(xiàng)配置 ”的解決方法,需要的朋友可以參考下2020-08-08
Python計(jì)數(shù)器collections.Counter用法詳解
本文主要介紹了Python計(jì)數(shù)器collections.Counter用法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03

