贪吃蛇游戏开发
文章目录
一、实验目标
1.实现贪吃蛇游戏基本功能,屏幕上随机出现一个“食物”,称为豆子,上下左右控制蛇的移动,吃到豆子后蛇的身体加长一点。
2.蛇碰到边界或蛇头与蛇身相撞,蛇死亡,游戏结束。
3.为游戏设计友好的交互界面,例如欢迎界面,游戏界面,游戏结束界面。
对蛇吃豆子进行分值计算,可以设置游戏速度,游戏音乐等扩展元素。
二、实现方式
用Python以及pygame模块。之所以选择pygame,是因为pygame是一个设计用来开发游戏的Python模块,在SDL库的基础上提供了各种接口,从而使用用户能够使用python语言创建各种各样的游戏或多媒体程序,pygame支持多种操作系统,是一个开源的软件。
三、具体步骤
1.设置屏幕上的网格
代码如下(示例):
import pygame
import sys
import random
import time
from pygame.locals import*
cellwidth = 34 #屏幕上在X坐标轴上显示的方格数
cellheight = 34 #屏幕上在Y坐标轴上显示的方格数
屏幕的width=680,height=680,每个方格的大小为20.
2.设置颜色
代码如下(示例):
#RGB
WHITE = (255, 255, 255)
BLACK = (0, 0 , 0)
RED = (255, 0, 0)
YELLOW = (255, 255, 0)
DARKGREEN = (0, 155, 0)
DARKGRAY = (40, 40, 40)
3.设置main函数
代码如下(示例):
def main():
global fps_clock #定义全局变量
global screen
global font
pygame.init() #初始化pygame
fps_clock = pygame.time.Clock() #获得pygame时钟
screen = pygame.display.set_mode((680, 680)) #设置屏幕大小
font = pygame.font.Font("freesansbold.ttf", 18) #设置屏幕字体
pygame.display.set_caption('贪吃蛇') #设置屏幕标题为“贪吃蛇”
showStartScreen() #显示游戏开始画面
while True:
runGame() #运行游戏主体
showGameOverScreen() #显示游戏结束画面
4.设置游戏运行函数
代码如下(示例):
def runGame():
#设置蛇身开始在随机位置,28是原来屏幕显示了34个方格数,为了防止蛇一开始出现在方格边界直接游戏结束,所以在距边界6个方格的位置随机生成贪吃蛇。
startx = random.randint(5, 28)
starty = random.randint(5, 28)
# 以这个点为起点,建立一个长度为3格的贪吃蛇(列表)
wormCoods = [{'x': startx, 'y': starty},
{'x': startx-1, 'y': starty},
{'x': startx-2, 'y': starty}]
direction = 'right' #蛇初始方向向右
#得到一个随机豆子的位置
bean = getRandomLocation()
while True:
for event in pygame.event.get():
#退出设置
if event.type == QUIT:
pygame.quit()
sys.exit()
elif event.type == KEYDOWN: #按键设置,处理蛇的移动方向
#如果按下的是左键或a键,且当前的方向不是向右,就改变方向,以下类似
if (event.key == K_LEFT or event.key == K_a) and direction != 'right':
direction = 'left'
elif (event.key == K_RIGHT or event.key == K_d) and direction != 'left':
direction = 'right'
elif (event.key == K_UP or event.key == K_w) and direction != 'down':
direction = 'up'
elif (event.key == K_DOWN or event.key == K_s) and direction != 'up':
direction = 'down'
elif event.key == K_ESCAPE:
pygame.quit()
sys.exit()
#看蛇身是否撞击到自己或四周墙壁,即查看蛇头坐标
if wormCoods[HEAD]['x'] == -1 or wormCoods[HEAD]['x'] == cellwidth or wormCoods[HEAD]['y'] == -1 or wormCoods[HEAD]['y'] == cellheight:
return #game over
#检查贪吃蛇是否撞到自己,即检查蛇头的坐标是否等于蛇身的坐标
for wormBody in wormCoods[1:]:
if wormBody['x'] == wormCoods[HEAD]['x'] and wormBody['y'] == wormCoods[HEAD]['y']:
return #game over
#判断蛇是否吃到豆子,若没吃到,则删除尾端,蛇身前进一格
if wormCoods[HEAD]['x'] == bean['x'] and wormCoods[HEAD]['y'] == bean['y']:
bean = getRandomLocation() #随机显示一个新的豆子
else:
del wormCoods[-1] #删除蛇的尾巴,即列表最后一个小方块
#根据蛇的移动方向,给蛇添加一个新的头部
if direction == 'up':
newHead = {'x': wormCoods[HEAD]['x'], 'y': wormCoods[HEAD]['y']-1}
elif direction == 'down':
newHead = {'x': wormCoods[HEAD]['x'], 'y': wormCoods[HEAD]['y']+1}
elif direction == 'left':
newHead = {'x': wormCoods[HEAD]['x']-1, 'y': wormCoods[HEAD]['y']}
elif direction == 'right':
newHead = {'x': wormCoods[HEAD]['x']+1, 'y': wormCoods[HEAD]['y']}
# 插入新的蛇头在数组的最前面
wormCoods.insert(0,newHead)
screen.fill(BLACK) #背景颜色为黑色
drawWorm(wormCoods) #画蛇身
drawBean(bean) #画豆子
drawScore(len(wormCoods) - 3)#显示蛇身长度计算玩家的分数
pygame.display.update() #更新屏幕
fps_clock.tick(15) #设置频率
5.按键模块
代码如下(示例):
#提示按键消息
def drawPressKeyMsg():
pressKeySurf = font.render('Press a key to play.', True, DARKGRAY)
pressKeyRect = pressKeySurf.get_rect()
pressKeyRect.topleft = (680 - 200, 680-30)
screen.blit(pressKeySurf, pressKeyRect)
#检测按键游戏是否要退出
def checkForKeyPress():
if len(pygame.event.get(QUIT)) > 0:
pygame.quit()
sys.exit()
keyUpEvents = pygame.event.get(KEYUP)
if len(keyUpEvents) == 0:
return None
if keyUpEvents[0].key == K_ESCAPE:
pygame.quit()
sys.exit()
return keyUpEvents[0].key
6.随机生成豆子
代码如下(示例):
def getRandomLocation():
return {'x': random.randint(0, cellwidth - 1), 'y': random.randint(0, cellheight - 1)}
7.游戏开始和结束函数
代码如下(示例):
#显示开始界面
def showStartScreen():
titleFont = pygame.font.Font("freesansbold.ttf", 70)
titleSurf1 = titleFont.render("Game Start!", True, WHITE)
while True:
screen.fill(BLACK)
titleRect1 = titleSurf1.get_rect()
titleRect1.center = (340, 340)
screen.blit(titleSurf1,titleRect1)
drawPressKeyMsg()
if checkForKeyPress():
pygame.event.get()
return
pygame.display.update()
fps_clock.tick(15)
#游戏结束时的画面
def showGameOverScreen():
gameOverFont = pygame.font.Font("freesansbold.ttf", 70)
gameOverSurf = gameOverFont.render("GAME OVER!", True, WHITE)
gameOverRect = gameOverSurf.get_rect()
gameOverRect.center = (340,340)
screen.blit(gameOverSurf, gameOverRect)
drawPressKeyMsg()
pygame.display.update()
pygame.time.wait(5)
checkForKeyPress()
while True:
if checkForKeyPress():
pygame.event.get()
return
8.分数设置
代码如下(示例):
def drawScore(score):
scoreSurf = font.render('Score: %s' %(score), True, WHITE)
scoreRect = scoreSurf.get_rect()
scoreRect.midtop = (520,520)
screen.blit(scoreSurf, scoreRect)
9.贪吃蛇设置
代码如下(示例):
# 根据wormCoords列表绘制贪吃蛇
def drawWorm(wormCoods):
for coord in wormCoods:
x = coord['x'] * 20
y = coord['y'] * 20
wormSegmentRect = pygame.Rect(x, y, 20, 20)
pygame.draw.rect(screen, DARKGREEN, wormSegmentRect)
wormInnerSegmentRect = pygame.Rect(x+4, y+4, 20-8, 20-8)
pygame.draw.rect(screen, YELLOW, wormInnerSegmentRect)
10.食物设置
代码如下(示例):
# 根据coord绘制豆子
def drawBean(coord):
x = coord['x'] * 20
y = coord['y'] * 20
pygame.draw.rect(screen, RED, Rect(x, y, 20, 20))
四、示意图展示