Python贪吃蛇核心功能实现(上):移动与基础框架

陆景行
陆景行
发布时间:2026-10-16| 5人浏览过
原创

本文详解使用Python和Pygame构建贪吃蛇游戏的基础框架。重点解析蛇身数据的列表管理、基于坐标的移动算法、碰撞检测机制以及键盘控制逻辑。通过调整刷新率解决移动过快问题,并实现防止反向掉头的基础规则,为后续添加食物和双人模式奠定核心基础。

贪吃蛇基础框架与初始化

本次教程将构建一个最基础的贪吃蛇原型:在屏幕上实现小蛇的移动,并允许玩家控制其方向,但暂不包含吃食物和身体变长的功能。尽管功能简化,但核心逻辑已具备,完整版的贪吃蛇乃至双人模式也就指日可待。

先实现这个简化版本,后续有机会再补充标准版及双人版的代码。

首先配置Pygame环境,直接沿用之前的参数设置,保持配置的一致性。

import random
import time
import pygame
fps = 30
fps_clock = pygame.time.Clock()
screen_width = 640
screen_height = 480
display = pygame.display.set_mode((screen_width, screen_height), 0, 32)
pygame.display.set_caption('贪食蛇')
tile_size = 20
tile_width = 20
tile_height = 20
#横纵间距
x_margin = 100
y_margin = 100
#列
columns = int((screen_width - 100) / 20)
#行
rows = int((screen_height - 100) / 20)
directions = ['up', 'down', 'left', 'right']
#配色RGB
white = 'white'
black = 'black'
bg_color = 'sky blue'
border_color = white
if __name__ == '__main__':
    while True:
        display.fill(bg_color)
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
        pygame.display.update()
        fps_clock.tick(fps)

编写基础配置函数,这是棋盘类游戏的常规初始化操作。

运行程序后,将显示一个纯天蓝色的空白画布。

棋盘绘制与蛇身数据管理

接下来,在画布上绘制二维棋盘,即贪蛇运动的场地。这里采用一种简化策略:不将整个棋盘映射为二维列表,而是仅创建一个列表来存储贪吃蛇身体的坐标数据。

首先绘制棋盘网格。

def draw_chest():
    for i in range(rows + 1):
        pygame.draw.line(display, border_color, (x_margin/2, y_margin/2 + i * tile_size),
                         (x_margin/2 + (columns * tile_size), y_margin/2 + i * tile_size), 2)
    for j in range(columns + 1):
        pygame.draw.line(display, border_color, (x_margin/2 + j * tile_size, y_margin/2),
                         (x_margin/2 + j * tile_size, y_margin/2 + (rows * tile_size)), 2)

在主循环中调用该绘制函数并运行程序。

此时,贪吃蛇的运动空间已显现。

创建一个列表用于存储贪吃蛇的身体坐标,默认初始长度为3。具体长度可根据需求调整,此处固定为3。

基于坐标数值生成蛇身的初始位置。例如,若初始坐标为[3][3],则在屏幕对应位置绘制小方块。默认蛇身向右延伸,因此身体参数列表为[[3][3], [3][4], [3][5]]。

为使蛇随机出现在画面非边缘区域,生成坐标时需考虑边界限制,随机数范围设定如下:

在主循环外初始化列表并添加身体,确保蛇始终位于画面中央区域。

snake_body = []
    snake_x = random.randint(5, rows - 5)
    snake_y = random.randint(5, columns - 5)
    snake_body.append([snake_x, snake_y])
    snake_body.append([snake_x, snake_y + 1])
    snake_body.append([snake_x, snake_y + 2])
    return snake_body

编写绘制蛇身的函数。

def draw_snake_shape(shapes):
    for shape in shapes:
        left_position = shape[1] * tile_size + x_margin/2
        top_position = shape[0] * tile_size + y_margin/2
        # 画出整个身体背景色
        pygame.draw.rect(display, body_color, (left_position, top_position, tile_size, tile_size))
        # 画出内部颜色
        pygame.draw.rect(display, inter_body_color, (left_position+4, top_position+4, tile_size-8, tile_size-8))

在主循环中调用该函数并运行游戏。每次运行时,蛇的位置不同且不会出现在边缘。

蛇身移动算法与刷新率控制

接下来实现蛇的移动功能。

移动的核心逻辑是根据当前前进方向,对snake_body列表进行坐标值的增加与删除。例如,若下一步方向为up(上),且确认向上移动不越界或当前未向下移动,则计算新坐标并加入列表头部,同时删除列表尾部数据(因暂无食物可吃)。

首先定义一个函数,用于判断下一个坐标点是否合法。

def is_right_direction(body, x_location, y_location):
    valid_direction = False
    if 0 <= x_location <= rows-1 and 0 <= y_location <= columns - 1:
        valid_direction = True
    return valid_direction

在主循环中加入处理贪吃蛇按固定方向移动的代码逻辑。

在进入主循环前,获取当前需要移动的方向。

direction = directions[random.randint(0, 3)]
    while True:

在主循环内部,增加代码以处理身体移动的具体操作。

#未按下按键时,默认的初识移动方向
        new_body_location = (None, None)
        match direction:
            case 'left':
                new_body_location = snake_body[0][0], snake_body[0][1] - 1
            case 'right':
                new_body_location = snake_body[0][0], snake_body[0][1] + 1
            case 'up':
                new_body_location = snake_body[0][0] - 1, snake_body[0][1]
            case 'down':
                new_body_location = snake_body[0][0] + 1, snake_body[0][1]
        snake_body.insert(0, new_body_location)
        del snake_body[-1]

此时运行程序,贪吃蛇会极速移动至屏幕边缘。

由于刷新率设置为30帧每秒,移动速度过快导致无法截图。解决方案最简单的是修改刷新率,例如改为2帧每秒,即可看到蛇缓慢移动。也可在移动部分添加定时或累加延迟逻辑。此处直接修改fps=2。

键盘控制与碰撞检测机制

接下来增加控制模块,这部分逻辑较为简单。

在按键处理中设定上下左右方向键控制蛇的方向,同时需确保贪吃蛇不能直接掉头反向移动。

#键盘控制改变贪食蛇的方向
            elif event.type == pygame.KEYUP:
                if event.key == pygame.K_LEFT and direction != 'right':
                    direction = 'left'
                elif event.key == pygame.K_RIGHT and direction != 'left':
                    direction = 'right'
                elif event.key == pygame.K_UP and direction != 'down':
                    direction = 'up'
                elif event.key == pygame.K_DOWN and direction != 'up':
                    direction = 'down'

实现游戏结束机制:当蛇碰到边界时游戏终止。

        if is_right_direction(snake_body, new_body_location[0], new_body_location[1]):
            snake_body.insert(0, new_body_location)
            del snake_body[-1]
        else:
            snake_body = []
            snake_x = random.randint(5, columns - 5)
            snake_y = random.randint(5, rows - 5)
            snake_body.append([snake_x, snake_y])
            snake_body.append([snake_x, snake_y + 1])
            snake_body.append([snake_x, snake_y + 2])

框架级别的贪吃蛇制作已完成。若再添加一个小苹果及身体增长条件,即可构成完整贪吃蛇。追加追尾机制和第二条蛇后,即可实现双人对战。

到此,关于Python贪吃蛇核心功能实现(上)的介绍结束。更多相关内容请搜索本站历史文章或继续浏览后续文章,感谢支持!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。