手把手教你用Python实现贪吃蛇游戏

首先我们看下游戏运行的效果图

手把手教你用Python实现贪吃蛇游戏

游戏启动界面

手把手教你用Python实现贪吃蛇游戏

游戏运行界面

手把手教你用Python实现贪吃蛇游戏

游戏结束界面

首先程序需要导入的Package:

<code>import pygame
import sys
import time
import random
from pygame.locals import */<code>

关于package pygame的问题(Windows系统):

  1. 在cmd窗口输入pip list查看python是否正确安装pygame,若没有安装,则进行下一步操作。
  2. 在cmd窗口中输入如下命令
<code>pip install -i http://pypi.douban.com/simple --trusted-host pypi.douban.com paygame/<code>

pip会自动下载并安装pygame。如果以上操作未成功,通常可通过检查升级pip解决,输入命令

<code>pip install -i http://e.pypi.python.org --trusted-host e.pypi.python.org --upgrade pip # 升级pip/<code>

3.pygame安装完成后,确保py编译器所配置的环境变量为安装pygame的python版本。(pygame安装后编译器无法导入多数原因是py编译器Python环境变量配置不正确)

初始化pygame

<code>pygame.init()
fpsClock = pygame.time.Clock()/<code>

创建pygame显示层

<code>playSurface = pygame.display.set_mode((640,480))/<code>

定义标题

<code>pygame.display.set_caption('Snake')/<code>

加载资源图片,game.ico放在当前.py文件同目录下

<code>image = pygame.image.load('game.ico')/<code>

设置图标(游戏框左上角目标)

<code>pygame.display.set_icon(image)/<code>

定义颜色变量

<code>redColour = pygame.Color(255,0,0) 

blackColour = pygame.Color(0,0,0)
whiteColour = pygame.Color(255,255,255)
greyColour = pygame.Color(150,150,150)
LightGrey = pygame.Color(220,220,220)/<code>

定义gameOver函数,游玩过程中触发游戏结束事件

<code>def gameOver(playSurface,score):
# 显示GAME OVER 并定义字体以及大小
gameOverFont = pygame.font.Font('arial.ttf', 60)
gameOverSurf = gameOverFont.render('Game Over', True, greyColour)
gameOverRect = gameOverSurf.get_rect()
gameOverRect.midtop = (320, 125)
playSurface.blit(gameOverSurf, gameOverRect)
# 显示分数并定义字体和大小
scoreFont = pygame.font.Font('arial.ttf', 30)
scoreSurf = scoreFont.render('SCORE: ' + str(score), True, greyColour)
scoreRect = scoreSurf.get_rect()
scoreRect.midtop = (320, 225)

#显示是否继续
playSurface.blit(scoreSurf, scoreRect)
isFont = pygame.font.Font('arial.ttf', 25)
isSurf = isFont.render('按d继续,按Esc退出,请在5秒内执行操作', True, redColour)
isRect = scoreSurf.get_rect()
isRect.midtop = (150, 325)
playSurface.blit(isSurf, isRect)
pygame.display.flip() # 刷新显示界面
time.sleep(5)
for event in pygame.event.get() :
if event.type == QUIT:
break;
elif event.type == KEYDOWN :
if event.key == ord('d') or event.key == ord('D') or event.key == K_RIGHT:
initPosition()
return;
pygame.quit()
sys.exit()/<code>
<code>snakePosition = [100,100] #蛇头位置
snakeSegments = [[100,100],[80,100],[60,100]] #初始长度为3个单位
raspberrySpawned = 1 #树莓个数

raspberryPosition = [300,300] #树莓位置
direction = 'right' #初始方向
changeDirection = direction
score = 0 #初始分数
isbegin = True/<code>

定义初始值函数,每次游戏开始初始化游戏相关参数,如树莓的初始位置

<code>def initPosition():
#定义初始位置
global snakePosition,snakeSegments,raspberryPosition,raspberrySpawned,changeDirection,score,isbegin
snakePosition = [100,100] #蛇头位置
snakeSegments = [[100,100],[80,100],[60,100]] #初始长度为3个单位
raspberrySpawned = 1 #树莓个数
raspberryPosition = [300,300] #树莓位置
direction = 'right' #初始方向
changeDirection = direction
score = 0 #初始分数
isbegin = True/<code>

