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()
相关推荐
紫金修道5 小时前
【DeepAgent】概述
开发语言·数据库·python
Via_Neo5 小时前
JAVA中以2为底的对数表示方式
java·开发语言
书到用时方恨少!5 小时前
Python multiprocessing 使用指南:突破 GIL 束缚的并行计算利器
开发语言·python·并行·多进程
cch89185 小时前
PHP五大后台框架横向对比
开发语言·php
Warson_L6 小时前
Python 常用内置标准库
python
天真萌泪6 小时前
JS逆向自用
开发语言·javascript·ecmascript
Warson_L6 小时前
Python 函数的艺术 (Functions)
python
Warson_L6 小时前
Python 流程控制与逻辑
后端·python
野生技术架构师6 小时前
一线大厂Java面试八股文全栈通关手册(含源码级详解)
java·开发语言·面试
long_songs6 小时前
手柄键盘映射器【github链接见文末 】
python·游戏·计算机外设·pygame·软件推荐·手柄映射键盘