The majority of this code is from Bro Code’s Python tutorial on how to make a snake game in Python. I decided to add a “Play again?” button on the game over screen, and when pressed would reset the game and allow the user to play again. The “new_game” function is the one I added.
from tkinter import *
import random
GAME_WIDTH = 600
GAME_HEIGHT = 600
SPEED = 75
SPACE_SIZE = 50
BODY_PARTS = 3
SNAKE_COLOR = "#0000FF"
FOOD_COLOR = "#FFFF00"
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, int(GAME_WIDTH/SPACE_SIZE)-1) * SPACE_SIZE
y = random.randint(0, int(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':
if direction != 'right':
direction = new_direction
elif new_direction == 'right':
if direction != 'left':
direction = new_direction
elif new_direction == 'up':
if direction != 'down':
direction = new_direction
elif new_direction == 'down':
if direction != 'up':
direction = new_direction
def check_collisions(snake):
x, y, = snake.coordinates[0]
if x < 0 or x>= GAME_WIDTH:
return True
elif 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():
global canvas
canvas.delete(ALL)
canvas.create_text(canvas.winfo_width() / 2,
canvas.winfo_height() / 2,
font=('consolas', 70),
text="GAME OVER",
fill="red",
tag="gameover")
#**BUTTON I ADDED**
again = Button(canvas,
width=12,
height=2,
text="Play again?",
font=('consolas', 15),
bg="black",
fg="red",
activebackground="black",
activeforeground="red",
command=new_game)
again.place(relx=0.5, rely=0.65, anchor=CENTER)
# **FUCNTION SUPPOSED TO RESET GAME**
def new_game():
global canvas
score = 0
canvas.destroy()
label.config(text="Score:{}".format(score))
canvas = Canvas(window,
bg=BACKGROUND_COLOR,
height=GAME_HEIGHT,
width=GAME_WIDTH)
canvas.pack()
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('<a>', lambda event: change_direction('left'))
window.bind('<d>', lambda event: change_direction('right'))
window.bind('<w>', lambda event: change_direction('up'))
window.bind('<s>', lambda event: change_direction('down'))
snake = Snake()
food = Food()
next_turn(snake, food)
window.mainloop()
I successfully destroyed the “Game over” screen, added the original canvas back on the window, and reset the score, but I still don’t know how to get the snake to appear again and start the game over again.
I’ve tried a while loop which would be True from the start and when the “Play again” was pressed would return False and the while loop would be broken. But that didn’t change anything in the original window and just added an identical window when the original window was closed out of.
Lang is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.