import tkinter as tk
from tkinter import messagebox
import random
class SnakeGame:
def __init__(self, master):
self.master = master
self.master.title("贪吃蛇游戏")
self.master.geometry("600x500")
self.master.resizable(False, False)
# 游戏参数设置
self.cell_size = 20
self.width = 30
self.height = 20
self.speed = 150 # 移动速度(毫秒)
# 初始化界面
self.create_widgets()
self.init_game()
# 绑定键盘事件
self.master.bind('<Key>', self.on_key_press)
self.master.bind('<F5>', self.restart_game)
def create_widgets(self):
# 游戏画布
self.canvas = tk.Canvas(
self.master,
width=self.width*self.cell_size,
height=self.height*self.cell_size,
bg="black"
)
self.canvas.pack(pady=20)
# 控制面板
control_frame = tk.Frame(self.master)
control_frame.pack()
self.start_btn = tk.Button(
control_frame,
text="开始游戏",
command=self.start_game
)
self.start_btn.pack(side=tk.LEFT, padx=10)
self.restart_btn = tk.Button(
control_frame,
text="重新开始",
command=self.restart_game,
state=tk.DISABLED
)
self.restart_btn.pack(side=tk.LEFT, padx=10)
# 得分显示
self.score_label = tk.Label(
self.master,
text="得分: 0",
font=("Arial", 14)
)
self.score_label.pack(pady=5)
def init_game(self):
# 初始化游戏状态
self.direction = "Right"
self.next_direction = "Right"
self.snake = [(5, 5), (4, 5), (3, 5)]
self.food = None
self.score = 0
self.game_running = False
self.create_food()
self.draw()
def draw(self):
self.canvas.delete("all")
# 绘制蛇
for x, y in self.snake:
self.canvas.create_rectangle(
x*self.cell_size, y*self.cell_size,
(x+1)*self.cell_size, (y+1)*self.cell_size,
fill="green", outline="darkgreen"
)
# 绘制食物
if self.food:
x, y = self.food
self.canvas.create_oval(
x*self.cell_size, y*self.cell_size,
(x+1)*self.cell_size, (y+1)*self.cell_size,
fill="red", outline="darkred"
)
def create_food(self):
while True:
x = random.randint(0, self.width-1)
y = random.randint(0, self.height-1)
if (x, y) not in self.snake:
self.food = (x, y)
break
def move_snake(self):
if not self.game_running:
return
# 更新方向
self.direction = self.next_direction
# 计算新头部位置
head_x, head_y = self.snake[0]
if self.direction == "Up":
new_head = (head_x, head_y - 1)
elif self.direction == "Down":
new_head = (head_x, head_y + 1)
elif self.direction == "Left":
new_head = (head_x - 1, head_y)
else: # Right
new_head = (head_x + 1, head_y)
# 碰撞检测
if (new_head in self.snake or
new_head[0] < 0 or new_head[0] >= self.width or
new_head[1] < 0 or new_head[1] >= self.height):
self.game_over()
return
self.snake.insert(0, new_head)
# 吃食物检测
if new_head == self.food:
self.score += 10
self.score_label.config(text=f"得分: {self.score}")
self.create_food()
else:
self.snake.pop()
self.draw()
self.master.after(self.speed, self.move_snake)
def on_key_press(self, event):
key = event.keysym
if (key in ["Up", "Down", "Left", "Right"] and
not ((self.direction == "Up" and key == "Down") or
(self.direction == "Down" and key == "Up") or
(self.direction == "Left" and key == "Right") or
(self.direction == "Right" and key == "Left"))):
self.next_direction = key
def start_game(self):
if not self.game_running:
self.game_running = True
self.start_btn.config(state=tk.DISABLED)
self.restart_btn.config(state=tk.NORMAL)
self.move_snake()
def restart_game(self, event=None):
self.game_running = False
self.init_game()
self.start_btn.config(state=tk.NORMAL)
self.restart_btn.config(state=tk.DISABLED)
self.score_label.config(text="得分: 0")
self.draw()
def game_over(self):
self.game_running = False
self.canvas.create_text(
self.width*self.cell_size/2,
self.height*self.cell_size/2,
text="游戏结束编程论坛你胜利了!",
fill="white",
font=("Arial", 24)
)
self.start_btn.config(state=tk.DISABLED)
self.restart_btn.config(state=tk.NORMAL)
if __name__ == "__main__":
root = tk.Tk()
game = SnakeGame(root)
root.mainloop()