如何为基于Tkinter的Python贪吃蛇游戏添加重新开始功能?
为贪吃蛇游戏添加重新开始功能
以下是给你的Tkinter贪吃蛇游戏添加重新开始功能的具体方案:
1. 新增重置游戏函数
这个函数负责重置游戏状态,包括分数、方向,清空画布并重新生成蛇和食物,重启游戏循环:
def reset_game(): global score, direction, snake, food score = 0 direction = 'down' label.config(text="Score:{}".format(score)) canvas.delete(ALL) snake = Snake() food = Food() next_turn(snake, food)
2. 修改游戏结束函数
在游戏结束界面添加重新开始的操作提示:
def game_over(): canvas.delete(ALL) canvas.create_text(canvas.winfo_width()/2, canvas.winfo_height()/2 - 80, font=('consolas',70), text="GAME OVER", fill="red", tag="gameover") # 添加重新开始提示 canvas.create_text(canvas.winfo_width()/2, canvas.winfo_height()/2 + 80, font=('consolas',30), text="按回车键重新开始", fill="white", tag="restart_hint")
3. 绑定重新开始按键
在窗口按键绑定区域添加回车键的绑定,触发重置函数:
window.bind('<Return>', lambda event: reset_game())
完整修改后的代码
from tkinter import * import random GAME_WIDTH = 700 GAME_HEIGHT = 700 SPEED = 400 SPACE_SIZE = 50 BODY_PARTS = 3 SNAKE_COLOR = "white" FOOD_COLOR = "blue" BACKGROUND_COLOR = "#000000" class Snake: def __init__(self): self.body_size = BODY_PARTS self.coordinates = [] self.squares = [] for i in range(0, BODY_PARTS): self.coordinates.append([0, 0]) for x, y in self.coordinates: square = canvas.create_rectangle(x, y, x + SPACE_SIZE, y + SPACE_SIZE, fill=SNAKE_COLOR, tag="snake") self.squares.append(square) class Food: def __init__(self): x = random.randint(0, (GAME_WIDTH / SPACE_SIZE)-1) * SPACE_SIZE y = random.randint(0, (GAME_HEIGHT / SPACE_SIZE) - 1) * SPACE_SIZE self.coordinates = [x, y] canvas.create_oval(x, y, x + SPACE_SIZE, y + SPACE_SIZE, fill=FOOD_COLOR, tag="food") def next_turn(snake, food): x, y = snake.coordinates[0] if direction == "up": y -= SPACE_SIZE elif direction == "down": y += SPACE_SIZE elif direction == "left": x -= SPACE_SIZE elif direction == "right": x += SPACE_SIZE snake.coordinates.insert(0, (x, y)) square = canvas.create_rectangle(x, y, x + SPACE_SIZE, y + SPACE_SIZE, fill=SNAKE_COLOR) snake.squares.insert(0, square) if x == food.coordinates[0] and y == food.coordinates[1]: global score score += 1 label.config(text="Score:{}".format(score)) canvas.delete("food") food = Food() else: del snake.coordinates[-1] canvas.delete(snake.squares[-1]) del snake.squares[-1] if check_collisions(snake): game_over() else: window.after(SPEED, next_turn, snake, food) def change_direction(new_direction): global direction if new_direction == 'left' and direction != 'right': direction = new_direction elif new_direction == 'right' and direction != 'left': direction = new_direction elif new_direction == 'up' and direction != 'down': direction = new_direction elif new_direction == 'down' and direction != 'up': direction = new_direction def check_collisions(snake): x, y = snake.coordinates[0] if x < 0 or x >= GAME_WIDTH or y < 0 or y >= GAME_HEIGHT: return True for body_part in snake.coordinates[1:]: if x == body_part[0] and y == body_part[1]: return True return False def game_over(): canvas.delete(ALL) canvas.create_text(canvas.winfo_width()/2, canvas.winfo_height()/2 - 80, font=('consolas',70), text="GAME OVER", fill="red", tag="gameover") canvas.create_text(canvas.winfo_width()/2, canvas.winfo_height()/2 + 80, font=('consolas',30), text="按回车键重新开始", fill="white", tag="restart_hint") def reset_game(): global score, direction, snake, food score = 0 direction = 'down' label.config(text="Score:{}".format(score)) canvas.delete(ALL) snake = Snake() food = Food() next_turn(snake, food) window = Tk() window.title("Snake game") window.resizable(False, False) score = 0 direction = 'down' label = Label(window, text="Score:{}".format(score), font=('consolas', 40)) label.pack() canvas = Canvas(window, bg=BACKGROUND_COLOR, height=GAME_HEIGHT, width=GAME_WIDTH) canvas.pack() window.update() window_width = window.winfo_width() window_height = window.winfo_height() screen_width = window.winfo_screenwidth() screen_height = window.winfo_screenheight() x = int((screen_width/2) - (window_width/2)) y = int((screen_height/2) - (window_height/2)) window.geometry(f"{window_width}x{window_height}+{x}+{y}") window.bind('<Left>', lambda event: change_direction('left')) window.bind('<Right>', lambda event: change_direction('right')) window.bind('<Up>', lambda event: change_direction('up')) window.bind('<Down>', lambda event: change_direction('down')) window.bind('<Return>', lambda event: reset_game()) snake = Snake() food = Food() next_turn(snake, food) window.mainloop()
功能说明
- 游戏结束后,画布会显示红色的"GAME OVER"标题和白色的重新开始提示
- 按下回车键即可重置所有游戏状态,重新开始游戏
内容的提问来源于stack exchange,提问作者El Joven
相关产品推荐
相关产品推荐

