用Python加ai调教写了一个经典贪吃蛇游戏

2025-03-08 87 0

上了一天的班,下课后在办公室闲来无事就调节ai给我写一个带有界面的贪吃蛇游戏,下图还第一版:

然后不断的给提出需求,然后调节界面排版,还有测试程序后来修复程序中的BUG,根据需求迭代升级了十几次后,得到了以下最终版。请看演示图:

大家需要下载游玩的话,成品在文章底部即可下载(把杀毒软件关闭,会误报!)然后大家也可以拿到源码根据自己的需求来进行改进!

成品源码:

import tkinter as tk
import random
from tkinter import messagebox

class SnakeGame:
    def __init__(self, root):
        self.root = root
        self.root.title("贪吃蛇游戏")
        self.root.resizable(False, False)

        # 游戏画布
        self.canvas = tk.Canvas(root, width=400, height=400, bg="black")
        self.canvas.pack()

        # 分数和生命值
        self.score = 0
        self.lives = 3
        self.snake = [(200, 200), (190, 200), (180, 200)]
        self.snake_direction = "Right"
        self.food = None  # 初始化不创建食物
        self.game_over = False
        self.game_paused = False
        self.speed = 100
        self.game_active = False  # 游戏状态标记

        # 创建分数和生命值框
        self.info_frame = tk.Frame(root, bg="white", bd=2, relief="groove")
        self.info_frame.pack(pady=10)

        self.score_label = tk.Label(self.info_frame, text="分数: 0", font=("Arial", 14), fg="black", bg="white")
        self.score_label.pack()

        self.lives_label = tk.Label(self.info_frame, text="生命值: 3", font=("Arial", 14), fg="black", bg="white")
        self.lives_label.pack()

        self.game_state_label = tk.Label(self.info_frame, text="按开始按钮开始游戏", font=("Arial", 14), fg="black",
                                          bg="white")
        self.game_state_label.pack()

        # 快捷键说明标签
        self.shortcut_label1 = tk.Label(root, text="快捷键 + 代表加速", font=("Arial", 12), fg="black", bg="white")
        self.shortcut_label1.pack()

        self.shortcut_label2 = tk.Label(root, text="快捷键 - 代表减速", font=("Arial", 12), fg="black", bg="white")
        self.shortcut_label2.pack()

        # 按钮框架
        self.button_frame = tk.Frame(root)
        self.button_frame.pack(pady=10)

        self.start_button = tk.Button(self.button_frame, text="开始游戏", command=self.start_game)
        self.start_button.grid(row=0, column=0, padx=10)

        self.pause_button = tk.Button(self.button_frame, text="暂停游戏", command=self.pause_game, state=tk.DISABLED)
        self.pause_button.grid(row=0, column=1, padx=10)

        self.speed_increase_button = tk.Button(self.button_frame, text="加速", command=self.increase_speed,
                                               state=tk.DISABLED)
        self.speed_increase_button.grid(row=0, column=2, padx=10)

        self.speed_decrease_button = tk.Button(self.button_frame, text="减速", command=self.decrease_speed,
                                               state=tk.DISABLED)
        self.speed_decrease_button.grid(row=0, column=3, padx=10)

        self.save_button = tk.Button(self.button_frame, text="存档", command=self.save_game, state=tk.DISABLED)
        self.save_button.grid(row=0, column=4, padx=10)

        self.load_button = tk.Button(self.button_frame, text="加载游戏", command=self.load_game)
        self.load_button.grid(row=0, column=5, padx=10)

        self.reset_button = tk.Button(self.button_frame, text="重置游戏", command=self.reset_game)
        self.reset_button.grid(row=0, column=6, padx=10)

        self.bind_keys()

        # 初始化显示“贪吃蛇”三个字
        self.snake_text = self.canvas.create_text(200, 200, text="经典贪吃蛇", fill="green", font=("Arial", 40, "bold"))

    def create_food(self):
        x = random.randint(0, 39) * 10
        y = random.randint(0, 39) * 10
        while (x, y) in self.snake:
            x = random.randint(0, 39) * 10
            y = random.randint(0, 39) * 10
        self.food = (x, y)  # 仅返回位置,不绘制
        self.canvas.create_rectangle(x, y, x + 10, y + 10, fill="red", tag="food")

    def update_game(self):
        if not self.game_over and not self.game_paused:
            new_head = self.move_snake()
            if self.check_collision(new_head):
                # 减少生命值
                self.lives -= 1
                self.lives_label.config(text=f"生命值: {self.lives}")
                if self.lives <= 0:
                    self.game_over = True
                    self.display_game_over()  # 在画布上显示游戏结束文本
                    self.disable_game_buttons()  # 禁用按钮
                    return

                self.reset_snake_and_food()
            else:
                self.snake.insert(0, new_head)
                if new_head == self.food:
                    self.score += 1
                    self.score_label.config(text=f"分数: {self.score}")
                    self.canvas.delete("food")
                    self.create_food()  # 创建新的食物
                else:
                    self.snake.pop()
            self.update_canvas()
            self.root.after(self.speed, self.update_game)

    def display_game_over(self):
        self.canvas.create_text(200, 200, text="游戏结束", fill="green", font=("Arial", 40, "bold"))

    def reset_snake_and_food(self):
        self.snake = [(200, 200), (190, 200), (180, 200)]
        self.snake_direction = "Right"
        self.create_food()  # 在减去生命值时创建新的食物

    def move_snake(self):
        head_x, head_y = self.snake[0]
        if self.snake_direction == "Right":
            return head_x + 10, head_y
        elif self.snake_direction == "Left":
            return head_x - 10, head_y
        elif self.snake_direction == "Up":
            return head_x, head_y - 10
        elif self.snake_direction == "Down":
            return head_x, head_y + 10

    def check_collision(self, new_head):
        x, y = new_head
        if x < 0 or x >= 400 or y < 0 or y >= 400:
            return True
        if new_head in self.snake[1:]:
            return True
        return False

    def update_canvas(self):
        self.canvas.delete("all")
        if self.food:  # 只有在存在食物时才绘制
            self.canvas.create_rectangle(self.food[0], self.food[1], self.food[0] + 10, self.food[1] + 10, fill="red",
                                         tag="food")
        for segment in self.snake:
            self.canvas.create_rectangle(segment[0], segment[1], segment[0] + 10, segment[1] + 10, fill="green")

    def bind_keys(self):
        self.root.bind("<Right>", lambda event: self.change_direction("Right"))
        self.root.bind("<Left>", lambda event: self.change_direction("Left"))
        self.root.bind("<Up>", lambda event: self.change_direction("Up"))
        self.root.bind("<Down>", lambda event: self.change_direction("Down"))
        # 绑定加速和减速快捷键
        self.root.bind("+", lambda event: self.increase_speed() if not self.game_paused else None)
        self.root.bind("-", lambda event: self.decrease_speed() if not self.game_paused else None)

    def change_direction(self, direction):
        if (direction == "Right" and self.snake_direction != "Left" or
                direction == "Left" and self.snake_direction != "Right" or
                direction == "Up" and self.snake_direction != "Down" or
                direction == "Down" and self.snake_direction != "Up"):
            self.snake_direction = direction

    def start_game(self):
        if not self.game_over:
            self.game_state_label.config(text="游戏进行中", fg="black", bg="white")
            self.start_button.config(state=tk.DISABLED)
            self.pause_button.config(state=tk.NORMAL)
            self.speed_increase_button.config(state=tk.NORMAL)
            self.speed_decrease_button.config(state=tk.NORMAL)
            self.save_button.config(state=tk.NORMAL)
            self.game_active = True

            # 清除“贪吃蛇”三个字
            self.canvas.delete(self.snake_text)  # 将标识符改为搜索在canvas上
            self.create_food()  # 游戏开始时创建初始食物
            self.update_game()

    def pause_game(self):
        if self.game_active:
            self.game_paused = not self.game_paused
            if self.game_paused:
                self.game_state_label.config(text="游戏暂停", fg="yellow", bg="white")
                self.pause_button.config(text="继续游戏")
            else:
                self.game_state_label.config(text="游戏进行中", fg="black", bg="white")
                self.pause_button.config(text="暂停游戏")
                self.update_game()  # 恢复游戏时重新启动游戏循环

    def increase_speed(self):
        if self.speed > 50:
            self.speed -= 10
            self.game_state_label.config(text=f"速度增加到: {400 - self.speed}ms", fg="black", bg="white")

    def decrease_speed(self):
        if self.speed < 200:
            self.speed += 10
            self.game_state_label.config(text=f"速度减少到: {400 - self.speed}ms", fg="black", bg="white")

    def save_game(self):
        with open("savegame.txt", "w") as file:
            file.write(f"{self.score}\n")
            file.write(f"{self.lives}\n")
            file.write(f"{self.snake_direction}\n")
            file.write(f"{self.speed}\n")
            file.write(str(self.snake) + "\n")  # 使用str()确保列表可以正确保存
            file.write(str(self.food) + "\n")    # 使用str()确保元组可以正确保存
        self.game_state_label.config(text="游戏已存档", fg="black", bg="white")

    def load_game(self):
        try:
            with open("savegame.txt", "r") as file:
                self.score = int(file.readline().strip())
                self.lives = int(file.readline().strip())
                self.snake_direction = file.readline().strip()
                self.speed = int(file.readline().strip())
                self.snake = eval(file.readline().strip())
                self.food = eval(file.readline().strip())
            self.score_label.config(text=f"分数: {self.score}")
            self.lives_label.config(text=f"生命值: {self.lives}")
            self.game_state_label.config(text="游戏已加载", fg="black", bg="white")
            self.update_canvas()
            self.start_button.config(state=tk.DISABLED)
            self.pause_button.config(state=tk.NORMAL)
            self.speed_increase_button.config(state=tk.NORMAL)
            self.speed_decrease_button.config(state=tk.NORMAL)
            self.save_button.config(state=tk.NORMAL)
            self.game_active = True
            self.update_game()
        except FileNotFoundError:
            self.game_state_label.config(text="没有找到存档", fg="red", bg="white")

    def reset_game(self):
        self.snake = [(200, 200), (190, 200), (180, 200)]
        self.snake_direction = "Right"
        self.food = None  # 重置食物为None
        self.score = 0
        self.lives = 3
        self.game_over = False
        self.game_paused = False
        self.speed = 100
        self.game_state_label.config(text="游戏已重置", fg="black", bg="white")
        self.update_canvas()
        self.start_button.config(state=tk.NORMAL)
        self.pause_button.config(state=tk.DISABLED)
        self.speed_increase_button.config(state=tk.DISABLED)
        self.speed_decrease_button.config(state=tk.DISABLED)
        self.save_button.config(state=tk.DISABLED)

        # 重新显示“贪吃蛇”三个字
        self.snake_text = self.canvas.create_text(200, 200, text="贪吃蛇", fill="green", font=("Arial", 40, "bold"))

    def disable_game_buttons(self):
        self.pause_button.config(state=tk.DISABLED)
        self.speed_increase_button.config(state=tk.DISABLED)
        self.speed_decrease_button.config(state=tk.DISABLED)
        self.save_button.config(state=tk.DISABLED)
        self.start_button.config(state=tk.DISABLED)

