import tkinter as tk
import random
class SnakeGame:
def __init__(self, master):
self.master = master
self.master.title("Snake Game")
self.master.resizable(False, False)
self.canvas = tk.Canvas(self.master, width=400, height=400, bg="white")
self.canvas.pack()
self.start_button = tk.Button(self.master, text="开始", command=self.start_game, width=20)
self.start_button.pack()
self.restart_button = tk.Button(self.master, text="重新开始", command=self.restart_game, width=20)
self.restart_button.pack()
self.pause_button = tk.Button(self.master, text="暂停", command=self.pause_game, width=20)
self.pause_button.pack()
self.resume_button = tk.Button(self.master, text="继续", command=self.resume_game, width=20)
self.resume_button.pack()
self.quit_button = tk.Button(self.master, text="退出", command=self.master.quit, width=20)
self.quit_button.pack()
self.instructions_button = tk.Button(self.master, text="游戏说明", command=self.show_instructions, width=20)
self.instructions_button.pack()
self.score_label = tk.Label(self.master, text="得分: 0", width=20)
self.score_label.pack()
self.snake = [(100, 100), (100, 150), (100, 200)]
self.food = self.generate_food()
self.direction = "Up"
self.paused = False
self.game_over = False
def start_game(self):
self.start_button.pack_forget()
self.game_loop()
def restart_game(self):
self.snake = [(100, 100), (100, 150), (100, 200)]
self.food = self.generate_food()
self.direction = "Up"
self.paused = False
self.game_over = False
self.score_label.config(text="得分: 0")
self.start_game()
def pause_game(self):
self.paused = True
def resume_game(self):
if self.paused:
self.paused = False
self.game_loop()
def show_instructions(self):
instructions = tk.Toplevel(self.master)
instructions.title("游戏说明")
tk.Label(instructions, text="使用方向键控制蛇的移动。").pack()
tk.Label(instructions, text="蛇吃到食物后会变长,食物会随机出现在屏幕上。").pack()
tk.Label(instructions, text="蛇碰到自己或者碰到墙壁游戏结束。").pack()
tk.Button(instructions, text="关闭", command=instructions.destroy).pack()
def generate_food(self):
while True:
food = (random.randint(1, 39) * 10, random.randint(1, 39) * 10)
if food not in self.snake:
return food
def game_loop(self):
if not self.paused and not self.game_over:
self.canvas.delete("all")
new_head = (self.snake[0][0] + (0 if self.direction in ("Up", "Down") else 10 if self.direction == "Right" else -10),
self.snake[0][1] + (0 if self.direction in ("Left", "Right") else 10 if self.direction == "Down" else -10))
if new_head in self.snake or new_head[0] < 0 or new_head[0] >= 400 or new_head[1] < 0 or new_head[1] >= 400:
self.game_over = True
self.show_game_over()
return
self.snake.insert(0, new_head)
if new_head == self.food:
self.food = self.generate_food()
self.score_label.config(text=f"得分: {len(self.snake) - 3}")
else:
self.snake.pop()
for segment in self.snake:
self.canvas.create_rectangle(segment[0], segment[1], segment[0] + 10, segment[1] + 10, fill="black")
self.canvas.create_rectangle(self.food[0], self.food[1], self.food[0] + 10, self.food[1] + 10, fill="red")
self.master.after(100, self.game_loop)
def show_game_over(self):
game_over_window = tk.Toplevel(self.master)
game_over_window.title("游戏结束")
tk.Label(game_over_window, text="游戏结束!").pack()
tk.Button(game_over_window, text="关闭", command=game_over_window.destroy).pack()
def change_direction(self, event):
if event.keysym in ("Up", "Down", "Left", "Right") and (self.direction not in ("Up", "Down") or event.keysym not in ("Up", "Down")) and (self.direction not in ("Left", "Right") or event.keysym not in ("Left", "Right")):
self.direction = event.keysym
if __name__ == "__main__":
root = tk.Tk()
game = SnakeGame(root)
root.bind("<KeyPress>", game.change_direction)
root.mainloop()
python tkinter 贪吃蛇游戏
最新推荐文章于 2024-02-22 15:59:38 发布