python tkinter 贪吃蛇游戏

import tkinter as tk
import random

class SnakeGame:
    def __init__(self, master):
        self.master = master
        self.master.title("Snake Game")
        self.master.resizable(False, False)

        self.canvas = tk.Canvas(self.master, width=400, height=400, bg="white")
        self.canvas.pack()

        self.start_button = tk.Button(self.master, text="开始", command=self.start_game, width=20)
        self.start_button.pack()

        self.restart_button = tk.Button(self.master, text="重新开始", command=self.restart_game, width=20)
        self.restart_button.pack()

        self.pause_button = tk.Button(self.master, text="暂停", command=self.pause_game, width=20)
        self.pause_button.pack()

        self.resume_button = tk.Button(self.master, text="继续", command=self.resume_game, width=20)
        self.resume_button.pack()

        self.quit_button = tk.Button(self.master, text="退出", command=self.master.quit, width=20)
        self.quit_button.pack()

        self.instructions_button = tk.Button(self.master, text="游戏说明", command=self.show_instructions, width=20)
        self.instructions_button.pack()

        self.score_label = tk.Label(self.master, text="得分: 0", width=20)
        self.score_label.pack()

        self.snake = [(100, 100), (100, 150), (100, 200)]
        self.food = self.generate_food()
        self.direction = "Up"
        self.paused = False
        self.game_over = False

    def start_game(self):
        self.start_button.pack_forget()
        self.game_loop()

    def restart_game(self):
        self.snake = [(100, 100), (100, 150), (100, 200)]
        self.food = self.generate_food()
        self.direction = "Up"
        self.paused = False
        self.game_over = False
        self.score_label.config(text="得分: 0")
        self.start_game()

    def pause_game(self):
        self.paused = True

    def resume_game(self):
        if self.paused:
            self.paused = False
            self.game_loop()

    def show_instructions(self):
        instructions = tk.Toplevel(self.master)
        instructions.title("游戏说明")
        tk.Label(instructions, text="使用方向键控制蛇的移动。").pack()
        tk.Label(instructions, text="蛇吃到食物后会变长,食物会随机出现在屏幕上。").pack()
        tk.Label(instructions, text="蛇碰到自己或者碰到墙壁游戏结束。").pack()
        tk.Button(instructions, text="关闭", command=instructions.destroy).pack()

    def generate_food(self):
        while True:
            food = (random.randint(1, 39) * 10, random.randint(1, 39) * 10)
            if food not in self.snake:
                return food

    def game_loop(self):
        if not self.paused and not self.game_over:
            self.canvas.delete("all")

            new_head = (self.snake[0][0] + (0 if self.direction in ("Up", "Down") else 10 if self.direction == "Right" else -10),
                        self.snake[0][1] + (0 if self.direction in ("Left", "Right") else 10 if self.direction == "Down" else -10))

            if new_head in self.snake or new_head[0] < 0 or new_head[0] >= 400 or new_head[1] < 0 or new_head[1] >= 400:
                self.game_over = True
                self.show_game_over()
                return

            self.snake.insert(0, new_head)

            if new_head == self.food:
                self.food = self.generate_food()
                self.score_label.config(text=f"得分: {len(self.snake) - 3}")
            else:
                self.snake.pop()

            for segment in self.snake:
                self.canvas.create_rectangle(segment[0], segment[1], segment[0] + 10, segment[1] + 10, fill="black")

            self.canvas.create_rectangle(self.food[0], self.food[1], self.food[0] + 10, self.food[1] + 10, fill="red")

            self.master.after(100, self.game_loop)

    def show_game_over(self):
        game_over_window = tk.Toplevel(self.master)
        game_over_window.title("游戏结束")
        tk.Label(game_over_window, text="游戏结束!").pack()
        tk.Button(game_over_window, text="关闭", command=game_over_window.destroy).pack()

    def change_direction(self, event):
        if event.keysym in ("Up", "Down", "Left", "Right") and (self.direction not in ("Up", "Down") or event.keysym not in ("Up", "Down")) and (self.direction not in ("Left", "Right") or event.keysym not in ("Left", "Right")):
            self.direction = event.keysym

if __name__ == "__main__":
    root = tk.Tk()
    game = SnakeGame(root)
    root.bind("<KeyPress>", game.change_direction)
    
    root.mainloop()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值