代码:
# -*- 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()
结果图: