Tkinter SnakeGame пауза

Рейтинг: -1Ответов: 1Опубликовано: 12.06.2023

Добрый день нужна помощь. Делаю простую змейку, возникли проблемы с паузой. Удалось додуматься как ее поставить, но никак не могу понять как сделать так, чтобы пауза снималась той же кнопкой.

Код:

from tkinter import *
import random

GAME_WIDTH = 1000  # Game settings
GAME_HEIGHT = 600

SPEED = 80
SPACE_SIZE = 50
BODY_PARTS = 2

SNAKE_COLOR = "#00FF00"
FOOD_COLOR = "#FF0000"
BG_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, tags='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):
    global stop

    if not stop:
        rb.pack_forget()

        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, best_score
            score += 1  # After eat food score + 1
            label.config(text="Score: {}".format(score))

            canvas.delete("food")

            food = Food()

            if score > best_score:  # Best score
                best_score = score

        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)

    elif stop:
        canvas.create_text(canvas.winfo_width() / 2, canvas.winfo_height() / 3, font=('consolas', 50), text='PAUSE',
                           fill='#ffffff')


def change_direction(new_direction):  # Changing snake direction with binding keys for moving

    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():
    rb.pack()
    canvas.delete(ALL)
    canvas.create_text(canvas.winfo_width() / 2, canvas.winfo_height() / 3, font=('consolas', 50), text='GAME OVER',
                       fill='#ffffff')

    canvas.create_text(canvas.winfo_width() / 2, canvas.winfo_height() / 2, font=('consolas', 30),
                       text=f'Best Score: {best_score}', fill='#ffffff')


def restart_game():
    global snake, food, score, direction

    canvas.delete(ALL)
    snake = Snake()
    food = Food()
    score = 0
    direction = 'down'

    label.config(text="Score: {}".format(score))

    next_turn(snake, food)


def pause(event):                               # Pause function

    global stop
    stop = True


window = Tk()  # Window settings
window.title("Snake game")
window.resizable(False, False)


direction = 'down'  # Snake direction


stop = False                 # Game pause
window.bind('<space>', pause)


score = 0  # Score
best_score = 0

label = Label(window, text="Score: {}".format(score), activebackground='white', font=('consolas', 40))
label.pack()

canvas = Canvas(window, bg=BG_COLOR, height=GAME_HEIGHT, width=GAME_WIDTH)
canvas.pack()

rb = Button(window, text='Restart', command=restart_game, font=('consolas', 20))  # Restart Button
rb.place(x=GAME_WIDTH / 2, y=700)
rb.pack()

window.update()  # 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('%dx%d+%d+%d' % (window_width, window_height, x, y))

window.bind('<Left>', lambda event: change_direction('left'))  # Bind Keys for moving snake
window.bind('<Right>', lambda event: change_direction('right'))
window.bind('<Up>', lambda event: change_direction('up'))
window.bind('<Down>', lambda event: change_direction('down'))

snake = Snake()
food = Food()

next_turn(snake, food)

window.mainloop()

Ответы

▲ 0

Для такого можно завести переменную с числовым значением, т. е. 0 или 1. Для этого подойдет тот же самый stop. Затем создать функцию pause_play, в которой поставить условие:

if stop == 0:
    stop = 1
else:
    stop = 0

И забиндить эту функцию на какую-либо клавишу так же, как вы забиндили повороты на стрелочки. Надеюсь помог! P. S. Я не увидел объяснения в комментариях, сильно извиняюсь, если кто-либо подумал, что я украл это решение.