python 代码设计贪吃蛇

复制代码
代码:
# -*- codeing = utf-8 -*-
import tkinter as tk
import random
from tkinter import messagebox

class Snake:
    def __init__(self, master):
        self.master = master
        self.master.title("Snake")

        # 创建画布
        self.canvas = tk.Canvas(self.master, width=400, height=400, bg="white")
        self.canvas.pack()

        # 初始化游戏数据
        self.snake = [(0, 0), (0, 1), (0, 2)]
        self.food = (5, 5)
        self.direction = "Right"
        self.score = 0

        # 绑定键盘事件
        self.master.bind("<Key>", self.on_key_press)

        # 开始游戏
        self.start_game()

    def start_game(self):
        # 绘制贪吃蛇和食物
        self.draw_snake()
        self.draw_food()

        # 更新游戏状态
        self.update_game()

    def draw_snake(self):
        # 清空画布
        self.canvas.delete("all")

        # 绘制贪吃蛇
        for x, y in self.snake:
            x1 = x * 20
            y1 = y * 20
            x2 = x1 + 20
            y2 = y1 + 20
            self.canvas.create_rectangle(x1, y1, x2, y2, fill="green")

    def draw_food(self):
        # 绘制食物
        x1 = self.food[0] * 20
        y1 = self.food[1] * 20
        x2 = x1 + 20
        y2 = y1 + 20
        self.canvas.create_oval(x1, y1, x2, y2, fill="red")

    def update_game(self):
        # 更新贪吃蛇位置
        head_x, head_y = self.snake[-1]
        if self.direction == "Left":
            new_head = (head_x - 1, head_y)
        elif self.direction == "Right":
            new_head = (head_x + 1, head_y)
        elif self.direction == "Up":
            new_head = (head_x, head_y - 1)
        else:
            new_head = (head_x, head_y + 1)
        self.snake.append(new_head)
        del self.snake[0]

        # 检查游戏是否结束
        if new_head[0] < 0 or new_head[0] >= 20 or new_head[1] < 0 or new_head[1] >= 20 or new_head in self.snake[:-1]:
            tk.messagebox.showinfo("Game Over", f"Score: {self.score}")
            return

        # 检查贪吃蛇是否吃掉食物
        if new_head == self.food:
            while True:
                food_x = random.randint(0, 19)
                food_y = random.randint(0, 19)
                if (food_x, food_y) not in self.snake:
                    break
            self.food = (food_x, food_y)
            tail_x, tail_y = self.snake[0]
            if self.direction == "Left":
                new_tail = (tail_x + 1, tail_y)
            elif self.direction == "Right":
                new_tail = (tail_x - 1, tail_y)
            elif self.direction == "Up":
                new_tail = (tail_x, tail_y + 1)
            else:
                new_tail = (tail_x, tail_y - 1)
            self.snake.insert(0, new_tail)
            self.score += 1

        # 绘制贪吃蛇和食物
        self.draw_snake()
        self.draw_food()

        # 定时更新游戏状态
        self.master.after(200, self.update_game)

    def on_key_press(self, event):
        if event.keysym in ["Left", "Right", "Up", "Down"]:
            self.direction = event.keysym

if __name__ == "__main__":
    root = tk.Tk()
    snake = Snake(root)
    root.mainloop()

结果图:

相关推荐
流星白龙4 分钟前
【C++习题】10.反转字符串中的单词 lll
开发语言·c++
尘浮生11 分钟前
Java项目实战II基于微信小程序的校运会管理系统(开发文档+数据库+源码)
java·开发语言·数据库·微信小程序·小程序·maven·intellij-idea
MessiGo12 分钟前
Python 爬虫 (1)基础 | 基础操作
开发语言·python
Tech Synapse18 分钟前
Java根据前端返回的字段名进行查询数据的方法
java·开发语言·后端
乌啼霜满天24926 分钟前
JDBC编程---Java
java·开发语言·sql
肥猪猪爸36 分钟前
使用卡尔曼滤波器估计pybullet中的机器人位置
数据结构·人工智能·python·算法·机器人·卡尔曼滤波·pybullet
色空大师39 分钟前
23种设计模式
java·开发语言·设计模式
Bruce小鬼1 小时前
QT文件基本操作
开发语言·qt
2202_754421541 小时前
生成MPSOC以及ZYNQ的启动文件BOOT.BIN的小软件
java·linux·开发语言
我只会发热1 小时前
Java SE 与 Java EE:基础与进阶的探索之旅
java·开发语言·java-ee