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()
相关推荐
梧桐树042915 分钟前
python常用内建模块:collections
python
Dream_Snowar23 分钟前
速通Python 第三节
开发语言·python
高山我梦口香糖1 小时前
[react]searchParams转普通对象
开发语言·前端·javascript
信号处理学渣2 小时前
matlab画图,选择性显示legend标签
开发语言·matlab
红龙创客2 小时前
某狐畅游24校招-C++开发岗笔试(单选题)
开发语言·c++
蓝天星空2 小时前
Python调用open ai接口
人工智能·python
jasmine s2 小时前
Pandas
开发语言·python
郭wes代码2 小时前
Cmd命令大全(万字详细版)
python·算法·小程序
leaf_leaves_leaf2 小时前
win11用一条命令给anaconda环境安装GPU版本pytorch,并检查是否为GPU版本
人工智能·pytorch·python
biomooc2 小时前
R 语言 | 绘图的文字格式(绘制上标、下标、斜体、文字标注等)
开发语言·r语言