一、作品展示
二、作品分析与制作
2.1 素材简介
1个字体文件,5个音乐文件(点击“阅读原文”可获取)

2.2 设置游戏窗口
任务1:创建一个宽300高300,背景为白色的游戏窗口,并监测窗口事件,点击关闭窗口按钮,窗口关闭

import pygameimport syspygame.init()# 设置屏幕的尺寸(宽300,高300)screen_size = screen_width, screen_height = 300, 300# 创建窗口screen = pygame.display.set_mode(screen_size)# 设置窗口标题pygame.display.set_caption("贪吃蛇")# 设置颜色black = (0, 0, 0)white = (255, 255, 255)red = (255, 0, 0)green = (0, 255, 0)blue = (0, 0, 255)running = Truewhile running: # 将屏幕背景设置白色 screen.fill(white) # 监测窗口事件 for event in pygame.event.get(): if event.type == pygame.QUIT: running = False pygame.quit() sys.exit() # 刷新画面 pygame.display.flip()
2.3 蛇
任务2:将蛇头和蛇身显示在界面上,并使其移动,按上下左右键,可以改变蛇移动的方向

2.3.1 绘制蛇
设置关于蛇的数据结构,使用二维列表来装蛇的数据,例如:[150, 150, "L"]分别表示当前蛇某个节点的x坐标和y坐标还有移动方向,初始蛇有1节蛇头,4节蛇尾,1个蛇节点宽10高10,数据分别如下:
[[150, 150, "L"],[160, 150, "L"],[170, 150, "L"],[180, 150, "L"],[190, 150, "L"]]
1)初始化蛇的数据
# 设置1个蛇节点的大小snake_size = snake_width, snake_height = 10, 10# 设置蛇的数据,[x坐标,y坐标,方向]snake = [[150, 150, "L"]]for i in range(1, 5): snake.append([150 + i * 10, 150, i])
2)绘制蛇头和蛇尾
pygame.draw.rect(surface, color, rect, width),pygame里面的draw绘制模块中的rect方法用于绘制矩形
(1)surface绘制的目标画布(比如游戏窗口 screen),是Pygame的Surface对象
(2)color矩形的颜色,可用RGB元组(如 (255,0,0) 红色)或Pygame预定义颜色
(3)rect矩形的位置和尺寸,有两种写法:
(3.1)元组 (x, y, width, height)【x/y 是左上角坐标,width/height 是宽高】
(3.2)Pygame的Rect对象
(4)width可选,边框宽度。默认0表示填充整个矩形;大于0表示仅绘制边框(数值是边框像素数);小于0无效果

2.3.2 移动
1)创建move()方法,根据snake数组中的方向修改x,y坐标
def move(): for i in range(len(snake) - 1, -1, -1): if snake[i][2] == "L": # 向左移动,x坐标-10 snake[i][0] -= snake_width elif snake[i][2] == "R": # 向右移动,x坐标+10 snake[i][0] += snake_width elif snake[i][2] == "U": # 向上移动,y坐标-10 snake[i][1] -= snake_height elif snake[i][2] == "D": # 向下移动,y坐标+10 snake[i][1] += snake_height if i > 0: # 更新方向,后面一个蛇节的方向是上一个蛇节的方向 snake[i][2] = snake[i - 1][2]
2)直接的调用move()方法,移动速度太快,效果显示不出来,需要先设置到合适的帧率

2.3.3 控制方向
1)监测按键事件,根据上下左右按键,将蛇头的方向改变,但是不能直接修改,如果蛇头原来的方向是右边,按下左键时无效,不能直接将蛇头的方向设置为左,只有是其他三种方向时,才能修改方向成功
def change_direction(event): if event.type == pygame.KEYDOWN: if event.key == pygame.K_UP: if snake[0][2] != "D": snake[0][2] = "U" elif event.key == pygame.K_DOWN: if snake[0][2] != "U": snake[0][2] = "D" elif event.key == pygame.K_LEFT: if snake[0][2] != "R": snake[0][2] = "L" elif event.key == pygame.K_RIGHT: if snake[0][2] != "L": snake[0][2] = "R
2)在监测窗口事件时,调用这个方法

2.4 食物
任务3:食物随机出现在界面上,如果食物被蛇吃掉,蛇身长大1节,界面左上角分数加1,刷新食物在新的位置上

2.4.1 绘制食物
1)导入随机模块
import random
2)使用随机模块中的randrange(start, stop, step)方法,随机生成食物的位置,设置食物的大小,使用draw模块中的rect绘制矩形方法,绘制食物
(1)start可选,序列的起始值(包含),默认值为0
(2)stop必填,序列的结束值(不包含),生成的随机数一定小于该值
(3)step可选,序列的步长(间隔),默认值为1,必须是整数且不能为0

2.4.2 吃食物
1)创建eat_food()方法,检测是否吃到食物,创建方法之前记得新建分数变量score
def eat_food(): global snake, food_x, food_y, score # 如果蛇头和食物的位置重合 if food_x == snake[0][0] and food_y == snake[0][1]: # 获取蛇最后1节身体的数据 x = snake[len(snake) - 1][0] y = snake[len(snake) - 1][1] d = snake[len(snake) - 1][2] # 根据方向,决定蛇新长大的1节身体的位置 if d == "L": x += 10 elif d == "U": y += 10 elif d == "R": x -= 10 elif d == "D": y -= 10 snake.append([x, y, d]) # 重新设置食物的位置 food_x = random.randrange(0, screen_width, snake_width) food_y = random.randrange(0, screen_height, snake_height) # 分数增加1 score += 1
2)调用eat_food()方法

2.4.3 显示分数
1)创建显示文字方法fill_text(text, position)
def fill_text(text, position, color, size): textFont = pygame.font.Font("./fonts/font.ttf", size) newText = textFont.render(text, True, color) screen.blit(newText, position)
2)调用该函数

2.5 游戏结束
任务4:为游戏添加背景音乐和音效,如果蛇头咬到自己游戏结束,如果蛇头撞到窗口边界游戏结束
2.5.1 游戏结束
1)创建游戏结束的方法
def game_over(): # 出界判断(屏幕宽度) if not (snake[0][0] >= 0 and snake[0][0] <= screen_width and snake[0][1] >= 0 and snake[0][1] <= screen_height): return True # 咬到身体判断 for i in range(1, len(snake)): if snake[0][0] == snake[i][0] and snake[0][1] == snake[i][1]: return True return False
2)调用游戏结束方法

2.5.2 音乐与音效
1)加载播放背景音乐,加载音效文件
pygame.mixer.music.load()加载音乐
pygame.mixer.music.play(-1)循环播放音乐,-1是循环播放,如果是正数则是播放的次数
pygame.mixer.Sound()加载音效文件
XX.set_volume(1)设置音量
# 加载背景音乐文件,设置播放pygame.mixer.music.load(r'./music/bgmusic.wav')# -1循环播放 正数播放次数pygame.mixer.music.play(-1)# 加载音效文件,设置音效eat = pygame.mixer.Sound(r'./music/eatapple.wav')hit = pygame.mixer.Sound(r'./music/hitwall.wav')# 调节音量eat.set_volume(1)hit.set_volume(1)
2)根据不同的情况播放不同的音效
(1)吃到食物时,播放吃的音效

(2)出界或者蛇头咬到自己身体的时候,播放撞击的声音

(3)游戏结束的时候,停止播放背景音乐

2.5.3 修复问题
任务5:修复游戏撞墙或者咬到自己时,重复播放音效的问题
