当前位置:首页>python>Python实战-贪吃蛇

Python实战-贪吃蛇

  • 2026-08-25 21:46:27
Python实战-贪吃蛇

一、作品展示

二、作品分析与制作

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:修复游戏撞墙或者咬到自己时,重复播放音效的问题

最新文章

随机文章