蛇身无法新增方块问题求助: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
相关产品推荐
相关产品推荐

