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()