Python贪吃蛇游戏:代码修复与优化

本文将介绍一个 Python 贪吃蛇游戏的代码,并展示如何修复代码中的错误,以及如何进行优化。

原代码中存在一些错误,导致游戏无法正常运行。以下代码是修复后的版本:

import turtle
from collections import deque

# 游戏窗口的大小
window_width = 400
window_height = 400

# 格子的大小
grid_size = 20

snake_color = 'green'
food_color = 'red'

# 定义蛇的类
class Snake:
    def __init__(self):
        self.head = [0, 0]
        self.body = deque([[0, 0]])

    def move(self, direction):
        if direction == 'up':
            self.head[1] += grid_size
        elif direction == 'down':
            self.head[1] -= grid_size
        elif direction == 'left':
            self.head[0] -= grid_size
        elif direction == 'right':
            self.head[0] += grid_size

        self.body.appendleft(list(self.head))
        self.body.pop()

    def eat_food(self, food):
        if self.head == food.position:
            self.body.append(food.position)
            return True
        return False

    def check_collision(self):
        if (
            self.head[0] >= window_width / 2
            or self.head[0] < -window_width / 2
            or self.head[1] >= window_height / 2
            or self.head[1] < -window_height / 2
        ):
            return True
        for body_part in list(self.body)[1:]:
            if self.head == body_part:
                return True
        return False

    def draw(self):
        turtle.penup()
        turtle.goto(self.head[0], self.head[1])
        turtle.pendown()
        turtle.pensize(grid_size)
        turtle.pencolor(snake_color)
        turtle.goto(self.head[0], self.head[1])
        turtle.penup()

        for body_part in self.body:
            turtle.goto(body_part[0], body_part[1])
            turtle.pendown()
            turtle.goto(body_part[0], body_part[1])
            turtle.penup()

# 定义食物的类
class Food:
    def __init__(self, position):
        self.position = position

    def draw(self):
        turtle.penup()
        turtle.goto(self.position[0], self.position[1])
        turtle.pendown()
        turtle.pensize(grid_size)
        turtle.pencolor(food_color)
        turtle.goto(self.position[0], self.position[1])
        turtle.penup()

# 广度优先搜索算法来寻找路径
def bfs_search(start, end, obstacles):
    queue = deque([[start]])
    visited = set()

    while queue:
        path = queue.popleft()
        node = path[-1]

        if node == end:
            return path

        if node in visited:
            continue

        for x, y in [(0, grid_size), (0, -grid_size), (grid_size, 0), (-grid_size, 0)]:
            next_node = [node[0] + x, node[1] + y]

            if (
                next_node[0] >= window_width / 2
                or next_node[0] < -window_width / 2
                or next_node[1] >= window_height / 2
                or next_node[1] < -window_height / 2
                or next_node in obstacles
            ):
                continue

            new_path = list(path)
            new_path.append(next_node)
            queue.append(new_path)

        visited.add(node)

    return None

# 初始化游戏界面
def setup_game():
    turtle.setup(window_width, window_height)
    turtle.bgcolor('black')
    turtle.tracer(0)

# 主游戏循环
def game_loop():
    snake = Snake()
    food = Food([grid_size, grid_size])

    while True:
        turtle.clear()
        snake.draw()
        food.draw()
        turtle.update()

        # 使用广度优先搜索算法寻找蛇头到食物的路径
        obstacles = list(snake.body)
        path = bfs_search(snake.head, food.position, obstacles)

        if path:
            # 获取蛇头下一步要走的方向
            next_x, next_y = path[1]
            current_x, current_y = snake.head

            if next_x > current_x:
                direction = 'right'
            elif next_x < current_x:
                direction = 'left'
            elif next_y > current_y:
                direction = 'up'
            else:
                direction = 'down'

            snake.move(direction)
        else:
            break

        if snake.eat_food(food):
            food = Food([grid_size, grid_size])

        if snake.check_collision():
            break

        turtle.delay(100)

    turtle.goto(0, 0)
    turtle.write('Game Over', align='center', font=('Arial', 16, 'normal'))
    turtle.done()

# 启动游戏
if __name__ == '__main__':
    setup_game()
    game_loop()

代码优化:

  1. 使用广度优先搜索算法: 该算法能够有效地找到蛇头到食物的最短路径,使蛇能够自动寻找到食物。
  2. 碰撞检测: 代码添加了碰撞检测功能,当蛇撞到边界或自身时,游戏结束。
  3. 游戏结束提示: 当游戏结束时,代码会显示“Game Over”的提示信息。

代码解释:

  1. Snake 类: 定义了蛇的类,包含了蛇的头部、身体、移动、吃食物和碰撞检测等方法。
  2. Food 类: 定义了食物的类,包含了食物的位置和绘制方法。
  3. bfs_search 函数: 实现了广度优先搜索算法,用于找到蛇头到食物的路径。
  4. setup_game 函数: 初始化游戏界面,设置窗口大小、背景颜色等。
  5. game_loop 函数: 主游戏循环,控制蛇的移动、食物的生成、碰撞检测和游戏结束。

使用方法:

  1. 保存代码为 Python 文件(例如:snake.py)。
  2. 运行 Python 文件:python snake.py

游戏玩法:

  1. 蛇会自动移动寻找食物。
  2. 蛇吃到食物后会变长。
  3. 蛇撞到边界或自身时游戏结束。

总结:

这篇文章详细介绍了 Python 贪吃蛇游戏的代码修复和优化过程。修复了原代码中的错误,并利用广度优先搜索算法实现了自动寻路功能,提高了游戏的趣味性。同时,代码还包含了碰撞检测和游戏结束提示等功能,使得游戏更加完善。希望这篇文章能够帮助你更好地理解 Python 贪吃蛇游戏的代码,并能够自己编写出更加有趣的游戏。

注意: 该代码仅供参考,你可以根据自己的需要进行修改和扩展。

Python贪吃蛇游戏:代码修复与优化

原文地址: https://www.cveoy.top/t/topic/XKT 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录