if __name__ == "__main__":
    root = tk.Tk()
    game = SnakeGame(root)
    root.mainloop()

注释学习版:

import tkinter as tk  # 导入tkinter库,用于创建GUI界面
import random         # 导入random库,用于生成随机数
from tkinter import messagebox  # 导入messagebox模块,用于显示消息对话框

class SnakeGame:
    def __init__(self, root):  # 初始化游戏类,root为Tkinter的主窗口
        self.root = root  # 保存主窗口对象
        self.root.title("贪吃蛇游戏")  # 设置窗口标题为"贪吃蛇游戏"
        self.root.resizable(False, False)  # 禁止窗口大小调整

        # 游戏画布
        self.canvas = tk.Canvas(root, width=400, height=400, bg="black")  # 创建一个400x400像素的黑色画布
        self.canvas.pack()  # 将画布添加到窗口中

        # 分数和生命值
        self.score = 0  # 初始化分数为0
        self.lives = 3  # 初始化生命值为3
        self.snake = [(200, 200), (190, 200), (180, 200)]  # 初始化蛇的位置
        self.snake_direction = "Right"  # 初始化蛇的方向为向右
        self.food = None  # 初始化食物为None
        self.game_over = False  # 初始化游戏结束状态为False
        self.game_paused = False  # 初始化游戏暂停状态为False
        self.speed = 100  # 初始化蛇的速度
        self.game_active = False  # 初始化游戏活动状态为False

        # 创建分数和生命值框
        self.info_frame = tk.Frame(root, bg="white", bd=2, relief="groove")  # 创建一个白色背景的框架,用于显示分数和生命值
        self.info_frame.pack(pady=10)  # 将框架添加到窗口中,并设置上下间距为10像素

        self.score_label = tk.Label(self.info_frame, text="分数: 0", font=("Arial", 14), fg="black", bg="white")
        self.score_label.pack()  # 创建分数标签,并将其添加到信息框架中

        self.lives_label = tk.Label(self.info_frame, text="生命值: 3", font=("Arial", 14), fg="black", bg="white")
        self.lives_label.pack()  # 创建生命值标签,并将其添加到信息框架中

        self.game_state_label = tk.Label(self.info_frame, text="按开始按钮开始游戏", font=("Arial", 14), fg="black", bg="white")
        self.game_state_label.pack()  # 创建游戏状态标签,并将其添加到信息框架中

        # 快捷键说明标签
        self.shortcut_label1 = tk.Label(root, text="快捷键 + 代表加速", font=("Arial", 12), fg="black", bg="white")
        self.shortcut_label1.pack()  # 创建快捷键说明标签1,并将其添加到窗口中

        self.shortcut_label2 = tk.Label(root, text="快捷键 - 代表减速", font=("Arial", 12), fg="black", bg="white")
        self.shortcut_label2.pack()  # 创建快捷键说明标签2,并将其添加到窗口中

        # 按钮框架
        self.button_frame = tk.Frame(root)
        self.button_frame.pack(pady=10)  # 创建按钮框架,并将其添加到窗口中

        self.start_button = tk.Button(self.button_frame, text="开始游戏", command=self.start_game)
        self.start_button.grid(row=0, column=0, padx=10)  # 创建开始游戏按钮,并将其添加到按钮框架中

        self.pause_button = tk.Button(self.button_frame, text="暂停游戏", command=self.pause_game, state=tk.DISABLED)
        self.pause_button.grid(row=0, column=1, padx=10)  # 创建暂停游戏按钮,并将其添加到按钮框架中,初始状态为不可用

        self.speed_increase_button = tk.Button(self.button_frame, text="加速", command=self.increase_speed, state=tk.DISABLED)
        self.speed_increase_button.grid(row=0, column=2, padx=10)  # 创建加速按钮,并将其添加到按钮框架中,初始状态为不可用

        self.speed_decrease_button = tk.Button(self.button_frame, text="减速", command=self.decrease_speed, state=tk.DISABLED)
        self.speed_decrease_button.grid(row=0, column=3, padx=10)  # 创建减速按钮,并将其添加到按钮框架中,初始状态为不可用

        self.save_button = tk.Button(self.button_frame, text="存档", command=self.save_game, state=tk.DISABLED)
        self.save_button.grid(row=0, column=4, padx=10)  # 创建存档按钮,并将其添加到按钮框架中,初始状态为不可用

        self.load_button = tk.Button(self.button_frame, text="加载游戏", command=self.load_game)
        self.load_button.grid(row=0, column=5, padx=10)  # 创建加载游戏按钮,并将其添加到按钮框架中

        self.reset_button = tk.Button(self.button_frame, text="重置游戏", command=self.reset_game)
        self.reset_button.grid(row=0, column=6, padx=10)  # 创建重置游戏按钮,并将其添加到按钮框架中

        self.bind_keys()  # 绑定键盘快捷键

        # 初始化显示“经典贪吃蛇”三个字
        self.snake_text = self.canvas.create_text(200, 200, text="经典贪吃蛇", fill="green", font=("Arial", 40, "bold"))
        # 在画布的中间位置创建一个文本“经典贪吃蛇”,颜色为绿色,字体大小为40,粗体

    def create_food(self):
        x = random.randint(0, 39) * 10  # 随机生成食物的x坐标
        y = random.randint(0, 39) * 10  # 随机生成食物的y坐标
        while (x, y) in self.snake:  # 确保食物不在蛇的身体上
            x = random.randint(0, 39) * 10  # 重新生成食物的x坐标
            y = random.randint(0, 39) * 10  # 重新生成食物的y坐标
        self.food = (x, y)  # 保存食物的位置
        self.canvas.create_rectangle(x, y, x + 10, y + 10, fill="red", tag="food")
        # 在画布上绘制食物,颜色为红色

    def update_game(self):
        if not self.game_over and not self.game_paused:  # 如果游戏未结束且未暂停
            new_head = self.move_snake()  # 移动蛇并获取新头部的位置
            if self.check_collision(new_head):  # 检查新头部是否发生碰撞
                # 减少生命值
                self.lives -= 1  # 生命值减1
                self.lives_label.config(text=f"生命值: {self.lives}")  # 更新生命值标签
                if self.lives <= 0:  # 如果生命值为0或以下
                    self.game_over = True  # 设置游戏结束状态为True
                    self.display_game_over()  # 在画布上显示游戏结束信息
                    self.disable_game_buttons()  # 禁用游戏按钮
                    return

                self.reset_snake_and_food()  # 蛇重新开始,食物重新摆放
            else:
                self.snake.insert(0, new_head)  # 将新头部插入蛇的身体
                if new_head == self.food:  # 如果新头部吃到食物
                    self.score += 1  # 分数加1
                    self.score_label.config(text=f"分数: {self.score}")  # 更新分数标签
                    self.canvas.delete("food")  # 删除画布上的食物
                    self.create_food()  # 创建新的食物
                else:
                    self.snake.pop()  # 如果没有吃到食物,移除蛇的身体最后的一个部分
            self.update_canvas()  # 更新画布上的显示
            self.root.after(self.speed, self.update_game)  # 在指定速度后再次调用update_game方法

    def display_game_over(self):
        self.canvas.create_text(200, 200, text="游戏结束", fill="green", font=("Arial", 40, "bold"))
        # 在画布的中间位置创建一个文本“游戏结束”,颜色为绿色,字体大小为40,粗体

    def reset_snake_and_food(self):
        self.snake = [(200, 200), (190, 200), (180, 200)]  # 重置蛇的位置
        self.snake_direction = "Right"  # 重置蛇的方向为向右
        self.create_food()  # 创建新的食物

    def move_snake(self):
        head_x, head_y = self.snake[0]  # 获取蛇头部的位置
        if self.snake_direction == "Right":
            return head_x + 10, head_y  # 如果方向为右,返回向右移动10像素的新头部位置
        elif self.snake_direction == "Left":
            return head_x - 10, head_y  # 如果方向为左,返回向左移动10像素的新头部位置
        elif self.snake_direction == "Up":
            return head_x, head_y - 10  # 如果方向为上,返回向上移动10像素的新头部位置
        elif self.snake_direction == "Down":
            return head_x, head_y + 10  # 如果方向为下,返回向下移动10像素的新头部位置

    def check_collision(self, new_head):
        x, y = new_head  # 获取新头部的位置
        if x < 0 or x >= 400 or y < 0 or y >= 400:
            return True  # 如果新头部超出画布边界,返回True
        if new_head in self.snake[1:]:
            return True  # 如果新头部与蛇身体的其他部分碰撞,返回True
        return False

    def update_canvas(self):
        self.canvas.delete("all")  # 清除画布上所有内容
        if self.food:  # 如果存在食物
            self.canvas.create_rectangle(self.food[0], self.food[1], self.food[0] + 10, self.food[1] + 10, fill="red", tag="food")
            # 在画布上绘制食物,颜色为红色
        for segment in self.snake:
            self.canvas.create_rectangle(segment[0], segment[1], segment[0] + 10, segment[1] + 10, fill="green")
            # 绘制蛇的每一部分,颜色为绿色

    def bind_keys(self):
        self.root.bind("<Right>", lambda event: self.change_direction("Right"))  # 绑定向右箭头键
        self.root.bind("<Left>", lambda event: self.change_direction("Left"))  # 绑定向左箭头键
        self.root.bind("<Up>", lambda event: self.change_direction("Up"))  # 绑定向上箭头键
        self.root.bind("<Down>", lambda event: self.change_direction("Down"))  # 绑定向下箭头键
        # 绑定加速和减速快捷键
        self.root.bind("+", lambda event: self.increase_speed() if not self.game_paused else None)
        self.root.bind("-", lambda event: self.decrease_speed() if not self.game_paused else None)

    def change_direction(self, direction):
        if (direction == "Right" and self.snake_direction != "Left" or
                direction == "Left" and self.snake_direction != "Right" or
                direction == "Up" and self.snake_direction != "Down" or
                direction == "Down" and self.snake_direction != "Up"):
            self.snake_direction = direction  # 根据输入的方向改变蛇的方向

    def start_game(self):
        if not self.game_over:  # 如果游戏未结束
            self.game_state_label.config(text="游戏进行中", fg="black", bg="white")
            # 更新游戏状态标签为“游戏进行中”
            self.start_button.config(state=tk.DISABLED)  # 禁用开始游戏按钮
            self.pause_button.config(state=tk.NORMAL)  # 启用暂停游戏按钮
            self.speed_increase_button.config(state=tk.NORMAL)  # 启用加速按钮
            self.speed_decrease_button.config(state=tk.NORMAL)  # 启用减速按钮
            self.save_button.config(state=tk.NORMAL)  # 启用存档按钮
            self.game_active = True  # 设置游戏活动状态为True

            # 清除“经典贪吃蛇”三个字
            self.canvas.delete(self.snake_text)  # 删除画布上的“经典贪吃蛇”文本
            self.create_food()  # 游戏开始时创建初始食物
            self.update_game()  # 开始游戏循环

    def pause_game(self):
        if self.game_active:  # 如果游戏正在活动
            self.game_paused = not self.game_paused  # 切换游戏暂停状态
            if self.game_paused:
                self.game_state_label.config(text="游戏暂停", fg="yellow", bg="white")
                # 更新游戏状态标签为“游戏暂停”,颜色为黄色
                self.pause_button.config(text="继续游戏")  # 将暂停按钮文本改为“继续游戏”
            else:
                self.game_state_label.config(text="游戏进行中", fg="black", bg="white")
                # 更新游戏状态标签为“游戏进行中”,颜色为黑色
                self.pause_button.config(text="暂停游戏")  # 将暂停按钮文本改为“暂停游戏”
                self.update_game()  # 恢复游戏时重新启动游戏循环

    def increase_speed(self):
        if self.speed > 50:  # 如果速度大于50
            self.speed -= 10  # 减少速度
            self.game_state_label.config(text=f"速度增加到: {400 - self.speed}ms", fg="black", bg="white")
            # 更新游戏状态标签显示新的速度

    def decrease_speed(self):
        if self.speed < 200:  # 如果速度小于200
            self.speed += 10  # 增加速度
            self.game_state_label.config(text=f"速度减少到: {400 - self.speed}ms", fg="black", bg="white")
            # 更新游戏状态标签显示新的速度

    def save_game(self):
        with open("savegame.txt", "w") as file:  # 打开或创建存档文件
            file.write(f"{self.score}\n")  # 写入分数
            file.write(f"{self.lives}\n")  # 写入生命值
            file.write(f"{self.snake_direction}\n")  # 写入蛇的方向
            file.write(f"{self.speed}\n")  # 写入速度
            file.write(str(self.snake) + "\n")  # 使用str()确保列表可以正确保存
            file.write(str(self.food) + "\n")  # 使用str()确保元组可以正确保存
        self.game_state_label.config(text="游戏已存档", fg="black", bg="white")
        # 更新游戏状态标签显示“游戏已存档”

    def load_game(self):
        try:
            with open("savegame.txt", "r") as file:  # 打开存档文件
                self.score = int(file.readline().strip())  # 读取并设置分数
                self.lives = int(file.readline().strip())  # 读取并设置生命值
                self.snake_direction = file.readline().strip()  # 读取并设置蛇的方向
                self.speed = int(file.readline().strip())  # 读取并设置速度
                self.snake = eval(file.readline().strip())  # 读取并设置蛇的位置
                self.food = eval(file.readline().strip())  # 读取并设置食物的位置
            self.score_label.config(text=f"分数: {self.score}")  # 更新分数标签
            self.lives_label.config(text=f"生命值: {self.lives}")  # 更新生命值标签
            self.game_state_label.config(text="游戏已加载", fg="black", bg="white")
            # 更新游戏状态标签显示“游戏已加载”
            self.update_canvas()  # 更新画布上的显示
            self.start_button.config(state=tk.DISABLED)  # 禁用开始游戏按钮
            self.pause_button.config(state=tk.NORMAL)  # 启用暂停游戏按钮
            self.speed_increase_button.config(state=tk.NORMAL)  # 启用加速按钮
            self.speed_decrease_button.config(state=tk.NORMAL)  # 启用减速按钮
            self.save_button.config(state=tk.NORMAL)  # 启用存档按钮
            self.game_active = True  # 设置游戏活动状态为True
            self.update_game()  # 开始游戏循环
        except FileNotFoundError:
            self.game_state_label.config(text="没有找到存档", fg="red", bg="white")
            # 如果没有找到存档文件,更新游戏状态标签显示“没有找到存档”

    def reset_game(self):
        self.snake = [(200, 200), (190, 200), (180, 200)]  # 重置蛇的位置
        self.snake_direction = "Right"  # 重置蛇的方向为向右
        self.food = None  # 重置食物为None
        self.score = 0  # 重置分数为0
        self.lives = 3  # 重置生命值为3
        self.game_over = False  # 重置游戏结束状态为False
        self.game_paused = False  # 重置游戏暂停状态为False
        self.speed = 100  # 重置速度为100
        self.game_state_label.config(text="游戏已重置", fg="black", bg="white")
        # 更新游戏状态标签显示“游戏已重置”
        self.update_canvas()  # 更新画布上的显示
        self.start_button.config(state=tk.NORMAL)  # 启用开始游戏按钮
        self.pause_button.config(state=tk.DISABLED)  # 禁用暂停游戏按钮
        self.speed_increase_button.config(state=tk.DISABLED)  # 禁用加速按钮
        self.speed_decrease_button.config(state=tk.DISABLED)  # 禁用减速按钮
        self.save_button.config(state=tk.DISABLED)  # 禁用存档按钮
        self.game_active = False  # 设置游戏活动状态为False

        # 重新显示“贪吃蛇”三个字
        self.snake_text = self.canvas.create_text(200, 200, text="贪吃蛇", fill="green", font=("Arial", 40, "bold"))
        # 在画布的中间位置重新创建一个文本“贪吃蛇”,颜色为绿色,字体大小为40,粗体

    def disable_game_buttons(self):
        self.pause_button.config(state=tk.DISABLED)  # 禁用暂停游戏按钮
        self.speed_increase_button.config(state=tk.DISABLED)  # 禁用加速按钮
        self.speed_decrease_button.config(state=tk.DISABLED)  # 禁用减速按钮
        self.save_button.config(state=tk.DISABLED)  # 禁用存档按钮
        self.start_button.config(state=tk.DISABLED)  # 禁用开始游戏按钮

if __name__ == "__main__":
    root = tk.Tk()  # 创建Tkinter主窗口
    game = SnakeGame(root)  # 创建SnakeGame对象
    root.mainloop()  # 进入Tkinter主循环,等待事件

 


相关文件下载地址
©下载资源版权归作者所有;本站所有资源均来源于网络,仅供学习使用,请支持正版!

相关文章

微信小程序快乐会领6大瓶可乐福利
用Python加ai写了一个本地音乐播放器
很优秀的孩子,情商智商都高!
Python写的一个闹钟程序
用Python加ai写了一个定时关机小工具
摸鱼的时候用Python加ai写了一个带UI界面的猜数字游戏

发布评论

用Python加ai调教写了一个经典贪吃蛇游戏