项目背景:
在亚当夏娃的传说中,蛇一口吃掉了苹果。正是这个有趣的故事启发下诞生了《贪吃蛇》这款经典的小游戏。用键盘控制小蛇的运动,小蛇一会向左一会向,一口一个吃掉苹果。那么我们如何来设计游戏的界面?如何用代码来控制小蛇的运行轨迹?本项目我们就来学习下如何完成这个小游戏的制作。
项目分析:
本项目的开发需要完成以下几部分的任务:
本项目需要用到的库:randome pygame
本项目需要用到重要 pyghon 语法知识:if 语句、函数构选、pygame 使用
本项目实施需要哪些具体的步骤,参考如下思维导图。
项目实施:
import sys,random,operator
import pygame
from pygame.locals import *
各种颜色
RED = (255, 0, 0)
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
GREY = (30, 30, 30)
GREEN = (0,255,0)
各种变量
speed = 2 # 游戏速度
points = 0 # 游戏得分
one_grid = 20 # 一个方格子,标准长度单位
screen_width = 640 # 屏幕长度
screen_height = 480 # 屏幕高度
start = False # 开始游戏控制
snakeBody = [[100, 100], [80, 100], [60, 100]] # 这里坐标好像不对,蛇是20像素的矩形
snakePosition = [100, 100] # 蛇头的初始位置(像素坐标)
applePosition = [260, 200] # 苹果的初始位置(像素坐标)
direction = 'right' # 蛇运动的初始方向
fpsClock = pygame.time.Clock() # 时钟对象用于设置fps
窗体设置
pygame.init()
playscreen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("贪吃蛇")
游戏结束
def gameover():
global start
start = False
pygame.display.update()
draw_string = "游戏结束,游戏得分:{}".format(points)
font1 = pygame.font.SysFont("SimHei", 50)
text1 = font1.render(draw_string, True, GREEN) # 第二个参数为是否反锯齿
playscreen.blit(text1, (50, 300))
通过键盘事件控制方向
def getKeyboardDirection(direction):
global speed,start
new_direction = direction #如果方向没有被改变,就返回原来的方向
for event in pygame.event.get():
# 退出事件
if event.type == QUIT:
pygame.quit()
sys.exit()
# 判断键盘事件
elif event.type == KEYDOWN:
# 向右移动
if event.key == K_d or event.key == K_RIGHT:
if not direction == 'left': # 只能转弯、不能掉头
new_direction = 'right'
# 向左移动
elif event.key == K_a or event.key == K_LEFT:
if not direction == 'right':
new_direction = 'left'
# 向上移动
elif event.key == K_w or event.key == K_UP:
if not direction == 'down':
new_direction = 'up'
# 向下移动
elif event.key == K_s or event.key == K_DOWN:
if not direction == 'up':
new_direction = 'down'
# 按下+,速度加1
elif event.key == K_KP_PLUS:
speed += 1
# 按下-,速度减1
elif event.key == K_KP_MINUS:
speed -= 1
# 按空格开始,再按停止
elif event.key == K_SPACE:
start = not start
# 遵循结构化设计原则,单一出口
return new_direction
网格线绘制
def Drawline():
# 竖线
for k in range(one_grid, screen_width, one_grid): # 边界不用画线
pygame.draw.line(playscreen, GREY, [k, 0], [k, screen_height])
# 横线
for k in range(one_grid, screen_height, one_grid):
pygame.draw.line(playscreen, GREY, [0, k], [screen_width, k])
# 绘制蛇的身体
for k in snakeBody:
pygame.draw.rect(playscreen, RED, Rect(k[0], k[1], one_grid, one_grid)) # pygame.Rect对象
文字绘制
def DrawText():
draw_string = "游戏速度:" + str(speed) + " 游戏得分:" + str(points)
font1 = pygame.font.SysFont("SimHei", 30)
text1 = font1.render(draw_string, True, GREEN) # 第二个参数为是否反锯齿
playscreen.blit(text1, (150, 20))
蛇移动
def SnakeMove(direction):
if start:
if direction == 'right':
snakePosition[0] += one_grid
if direction == 'left':
snakePosition[0] -= one_grid
if direction == 'down':
snakePosition[1] += one_grid
if direction == 'up':
snakePosition[1] -= one_grid
snakeBody.insert(0, list(snakePosition))
snakeBody.pop(len(snakeBody) - 1)
playscreen.fill(BLACK)
撞墙
def Crash_wall(snakePosition):
if snakePosition[0]<0 or snakePosition[0]>=screen_width or snakePosition[1]<0 or snakePosition[1]>=screen_height:
gameover()
撞自己
def Crash_own():
j = 0
for i in snakeBody:
j += 1
# 如果头撞到身体则游戏失败,当然必须排除自己的头
if j == 1:
continue
if operator.eq([snakePosition[0],snakePosition[1]],i):
gameover()
吃苹果
def eatApple(snakePosition):
global applePosition,points,speed
if snakePosition[0] == applePosition[0] and snakePosition[1] == applePosition[1]:
snakeBody.insert(0, list(snakePosition))
applePosition=[random.randrange(0,screen_width,one_grid),random.randrange(0,screen_height,one_grid)]
points += 5
speed += 0.5
random_color = (random.randint(0,255),random.randint(0,255),random.randint(0,255)) # 彩色苹果
pygame.draw.rect(playscreen, random_color, Rect(applePosition[0], applePosition[1], one_grid, one_grid))
if __name__ == "__main__":
while True:
direction = getKeyboardDirection(direction)
SnakeMove(direction)
Crash_wall(snakePosition)
DrawText()
Drawline()
Crash_own()
eatApple(snakePosition)
pygame.display.flip() # 更新整个待显示的 Surface 对象到屏幕上
fpsClock.tick(speed) # 更新刷新率