游戏开始画面显示

<code>while True:
if isbegin:
gameOverFont = pygame.font.Font('arial.ttf', 40)
gameOverSurf = gameOverFont.render('LOADING......', True, greyColour)
gameOverRect = gameOverSurf.get_rect()
gameOverRect.midtop = (320, 50)
playSurface.blit(gameOverSurf, gameOverRect)
pygame.display.flip()
time.sleep(3)
isbegin = False/<code>

检测例如按键等pygame事件

<code> for event in pygame.event.get() :
if event.type == QUIT :
pygame.quit()
sys.exit()
elif event.type == KEYDOWN :
#判断键盘事件

if event.key == K_RIGHT or event.key == ord('d'):
changeDirection = 'right'
if event.key == K_LEFT or event.key == ord('a'):
changeDirection = 'left'
if event.key == K_UP or event.key == ord('w'):
changeDirection = 'up'
if event.key == K_DOWN or event.key == ord('s'):
changeDirection = 'down'
if event.key == K_ESCAPE: #按esc退出游戏
pygame.event.post(pygame.event.Event(QUIT))

#判断是否输入了反方向
if changeDirection == 'right' and not direction == 'left' :
direction = changeDirection
if changeDirection == 'left' and not direction == 'right' :
direction = changeDirection
if changeDirection == 'up' and not direction == 'down' :
direction = changeDirection
if changeDirection == 'down' and not direction == 'up' :
direction = changeDirection/<code>

根据方向移动蛇头坐标,并将蛇头位置列入列表中

<code>    if direction == 'right':
snakePosition[0] += 20
if direction == 'left':
snakePosition[0] -= 20
if direction == 'up':
snakePosition[1] -= 20
if direction == 'down':
snakePosition[1] += 20
#将蛇头位置列入列表中
snakeSegments.insert(0,list(snakePosition))/<code>

判断是否吃到树莓,如果吃到,则重新生成树莓

<code>#判断是否吃到树莓
if snakePosition[0] == raspberryPosition[0] and snakePosition[1] == raspberryPosition[1]:
raspberrySpawned = 0
else:
snakeSegments.pop() #每次将最后一单位蛇身踢出列表


#如果吃掉树莓,则重新生成树莓
if raspberrySpawned == 0:
x = random.randrange(1,32)
y = random.randrange(1,24)
raspberryPosition = [int(x*20),int(y*20)]
raspberrySpawned = 1
score += 1/<code>

绘制并刷新pygame显示层

<code>#绘制pygame显示层
playSurface.fill(blackColour)
for position in snakeSegments[1:]: #蛇身为白色
pygame.draw.rect(playSurface,whiteColour,Rect(position[0],position[1],20,20))
pygame.draw.rect(playSurface,LightGrey,Rect(snakePosition[0],snakePosition[1],20,20)) #蛇头为灰色
pygame.draw.rect(playSurface,redColour,Rect(raspberryPosition[0],raspberryPosition[1],20,20)) #树莓为红色
#刷新pygame显示层
pygame.display.flip()/<code>

判断是否死亡(超出左右边界,超出上下边界,碰到自己身体)

<code>    if snakePosition[0] > 620 or snakePosition[0] < 0: #超出左右边界
gameOver(playSurface,score)
if snakePosition[1] >460 or snakePosition[1] < 0 : #超出上下边界
gameOver(playSurface,score)
for snakeBody in snakeSegments[1:]:
if snakePosition[0] == snakeBody[0] and snakePosition[1] == snakeBody[1]:
gameOver(playSurface,score)/<code>

控制小蛇移动速度,蛇身越长,移动速度越快

<code>    if len(snakeSegments) < 40:
speed = 6 + len(snakeSegments)//4
else:
speed = 16
fpsClock.tick(speed)/<code>

有兴趣的小伙伴可以自己试试,童年的回忆哈,一不小心暴露年龄了,哈哈。

谢谢各位的阅读,喜欢点赞关注,不迷路。


分享到:


相關文章: