You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

蛇身无法新增方块问题求助:Python Pygame贪吃蛇代码排查

贪吃蛇游戏蛇身无法新增方块的问题解决

我跟着教程开发贪吃蛇游戏,代码能正常运行,但蛇身尾部没法新增方块,达不到预期效果。已经调用了对应类和函数,怀疑问题出在move_snake和add_block方法里,但不确定。

原代码:

class SNAKE:
    def __init__(self):
        self.body = [Vector2(5,10),Vector2(6,10),Vector2(7,10)]
        self.direction = Vector2(1,0)
        self.New_block = False

    def draw_snake(self):
        for block in self.body:
            x_pos = int(block.x * cell_size)
            y_pos = int(block.y * cell_size)
            block_rect = pygame.Rect(x_pos,y_pos,cell_size,cell_size)
            pygame.draw.rect(screen,pygame.Color('brown'),block_rect)

    def move_snake(self):
        if self.New_block == True:
            body_copy = self.body[:]
            body_copy.insert(0,body_copy[0] + self.direction)
            self.body = body_copy[:]
        else:
            body_copy = self.body[:-1]
            body_copy.insert(0,body_copy[0] + self.direction)
            self.body = body_copy[:]

    def add_block(self):
        self.New_block = True

问题根源

add_block方法仅将New_block设为True,但没有在完成一次蛇身增长后重置这个标记。这会导致第一次触发增长后,New_block始终为True,蛇每次移动都会不断在头部添加方块(而非只增长一次);如果还没触发过增长逻辑,自然不会出现新增方块的效果。

修正方案

在move_snake方法的if分支末尾,添加一行代码重置New_block为False,确保每次只有调用add_block后,才会在一次移动中完成蛇身增长:

修正后的代码:

class SNAKE:
    def __init__(self):
        self.body = [Vector2(5,10),Vector2(6,10),Vector2(7,10)]
        self.direction = Vector2(1,0)
        self.New_block = False

    def draw_snake(self):
        for block in self.body:
            x_pos = int(block.x * cell_size)
            y_pos = int(block.y * cell_size)
            block_rect = pygame.Rect(x_pos,y_pos,cell_size,cell_size)
            pygame.draw.rect(screen,pygame.Color('brown'),block_rect)

    def move_snake(self):
        if self.New_block == True:
            body_copy = self.body[:]
            body_copy.insert(0,body_copy[0] + self.direction)
            self.body = body_copy[:]
            self.New_block = False  # 重置标记,仅在本次移动完成增长
        else:
            body_copy = self.body[:-1]
            body_copy.insert(0,body_copy[0] + self.direction)
            self.body = body_copy[:]

    def add_block(self):
        self.New_block = True

逻辑说明

当蛇吃到食物调用add_block时,New_block变为True;下一次执行move_snake时,会保留原有蛇身的所有方块,同时在头部新增一个方块(完成增长),随后立刻重置New_block为False,后续移动将恢复正常的“头部前进、尾部删除”逻辑,不会持续增长。

内容的提问来源于stack exchange,提问作者Temmy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 03:15:48