python实现贪吃鸡

bash 复制代码
import tkinter as tk
import random


class SnakeGame:
    def __init__(self, master):
        self.master = master
        self.master.title("Snake Game")
        self.master.geometry("400x400")

        self.canvas = tk.Canvas(self.master, bg="black")
        self.canvas.pack(fill=tk.BOTH, expand=True)

        self.snake = [(20, 20)]
        self.food = self.create_food()
        self.direction = "Right"
        self.score = 0
        self.speed = 100
        self.game_over = False

        self.draw_snake()
        self.draw_food()

        self.master.bind("<Key>", self.change_direction)
        self.update_snake_position()

    def draw_snake(self):
        self.canvas.delete("snake")
        for segment in self.snake:
            x, y = segment
            self.canvas.create_rectangle(x, y, x + 20, y + 20, fill="green", tags="snake")

    def draw_food(self):
        x, y = self.food
        self.canvas.create_oval(x, y, x + 20, y + 20, fill="red", tags="food")

    def create_food(self):
        while True:
            x = random.randint(0, 19) * 20
            y = random.randint(0, 19) * 20
            if (x, y) not in self.snake:
                return (x, y)

    def move_snake(self):
        head_x, head_y = self.snake[0]

        if self.direction == "Left":
            new_head = (head_x - 20, head_y)
        elif self.direction == "Right":
            new_head = (head_x + 20, head_y)
        elif self.direction == "Up":
            new_head = (head_x, head_y - 20)
        elif self.direction == "Down":
            new_head = (head_x, head_y + 20)

        # Check if new head collides with itself or walls
        if self.check_collision(new_head):
            self.game_over = True
            self.canvas.create_text(200, 200, text=f"Game Over! Score: {self.score}", fill="white",
                                    font=("Helvetica", 24))
            self.canvas.create_text(200, 230, text="Press Space to Restart", fill="white", font=("Helvetica", 16))
            return

        # Insert new head at the beginning of snake list
        self.snake.insert(0, new_head)

        # Check if snake eats food
        if new_head == self.food:
            self.score += 1
            self.canvas.delete("food")
            self.food = self.create_food()
            self.draw_food()
        else:
            # Remove the last segment of snake if it doesn't eat food
            self.snake.pop()

        self.draw_snake()

        # Schedule the next move
        if not self.game_over:
            self.master.after(self.speed, self.move_snake)

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

    def update_snake_position(self):
        if not self.game_over:
            self.move_snake()

    def change_direction(self, event):
        if event.keysym in ["Left", "Right", "Up", "Down"]:
            if (event.keysym == "Left" and self.direction != "Right") or \
                    (event.keysym == "Right" and self.direction != "Left") or \
                    (event.keysym == "Up" and self.direction != "Down") or \
                    (event.keysym == "Down" and self.direction != "Up"):
                self.direction = event.keysym
        elif event.keysym == "space" and self.game_over:
            self.restart_game()

    def restart_game(self):
        self.snake = [(20, 20)]
        self.food = self.create_food()
        self.direction = "Right"
        self.score = 0
        self.speed = 100
        self.game_over = False
        self.canvas.delete("all")
        self.draw_snake()
        self.draw_food()
        self.update_snake_position()


if __name__ == "__main__":
    root = tk.Tk()
    game = SnakeGame(root)
    root.mainloop()
相关推荐
AC赳赳老秦44 分钟前
企业工商公开信息采集分析:OpenClaw 批量查询企业工商信息,生成企业画像报告
大数据·开发语言·python·自动化·php·deepseek·openclaw
qq_2518364571 小时前
基于java Web 动漫视频网站毕业论文
java·开发语言·前端
野生风长1 小时前
C++入门基础:从命名空间到引用与指针的全面解析
开发语言·c++
FoldWinCard1 小时前
D6 Python 基础语法 --- 保留关键字
开发语言·python
暮暮祈安2 小时前
Celery 新手入门指南
java·数据库·python·flask·httpx
JustNow_Man2 小时前
每日高频场景英文口语
python
风吹心凉3 小时前
python3基础2026.7.22
开发语言·python
qq_452396233 小时前
第五篇:《接口与错误处理:Go 的哲学》
开发语言·后端·golang
Escalating_xu3 小时前
C++可变参数模板与引用折叠精讲
开发语言·c++
wuyk5553 小时前
59.嵌入式C语言高级宏定义实战:多行宏、字符串化与符号拼接
c语言·开发语言·stm32·单片机·嵌入式硬件·物联网·51单片机