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()
相关推荐
Xovee几秒前
如何在Sklearn Pipeline中运行CatBoost
人工智能·python·sklearn·catboost
salvation~几秒前
Inception_V2_V3_pytorch
人工智能·pytorch·python·深度学习·inceptionv3
鼾声鼾语8 分钟前
simulink-esp32开发foc电机
开发语言·stm32·单片机·嵌入式硬件·学习
罗义凯9 分钟前
c++【入门】挖胡萝卜
开发语言·c++
向日葵xyz13 分钟前
基于人脸68特征点识别的美颜算法(一) 大眼算法 C++
开发语言·c++·算法
初学者↑24 分钟前
Java代码生成器(开源版本)
java·开发语言
loveLifeLoveCoding26 分钟前
Java 内存分页
java·开发语言
2.5条悟T^T27 分钟前
String类
java·c语言·开发语言·jvm·数据结构·算法·servlet
蓝天扶光34 分钟前
小白学python(第四天)顺序与分支篇
python
mayo的自留地35 分钟前
window10/11如何下载安装JDK(jdk) 超详细图文教程
java·开发语言·jvm·spring·servlet·tomcat·nio