Python贪吃蛇核心功能实现(上):移动与基础框架
本文详解使用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贪吃蛇核心功能实现(上)的介绍结束。更多相关内容请搜索本站历史文章或继续浏览后续文章,感谢支持!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













