dffbdf

erer

import warnings
warnings.filterwarnings("ignore", category=RuntimeWarning, message=".*AVX2.*")
import pgzrun
"""
Pygame Zero (pgzrun) - это обёртка над Pygame,
которая упрощает создание игр,
автоматизируя многие рутинные задачи.
"""


# Запуск игры
pgzrun.go()      # Запускается главный игровой цикл

Лист.

import warnings
warnings.filterwarnings("ignore", category=RuntimeWarning, message=".*AVX2.*")
import pgzrun
"""
Pygame Zero (pgzrun) - это обёртка над Pygame,
которая упрощает создание игр,
автоматизируя многие рутинные задачи.
"""


# Запуск игры
pgzrun.go()      # Запускается главный игровой цикл

Лист.

import warnings
warnings.filterwarnings("ignore", category=RuntimeWarning, message=".*AVX2.*")
import pgzrun
"""
Pygame Zero (pgzrun) - это обёртка над Pygame,
которая упрощает создание игр,
автоматизируя многие рутинные задачи.
"""


# Настройки игры, глобальные константы и переменные
WIDTH = HEIGHT = 500                            # ширина и высота окна
TITLE = "Головоломка 15"                        # заголовок окна
BACKGROUND_COLOR = 'gold'                       # цвет кнопки


def draw():
    """
    draw() особая функция, вызывается автоматически каждый кадр,
    обычно, 60 FPS. Доступны объекты: screen, actors и др.
    Назначение: отрисовка всего, что должно быть на экране.
    """
    screen.fill(BACKGROUND_COLOR)               # очистка экрана


# Запуск игры
pgzrun.go()      # Запускается главный игровой цикл

Лист.

import warnings
warnings.filterwarnings("ignore", category=RuntimeWarning, message=".*AVX2.*")
import pgzrun
"""
Pygame Zero (pgzrun) - это обёртка над Pygame,
которая упрощает создание игр,
автоматизируя многие рутинные задачи.
"""


# Настройки игры, глобальные константы и переменные
WIDTH = HEIGHT = 500                            # ширина и высота окна
SIZE = 4                                        # размер игрового поля (4x4)
CELL_SIZE = WIDTH // SIZE                       # размер клетки
TITLE = "Головоломка 15"                        # заголовок окна
BACKGROUND_COLOR = 'khaki'                      # цвет кнопки
GRID_COLOR = 'dimgray'                          # цвет сетки
 

def draw():
    """
    draw() особая функция, вызывается автоматически каждый кадр,
    обычно, 60 FPS. Доступны объекты: screen, actors и др.
    Назначение: отрисовка всего, что должно быть на экране.
    """
    screen.fill(BACKGROUND_COLOR)                                       # очистка экрана
    for n in range(CELL_SIZE, WIDTH, CELL_SIZE):                        # линии сетки
        screen.draw.line((n, 0), (n, HEIGHT), GRID_COLOR)               # вертикальные линии
        screen.draw.line((0, n), (WIDTH, n), GRID_COLOR)                # горизонтальные линии


# Запуск игры
pgzrun.go()      # Запускается главный игровой цикл

Лист.

import warnings
warnings.filterwarnings("ignore", category=RuntimeWarning, message=".*AVX2.*")
import pgzrun
"""
Pygame Zero (pgzrun) - это обёртка над Pygame,
которая упрощает создание игр,
автоматизируя многие рутинные задачи.
"""


# Настройки игры, глобальные константы и переменные
WIDTH = HEIGHT = 500                            # ширина и высота окна
SIZE = 4                                        # размер игрового поля (4x4)
CELL_SIZE = WIDTH // SIZE                       # размер клетки
TITLE = "Головоломка 15"                        # заголовок окна
BACKGROUND_COLOR = 'khaki'                      # цвет кнопки
GRID_COLOR = 'dimgray'                          # цвет сетки
BORDER_COLOR = 'gold'                           # цвет бордюра
DIGITS_COLOR = 'sienna'                         # цвет цифр
DIGITS_SIZE = HEIGHT//10                        # размер цифр
playground = list(range(1, SIZE**2)) + [' ']    # виртуальное игровое поле


def draw():
    """
    draw() особая функция, вызывается автоматически каждый кадр,
    обычно, 60 FPS. Доступны объекты: screen, actors и др.
    Назначение: отрисовка всего, что должно быть на экране.
    """
    screen.fill(BACKGROUND_COLOR)                                       # очистка экрана
    for n in range(0, WIDTH+1, CELL_SIZE):                              # линии бордюра
        screen.draw.filled_rect(Rect(n-7, 0, 15, HEIGHT), BORDER_COLOR) # вертикальные
        screen.draw.filled_rect(Rect(0, n-7, WIDTH, 15), BORDER_COLOR)  # горизонтальные
    for n in range(CELL_SIZE, WIDTH, CELL_SIZE):                        # линии сетки
        screen.draw.line((n, 0), (n, HEIGHT), GRID_COLOR)               # вертикальные линии
        screen.draw.line((0, n), (WIDTH, n), GRID_COLOR)                # горизонтальные линии
    for n in range(SIZE**2):                                            # печать цифр
        x = n % SIZE * CELL_SIZE + CELL_SIZE // 2 - 10
        if playground[n] != ' ' and playground[n] >  9 :
            x -= DIGITS_SIZE // 5
        y = n // SIZE * CELL_SIZE + + CELL_SIZE // 2 - 15
        screen.draw.text(str(playground[n]), (x, y), color=DIGITS_COLOR, fontsize=DIGITS_SIZE)


# Запуск игры
pgzrun.go()      # Запускается главный игровой цикл

Лист.

import warnings
warnings.filterwarnings("ignore", category=RuntimeWarning, message=".*AVX2.*")
import pgzrun
"""
Pygame Zero (pgzrun) - это обёртка над Pygame,
которая упрощает создание игр,
автоматизируя многие рутинные задачи.
"""


# Настройки игры, глобальные константы и переменные
WIDTH = HEIGHT = 500                            # ширина и высота окна
SIZE = 4                                        # размер игрового поля (4x4)
CELL_SIZE = WIDTH // SIZE                       # размер клетки
TITLE = "Головоломка 15"                        # заголовок окна
BACKGROUND_COLOR = 'khaki'                      # цвет кнопки
GRID_COLOR = 'dimgray'                          # цвет сетки
BORDER_COLOR = 'gold'                           # цвет бордюра
DIGITS_COLOR = 'sienna'                         # цвет цифр
DIGITS_SIZE = HEIGHT//10                        # размер цифр
playground = list(range(1, SIZE**2)) + [' ']    # виртуальное игровое поле


def draw():
    """
    draw() особая функция, вызывается автоматически каждый кадр,
    обычно, 60 FPS. Доступны объекты: screen, actors и др.
    Назначение: отрисовка всего, что должно быть на экране.
    """
    screen.fill(BACKGROUND_COLOR)                                       # очистка экрана
    for n in range(0, WIDTH+1, CELL_SIZE):                              # линии бордюра
        screen.draw.filled_rect(Rect(n-7, 0, 15, HEIGHT), BORDER_COLOR) # вертикальные
        screen.draw.filled_rect(Rect(0, n-7, WIDTH, 15), BORDER_COLOR)  # горизонтальные
    for n in range(CELL_SIZE, WIDTH, CELL_SIZE):                        # линии сетки
        screen.draw.line((n, 0), (n, HEIGHT), GRID_COLOR)               # вертикальные линии
        screen.draw.line((0, n), (WIDTH, n), GRID_COLOR)                # горизонтальные линии
    for n in range(SIZE**2):                                            # печать цифр
        x = n % SIZE * CELL_SIZE + CELL_SIZE // 2 - 10
        if playground[n] != ' ' and playground[n] >  9 :
            x -= DIGITS_SIZE // 5
        y = n // SIZE * CELL_SIZE + + CELL_SIZE // 2 - 15
        screen.draw.text(str(playground[n]), (x, y), color=DIGITS_COLOR, fontsize=DIGITS_SIZE)


def on_mouse_down(pos):
    """
    on_mouse_down(pos) особая функция, вызывается автоматически при клике мыши
    Через параметр pos в функцию передаётся кортеж из пары координат (x, y)
    """
    print(pos)


# Запуск игры
pgzrun.go()      # Запускается главный игровой цикл

Лист.

import warnings
warnings.filterwarnings("ignore", category=RuntimeWarning, message=".*AVX2.*")
import pgzrun
"""
Pygame Zero (pgzrun) - это обёртка над Pygame,
которая упрощает создание игр,
автоматизируя многие рутинные задачи.
"""


# Настройки игры, глобальные константы и переменные
WIDTH = HEIGHT = 500                            # ширина и высота окна
SIZE = 4                                        # размер игрового поля (4x4)
CELL_SIZE = WIDTH // SIZE                       # размер клетки
TITLE = "Головоломка 15"                        # заголовок окна
BACKGROUND_COLOR = 'khaki'                      # цвет кнопки
GRID_COLOR = 'dimgray'                          # цвет сетки
BORDER_COLOR = 'gold'                           # цвет бордюра
DIGITS_COLOR = 'sienna'                         # цвет цифр
DIGITS_SIZE = HEIGHT//10                        # размер цифр
playground = list(range(1, SIZE**2)) + [' ']    # виртуальное игровое поле


def draw():
    """
    draw() особая функция, вызывается автоматически каждый кадр,
    обычно, 60 FPS. Доступны объекты: screen, actors и др.
    Назначение: отрисовка всего, что должно быть на экране.
    """
    screen.fill(BACKGROUND_COLOR)                                       # очистка экрана
    for n in range(0, WIDTH+1, CELL_SIZE):                              # линии бордюра
        screen.draw.filled_rect(Rect(n-7, 0, 15, HEIGHT), BORDER_COLOR) # вертикальные
        screen.draw.filled_rect(Rect(0, n-7, WIDTH, 15), BORDER_COLOR)  # горизонтальные
    for n in range(CELL_SIZE, WIDTH, CELL_SIZE):                        # линии сетки
        screen.draw.line((n, 0), (n, HEIGHT), GRID_COLOR)               # вертикальные линии
        screen.draw.line((0, n), (WIDTH, n), GRID_COLOR)                # горизонтальные линии
    for n in range(SIZE**2):                                            # печать цифр
        x = n % SIZE * CELL_SIZE + CELL_SIZE // 2 - 10
        if playground[n] != ' ' and playground[n] >  9 :
            x -= DIGITS_SIZE // 5
        y = n // SIZE * CELL_SIZE + + CELL_SIZE // 2 - 15
        screen.draw.text(str(playground[n]), (x, y), color=DIGITS_COLOR, fontsize=DIGITS_SIZE)


def on_mouse_down(pos):
    """
    on_mouse_down(pos) особая функция, вызывается автоматически при клике мыши
    Через параметр pos в функцию передаётся кортеж из пары координат (x, y)
    """
    x = pos[0] // CELL_SIZE                         # номер столбца
    y = pos[1] // CELL_SIZE                         # номер строки
    n = y * SIZE + x                                # номер нажатой клетки
    print(x, y, n)


# Запуск игры
pgzrun.go()      # Запускается главный игровой цикл

Лист.

import warnings
warnings.filterwarnings("ignore", category=RuntimeWarning, message=".*AVX2.*")
import pgzrun
"""
Pygame Zero (pgzrun) - это обёртка над Pygame,
которая упрощает создание игр,
автоматизируя многие рутинные задачи.
"""


# Настройки игры, глобальные константы и переменные
WIDTH = HEIGHT = 500                            # ширина и высота окна
SIZE = 4                                        # размер игрового поля (4x4)
CELL_SIZE = WIDTH // SIZE                       # размер клетки
TITLE = "Головоломка 15"                        # заголовок окна
BACKGROUND_COLOR = 'khaki'                      # цвет кнопки
GRID_COLOR = 'dimgray'                          # цвет сетки
BORDER_COLOR = 'gold'                           # цвет бордюра
DIGITS_COLOR = 'sienna'                         # цвет цифр
DIGITS_SIZE = HEIGHT//10                        # размер цифр
playground = list(range(1, SIZE**2)) + [' ']    # виртуальное игровое поле


def draw():
    """
    draw() особая функция, вызывается автоматически каждый кадр,
    обычно, 60 FPS. Доступны объекты: screen, actors и др.
    Назначение: отрисовка всего, что должно быть на экране.
    """
    screen.fill(BACKGROUND_COLOR)                                       # очистка экрана
    for n in range(0, WIDTH+1, CELL_SIZE):                              # линии бордюра
        screen.draw.filled_rect(Rect(n-7, 0, 15, HEIGHT), BORDER_COLOR) # вертикальные
        screen.draw.filled_rect(Rect(0, n-7, WIDTH, 15), BORDER_COLOR)  # горизонтальные
    for n in range(CELL_SIZE, WIDTH, CELL_SIZE):                        # линии сетки
        screen.draw.line((n, 0), (n, HEIGHT), GRID_COLOR)               # вертикальные линии
        screen.draw.line((0, n), (WIDTH, n), GRID_COLOR)                # горизонтальные линии
    for n in range(SIZE**2):                                            # печать цифр
        x = n % SIZE * CELL_SIZE + CELL_SIZE // 2 - 10
        if playground[n] != ' ' and playground[n] >  9 :
            x -= DIGITS_SIZE // 5
        y = n // SIZE * CELL_SIZE + + CELL_SIZE // 2 - 15
        screen.draw.text(str(playground[n]), (x, y), color=DIGITS_COLOR, fontsize=DIGITS_SIZE)


def play(n):
    """
    Делает ход из клетки с номером n
    в пустую клетку, если это возможно!
    """
    m = playground.index(' ')                       # индекс пустой клетки
    print(m)


def on_mouse_down(pos):
    """
    on_mouse_down(pos) особая функция, вызывается автоматически при клике мыши
    Через параметр pos в функцию передаётся кортеж из пары координат (x, y)
    """
    x = pos[0] // CELL_SIZE                         # номер столбца
    y = pos[1] // CELL_SIZE                         # номер строки
    n = y * SIZE + x                                # номер нажатой клетки
    play(n)


# Запуск игры
pgzrun.go()      # Запускается главный игровой цикл

Лист.

import warnings
warnings.filterwarnings("ignore", category=RuntimeWarning, message=".*AVX2.*")
import pgzrun
"""
Pygame Zero (pgzrun) - это обёртка над Pygame,
которая упрощает создание игр,
автоматизируя многие рутинные задачи.
"""


# Настройки игры, глобальные константы и переменные
WIDTH = HEIGHT = 500                            # ширина и высота окна
SIZE = 4                                        # размер игрового поля (4x4)
CELL_SIZE = WIDTH // SIZE                       # размер клетки
TITLE = "Головоломка 15"                        # заголовок окна
BACKGROUND_COLOR = 'khaki'                      # цвет кнопки
GRID_COLOR = 'dimgray'                          # цвет сетки
BORDER_COLOR = 'gold'                           # цвет бордюра
DIGITS_COLOR = 'sienna'                         # цвет цифр
DIGITS_SIZE = HEIGHT//10                        # размер цифр
playground = list(range(1, SIZE**2)) + [' ']    # виртуальное игровое поле


def draw():
    """
    draw() особая функция, вызывается автоматически каждый кадр,
    обычно, 60 FPS. Доступны объекты: screen, actors и др.
    Назначение: отрисовка всего, что должно быть на экране.
    """
    screen.fill(BACKGROUND_COLOR)                                       # очистка экрана
    for n in range(0, WIDTH+1, CELL_SIZE):                              # линии бордюра
        screen.draw.filled_rect(Rect(n-7, 0, 15, HEIGHT), BORDER_COLOR) # вертикальные
        screen.draw.filled_rect(Rect(0, n-7, WIDTH, 15), BORDER_COLOR)  # горизонтальные
    for n in range(CELL_SIZE, WIDTH, CELL_SIZE):                        # линии сетки
        screen.draw.line((n, 0), (n, HEIGHT), GRID_COLOR)               # вертикальные линии
        screen.draw.line((0, n), (WIDTH, n), GRID_COLOR)                # горизонтальные линии
    for n in range(SIZE**2):                                            # печать цифр
        x = n % SIZE * CELL_SIZE + CELL_SIZE // 2 - 10
        if playground[n] != ' ' and playground[n] >  9 :
            x -= DIGITS_SIZE // 5
        y = n // SIZE * CELL_SIZE + + CELL_SIZE // 2 - 15
        screen.draw.text(str(playground[n]), (x, y), color=DIGITS_COLOR, fontsize=DIGITS_SIZE)


def play(n):
    """
    Делает ход из клетки с номером n
    в пустую клетку, если это возможно!
    """
    m = playground.index(' ')                                           # индекс пустой клетки
    playground[n], playground[m] = playground[m], playground[n]         # делаем ход


def on_mouse_down(pos):
    """
    on_mouse_down(pos) особая функция, вызывается автоматически при клике мыши
    Через параметр pos в функцию передаётся кортеж из пары координат (x, y)
    """
    x = pos[0] // CELL_SIZE                         # номер столбца
    y = pos[1] // CELL_SIZE                         # номер строки
    n = y * SIZE + x                                # номер нажатой клетки
    play(n)


# Запуск игры
pgzrun.go()      # Запускается главный игровой цикл

Лист.

import warnings
warnings.filterwarnings("ignore", category=RuntimeWarning, message=".*AVX2.*")
import pgzrun
"""
Pygame Zero (pgzrun) - это обёртка над Pygame,
которая упрощает создание игр,
автоматизируя многие рутинные задачи.
"""


# Настройки игры, глобальные константы и переменные
WIDTH = HEIGHT = 500                            # ширина и высота окна
SIZE = 4                                        # размер игрового поля (4x4)
CELL_SIZE = WIDTH // SIZE                       # размер клетки
TITLE = "Головоломка 15"                        # заголовок окна
BACKGROUND_COLOR = 'khaki'                      # цвет кнопки
GRID_COLOR = 'dimgray'                          # цвет сетки
BORDER_COLOR = 'gold'                           # цвет бордюра
DIGITS_COLOR = 'sienna'                         # цвет цифр
DIGITS_SIZE = HEIGHT//10                        # размер цифр
playground = list(range(1, SIZE**2)) + [' ']    # виртуальное игровое поле


def draw():
    """
    draw() особая функция, вызывается автоматически каждый кадр,
    обычно, 60 FPS. Доступны объекты: screen, actors и др.
    Назначение: отрисовка всего, что должно быть на экране.
    """
    screen.fill(BACKGROUND_COLOR)                                       # очистка экрана
    for n in range(0, WIDTH+1, CELL_SIZE):                              # линии бордюра
        screen.draw.filled_rect(Rect(n-7, 0, 15, HEIGHT), BORDER_COLOR) # вертикальные
        screen.draw.filled_rect(Rect(0, n-7, WIDTH, 15), BORDER_COLOR)  # горизонтальные
    for n in range(CELL_SIZE, WIDTH, CELL_SIZE):                        # линии сетки
        screen.draw.line((n, 0), (n, HEIGHT), GRID_COLOR)               # вертикальные линии
        screen.draw.line((0, n), (WIDTH, n), GRID_COLOR)                # горизонтальные линии
    for n in range(SIZE**2):                                            # печать цифр
        x = n % SIZE * CELL_SIZE + CELL_SIZE // 2 - 10
        if playground[n] != ' ' and playground[n] >  9 :
            x -= DIGITS_SIZE // 5
        y = n // SIZE * CELL_SIZE + + CELL_SIZE // 2 - 15
        screen.draw.text(str(playground[n]), (x, y), color=DIGITS_COLOR, fontsize=DIGITS_SIZE)


def play(n):
    """
    Делает ход из клетки с номером n
    в пустую клетку, если это возможно!
    """
    m = playground.index(' ')                                           # индекс пустой клетки
    if n in [m+1, m-1] and m // SIZE == n // SIZE or n in [m-SIZE, m+SIZE]:
        playground[n], playground[m] = playground[m], playground[n]     # делаем ход
        return True
    return False


def on_mouse_down(pos):
    """
    on_mouse_down(pos) особая функция, вызывается автоматически при клике мыши
    Через параметр pos в функцию передаётся кортеж из пары координат (x, y)
    """
    x = pos[0] // CELL_SIZE                         # номер столбца
    y = pos[1] // CELL_SIZE                         # номер строки
    n = y * SIZE + x                                # номер нажатой клетки
    if not play(n):
        print('Этот ход невозможен!')


# Запуск игры
pgzrun.go()      # Запускается главный игровой цикл

Лист.

import warnings
warnings.filterwarnings("ignore", category=RuntimeWarning, message=".*AVX2.*")
import pgzrun
"""
Pygame Zero (pgzrun) - это обёртка над Pygame,
которая упрощает создание игр,
автоматизируя многие рутинные задачи.
"""


# Настройки игры, глобальные константы и переменные
WIDTH = HEIGHT = 500                            # ширина и высота окна
SIZE = 4                                        # размер игрового поля (4x4)
CELL_SIZE = WIDTH // SIZE                       # размер клетки
TITLE = "Головоломка 15"                        # заголовок окна
BACKGROUND_COLOR = 'khaki'                      # цвет кнопки
GRID_COLOR = 'dimgray'                          # цвет сетки
BORDER_COLOR = 'gold'                           # цвет бордюра
DIGITS_COLOR = 'sienna'                         # цвет цифр
DIGITS_SIZE = HEIGHT//10                        # размер цифр
playground = list(range(1, SIZE**2)) + [' ']    # виртуальное игровое поле


def draw():
    """
    draw() особая функция, вызывается автоматически каждый кадр,
    обычно, 60 FPS. Доступны объекты: screen, actors и др.
    Назначение: отрисовка всего, что должно быть на экране.
    """
    screen.fill(BACKGROUND_COLOR)                                       # очистка экрана
    for n in range(0, WIDTH+1, CELL_SIZE):                              # линии бордюра
        screen.draw.filled_rect(Rect(n-7, 0, 15, HEIGHT), BORDER_COLOR) # вертикальные
        screen.draw.filled_rect(Rect(0, n-7, WIDTH, 15), BORDER_COLOR)  # горизонтальные
    for n in range(CELL_SIZE, WIDTH, CELL_SIZE):                        # линии сетки
        screen.draw.line((n, 0), (n, HEIGHT), GRID_COLOR)               # вертикальные линии
        screen.draw.line((0, n), (WIDTH, n), GRID_COLOR)                # горизонтальные линии
    for n in range(SIZE**2):                                            # печать цифр
        x = n % SIZE * CELL_SIZE + CELL_SIZE // 2 - 10
        if playground[n] != ' ' and playground[n] >  9 :
            x -= DIGITS_SIZE // 5
        y = n // SIZE * CELL_SIZE + + CELL_SIZE // 2 - 15
        screen.draw.text(str(playground[n]), (x, y), color=DIGITS_COLOR, fontsize=DIGITS_SIZE)


def play(n):
    """
    Делает ход из клетки с номером n
    в пустую клетку, если это возможно!
    """
    m = playground.index(' ')                                           # индекс пустой клетки
    if n in [m+1, m-1] and m // SIZE == n // SIZE or n in [m-SIZE, m+SIZE]:
        playground[n], playground[m] = playground[m], playground[n]     # делаем ход
        return True
    return False


def on_mouse_down(pos):
    """
    on_mouse_down(pos) особая функция, вызывается автоматически при клике мыши
    Через параметр pos в функцию передаётся кортеж из пары координат (x, y)
    """
    x = pos[0] // CELL_SIZE                         # номер столбца
    y = pos[1] // CELL_SIZE                         # номер строки
    n = y * SIZE + x                                # номер нажатой клетки
    if not play(n):
        print('Этот ход невозможен!')


def on_key_down(key):
    """
    on_key_down(pos) особая функция, вызывается автоматически при нажатии
    клавиши на клавиатуре. Через параметр key в функцию передаётся
    код нажатой клавиши.
    """
    if key == keys.SPACE :                      # выбор кнопки Старт
        print('Необходимо перемешать числа')


# Запуск игры
pgzrun.go()      # Запускается главный игровой цикл

Лист.

import warnings
warnings.filterwarnings("ignore", category=RuntimeWarning, message=".*AVX2.*")
from random import choice                       # выбрать случайный элемент списка
import pgzrun
"""
Pygame Zero (pgzrun) - это обёртка над Pygame,
которая упрощает создание игр,
автоматизируя многие рутинные задачи.
"""


# Настройки игры, глобальные константы и переменные
WIDTH = HEIGHT = 500                            # ширина и высота окна
SIZE = 4                                        # размер игрового поля (4x4)
CELL_SIZE = WIDTH // SIZE                       # размер клетки
TITLE = "Головоломка 15"                        # заголовок окна
BACKGROUND_COLOR = 'khaki'                      # цвет кнопки
GRID_COLOR = 'dimgray'                          # цвет сетки
BORDER_COLOR = 'gold'                           # цвет бордюра
DIGITS_COLOR = 'sienna'                         # цвет цифр
DIGITS_SIZE = HEIGHT//10                        # размер цифр
playground = list(range(1, SIZE**2)) + [' ']    # виртуальное игровое поле


def draw():
    """
    draw() особая функция, вызывается автоматически каждый кадр,
    обычно, 60 FPS. Доступны объекты: screen, actors и др.
    Назначение: отрисовка всего, что должно быть на экране.
    """
    screen.fill(BACKGROUND_COLOR)                                       # очистка экрана
    for n in range(0, WIDTH+1, CELL_SIZE):                              # линии бордюра
        screen.draw.filled_rect(Rect(n-7, 0, 15, HEIGHT), BORDER_COLOR) # вертикальные
        screen.draw.filled_rect(Rect(0, n-7, WIDTH, 15), BORDER_COLOR)  # горизонтальные
    for n in range(CELL_SIZE, WIDTH, CELL_SIZE):                        # линии сетки
        screen.draw.line((n, 0), (n, HEIGHT), GRID_COLOR)               # вертикальные линии
        screen.draw.line((0, n), (WIDTH, n), GRID_COLOR)                # горизонтальные линии
    for n in range(SIZE**2):                                            # печать цифр
        x = n % SIZE * CELL_SIZE + CELL_SIZE // 2 - 10
        if playground[n] != ' ' and playground[n] >  9 :
            x -= DIGITS_SIZE // 5
        y = n // SIZE * CELL_SIZE + + CELL_SIZE // 2 - 15
        screen.draw.text(str(playground[n]), (x, y), color=DIGITS_COLOR, fontsize=DIGITS_SIZE)


def play(n):
    """
    Делает ход из клетки с номером n
    в пустую клетку, если это возможно!
    """
    m = playground.index(' ')                                           # индекс пустой клетки
    if n in [m+1, m-1] and m // SIZE == n // SIZE or n in [m-SIZE, m+SIZE]:
        playground[n], playground[m] = playground[m], playground[n]     # делаем ход
        return True
    return False


def on_mouse_down(pos):
    """
    on_mouse_down(pos) особая функция, вызывается автоматически при клике мыши
    Через параметр pos в функцию передаётся кортеж из пары координат (x, y)
    """
    x = pos[0] // CELL_SIZE                         # номер столбца
    y = pos[1] // CELL_SIZE                         # номер строки
    n = y * SIZE + x                                # номер нажатой клетки
    if not play(n):
        print('Этот ход невозможен!')


def on_key_down(key):
    """
    on_key_down(pos) особая функция, вызывается автоматически при нажатии
    клавиши на клавиатуре. Через параметр key в функцию передаётся
    код нажатой клавиши.
    """
    if key == keys.SPACE :                          # выбор кнопки Старт
        counter = 1000                              # количество перемешиваний
        while(counter != 0):
            n = choice(range(SIZE**2))              # выбор случайного хода
            if play(n): counter -= 1                # если ход сделан


# Запуск игры
pgzrun.go()      # Запускается главный игровой цикл

Лист.

import warnings
warnings.filterwarnings("ignore", category=RuntimeWarning, message=".*AVX2.*")
from random import choice                       # выбрать случайный элемент списка
import pgzrun
"""
Pygame Zero (pgzrun) - это обёртка над Pygame,
которая упрощает создание игр,
автоматизируя многие рутинные задачи.
"""


# Настройки игры, глобальные константы и переменные
WIDTH = HEIGHT = 500                            # ширина и высота окна
SIZE = 4                                        # размер игрового поля (4x4)
CELL_SIZE = WIDTH // SIZE                       # размер клетки
TITLE = "Головоломка 15"                        # заголовок окна
BACKGROUND_COLOR = 'khaki'                      # цвет кнопки
GRID_COLOR = 'dimgray'                          # цвет сетки
BORDER_COLOR = 'gold'                           # цвет бордюра
DIGITS_COLOR = 'sienna'                         # цвет цифр
DIGITS_SIZE = HEIGHT//10                        # размер цифр
playground = list(range(1, SIZE**2)) + [' ']    # виртуальное игровое поле
counter = 0	                                # счётчик ходов


def draw():
    """
    draw() особая функция, вызывается автоматически каждый кадр,
    обычно, 60 FPS. Доступны объекты: screen, actors и др.
    Назначение: отрисовка всего, что должно быть на экране.
    """
    screen.fill(BACKGROUND_COLOR)                                       # очистка экрана
    for n in range(0, WIDTH+1, CELL_SIZE):                              # линии бордюра
        screen.draw.filled_rect(Rect(n-7, 0, 15, HEIGHT), BORDER_COLOR) # вертикальные
        screen.draw.filled_rect(Rect(0, n-7, WIDTH, 15), BORDER_COLOR)  # горизонтальные
    for n in range(CELL_SIZE, WIDTH, CELL_SIZE):                        # линии сетки
        screen.draw.line((n, 0), (n, HEIGHT), GRID_COLOR)               # вертикальные линии
        screen.draw.line((0, n), (WIDTH, n), GRID_COLOR)                # горизонтальные линии
    for n in range(SIZE**2):                                            # печать цифр
        x = n % SIZE * CELL_SIZE + CELL_SIZE // 2 - 10
        if playground[n] != ' ' and playground[n] >  9 :
            x -= DIGITS_SIZE // 5
        y = n // SIZE * CELL_SIZE + + CELL_SIZE // 2 - 15
        screen.draw.text(str(playground[n]), (x, y), color=DIGITS_COLOR, fontsize=DIGITS_SIZE)


def play(n):
    """
    Делает ход из клетки с номером n
    в пустую клетку, если это возможно!
    """
    m = playground.index(' ')                                           # индекс пустой клетки
    if n in [m+1, m-1] and m // SIZE == n // SIZE or n in [m-SIZE, m+SIZE]:
        playground[n], playground[m] = playground[m], playground[n]     # делаем ход
        return True
    return False


def on_mouse_down(pos):
    """
    on_mouse_down(pos) особая функция, вызывается автоматически при клике мыши
    Через параметр pos в функцию передаётся кортеж из пары координат (x, y)
    """
    global counter
    x = pos[0] // CELL_SIZE                         # номер столбца
    y = pos[1] // CELL_SIZE                         # номер строки
    n = y * SIZE + x                                # номер нажатой клетки
    if play(n):                                     # ход сделан
        counter += 1
        print(counter)


def on_key_down(key):
    """
    on_key_down(pos) особая функция, вызывается автоматически при нажатии
    клавиши на клавиатуре. Через параметр key в функцию передаётся
    код нажатой клавиши.
    """
    global counter
    if key == keys.SPACE :                          # выбор кнопки Старт
        counter = 1000                              # количество перемешиваний
        while(counter != 0):
            n = choice(range(SIZE**2))              # выбор случайного хода
            if play(n): counter -= 1                # если ход сделан


# Запуск игры
pgzrun.go()      # Запускается главный игровой цикл

Лист.

import warnings
warnings.filterwarnings("ignore", category=RuntimeWarning, message=".*AVX2.*")
from random import choice                       # выбрать случайный элемент списка
import pgzrun
"""
Pygame Zero (pgzrun) - это обёртка над Pygame,
которая упрощает создание игр,
автоматизируя многие рутинные задачи.
"""


# Настройки игры, глобальные константы и переменные
WIDTH = HEIGHT = 500                            # ширина и высота окна
SIZE = 4                                        # размер игрового поля (4x4)
CELL_SIZE = WIDTH // SIZE                       # размер клетки
TITLE = "Головоломка 15"                        # заголовок окна
BACKGROUND_COLOR = 'khaki'                      # цвет кнопки
GRID_COLOR = 'dimgray'                          # цвет сетки
BORDER_COLOR = 'gold'                           # цвет бордюра
DIGITS_COLOR = 'sienna'                         # цвет цифр
DIGITS_SIZE = HEIGHT//10                        # размер цифр
FONT_SIZE = DIGITS_SIZE // 2                    # размер шрифта сообщений
FONT_COLOR = 'olive'                            # Цвет шрифта сообщений
playground = list(range(1, SIZE**2)) + [' ']    # виртуальное игровое поле
counter = 0	                                # счётчик ходов


def draw():
    """
    draw() особая функция, вызывается автоматически каждый кадр,
    обычно, 60 FPS. Доступны объекты: screen, actors и др.
    Назначение: отрисовка всего, что должно быть на экране.
    """
    screen.fill(BACKGROUND_COLOR)                                       # очистка экрана
    for n in range(0, WIDTH+1, CELL_SIZE):                              # линии бордюра
        screen.draw.filled_rect(Rect(n-7, 0, 15, HEIGHT), BORDER_COLOR) # вертикальные
        screen.draw.filled_rect(Rect(0, n-7, WIDTH, 15), BORDER_COLOR)  # горизонтальные
    for n in range(CELL_SIZE, WIDTH, CELL_SIZE):                        # линии сетки
        screen.draw.line((n, 0), (n, HEIGHT), GRID_COLOR)               # вертикальные линии
        screen.draw.line((0, n), (WIDTH, n), GRID_COLOR)                # горизонтальные линии
    for n in range(SIZE**2):                                            # печать цифр
        x = n % SIZE * CELL_SIZE + CELL_SIZE // 2 - 10
        if playground[n] != ' ' and playground[n] >  9 :
            x -= DIGITS_SIZE // 5
        y = n // SIZE * CELL_SIZE + + CELL_SIZE // 2 - 15
        screen.draw.text(str(playground[n]), (x, y), color=DIGITS_COLOR, fontsize=DIGITS_SIZE)

    # печать сообщений
    fnt_params = {'color': FONT_COLOR,'fontsize': FONT_SIZE}
    screen.draw.text(str(counter)+"-й ход", (20, 20), **fnt_params)     # счётчик ходов


def play(n):
    """
    Делает ход из клетки с номером n
    в пустую клетку, если это возможно!
    """
    m = playground.index(' ')                                           # индекс пустой клетки
    if n in [m+1, m-1] and m // SIZE == n // SIZE or n in [m-SIZE, m+SIZE]:
        playground[n], playground[m] = playground[m], playground[n]     # делаем ход
        return True
    return False


def on_mouse_down(pos):
    """
    on_mouse_down(pos) особая функция, вызывается автоматически при клике мыши
    Через параметр pos в функцию передаётся кортеж из пары координат (x, y)
    """
    global counter
    x = pos[0] // CELL_SIZE                         # номер столбца
    y = pos[1] // CELL_SIZE                         # номер строки
    n = y * SIZE + x                                # номер нажатой клетки
    if play(n):                                     # ход сделан
        counter += 1


def on_key_down(key):
    """
    on_key_down(pos) особая функция, вызывается автоматически при нажатии
    клавиши на клавиатуре. Через параметр key в функцию передаётся
    код нажатой клавиши.
    """
    global counter
    if key == keys.SPACE :                          # выбор кнопки Старт
        counter = 1000                              # количество перемешиваний
        while(counter != 0):
            n = choice(range(SIZE**2))              # выбор случайного хода
            if play(n): counter -= 1                # если ход сделан


# Запуск игры
pgzrun.go()      # Запускается главный игровой цикл

Лист.

import warnings
warnings.filterwarnings("ignore", category=RuntimeWarning, message=".*AVX2.*")
from random import choice                       # выбрать случайный элемент списка
import pgzrun
"""
Pygame Zero (pgzrun) - это обёртка над Pygame,
которая упрощает создание игр,
автоматизируя многие рутинные задачи.
"""


# Настройки игры, глобальные константы и переменные
WIDTH = HEIGHT = 500                            # ширина и высота окна
SIZE = 4                                        # размер игрового поля (4x4)
CELL_SIZE = WIDTH // SIZE                       # размер клетки
TITLE = "Головоломка 15"                        # заголовок окна
BACKGROUND_COLOR = 'khaki'                      # цвет кнопки
GRID_COLOR = 'dimgray'                          # цвет сетки
BORDER_COLOR = 'gold'                           # цвет бордюра
DIGITS_COLOR = 'sienna'                         # цвет цифр
DIGITS_SIZE = HEIGHT//10                        # размер цифр
FONT_SIZE = DIGITS_SIZE // 2                    # размер шрифта сообщений
FONT_COLOR = 'olive'                            # Цвет шрифта сообщений
playground = list(range(1, SIZE**2)) + [' ']    # виртуальное игровое поле
counter = 0	                                # счётчик ходов


def draw():
    """
    draw() особая функция, вызывается автоматически каждый кадр,
    обычно, 60 FPS. Доступны объекты: screen, actors и др.
    Назначение: отрисовка всего, что должно быть на экране.
    """
    screen.fill(BACKGROUND_COLOR)                                       # очистка экрана
    dig_params = {'color': DIGITS_COLOR,'fontsize': DIGITS_SIZE}        # цвет и размер цифр
    for n in range(0, WIDTH+1, CELL_SIZE):                              # линии бордюра
        screen.draw.filled_rect(Rect(n-7, 0, 15, HEIGHT), BORDER_COLOR) # вертикальные
        screen.draw.filled_rect(Rect(0, n-7, WIDTH, 15), BORDER_COLOR)  # горизонтальные
    for n in range(CELL_SIZE, WIDTH, CELL_SIZE):                        # линии сетки
        screen.draw.line((n, 0), (n, HEIGHT), GRID_COLOR)               # вертикальные линии
        screen.draw.line((0, n), (WIDTH, n), GRID_COLOR)                # горизонтальные линии
    for n in range(SIZE**2):                                            # печать цифр
        x = n % SIZE * CELL_SIZE + CELL_SIZE // 2 - 10
        if playground[n] != ' ' and playground[n] >  9 :
            x -= DIGITS_SIZE // 5
        y = n // SIZE * CELL_SIZE + + CELL_SIZE // 2 - 15
        screen.draw.text(str(playground[n]), (x, y), **dig_params)

    # печать сообщений
    fnt_params = {'color': FONT_COLOR,'fontsize': FONT_SIZE}
    screen.draw.text(str(counter)+"-й ход", (20, 20), **fnt_params)     # счётчик ходов
    if playground == list(range(1, SIZE**2)) + [' ']:                   # Числа упорядочены
        if counter > 0:
            screen.draw.text("Победа!", (1.5*CELL_SIZE, 2*CELL_SIZE - DIGITS_SIZE / 3), **dig_params)


def play(n):
    """
    Делает ход из клетки с номером n
    в пустую клетку, если это возможно!
    """
    m = playground.index(' ')                                           # индекс пустой клетки
    if n in [m+1, m-1] and m // SIZE == n // SIZE or n in [m-SIZE, m+SIZE]:
        playground[n], playground[m] = playground[m], playground[n]     # делаем ход
        return True
    return False


def on_mouse_down(pos):
    """
    on_mouse_down(pos) особая функция, вызывается автоматически при клике мыши
    Через параметр pos в функцию передаётся кортеж из пары координат (x, y)
    """
    global counter
    x = pos[0] // CELL_SIZE                         # номер столбца
    y = pos[1] // CELL_SIZE                         # номер строки
    n = y * SIZE + x                                # номер нажатой клетки
    if play(n):                                     # ход сделан
        counter += 1


def on_key_down(key):
    """
    on_key_down(pos) особая функция, вызывается автоматически при нажатии
    клавиши на клавиатуре. Через параметр key в функцию передаётся
    код нажатой клавиши.
    """
    global counter
    if key == keys.SPACE :                          # выбор кнопки Старт
        counter = 1000                              # количество перемешиваний
        while(counter != 0):
            n = choice(range(SIZE**2))              # выбор случайного хода
            if play(n): counter -= 1                # если ход сделан


# Запуск игры
pgzrun.go()      # Запускается главный игровой цикл

Лист.

import warnings
warnings.filterwarnings("ignore", category=RuntimeWarning, message=".*AVX2.*")
from random import choice                       # выбрать случайный элемент списка
import pgzrun
"""
Pygame Zero (pgzrun) - это обёртка над Pygame,
которая упрощает создание игр,
автоматизируя многие рутинные задачи.
"""


# Настройки игры, глобальные константы и переменные
WIDTH = HEIGHT = 500                            # ширина и высота окна
SIZE = 4                                        # размер игрового поля (4x4)
CELL_SIZE = WIDTH // SIZE                       # размер клетки
TITLE = "Головоломка 15"                        # заголовок окна
BACKGROUND_COLOR = 'khaki'                      # цвет кнопки
GRID_COLOR = 'dimgray'                          # цвет сетки
BORDER_COLOR = 'gold'                           # цвет бордюра
DIGITS_COLOR = 'sienna'                         # цвет цифр
DIGITS_SIZE = HEIGHT//10                        # размер цифр
FONT_SIZE = DIGITS_SIZE // 2                    # размер шрифта сообщений
FONT_COLOR = 'olive'                            # Цвет шрифта сообщений
playground = list(range(1, SIZE**2)) + [' ']    # виртуальное игровое поле
counter = 0	                                # счётчик ходов


def draw():
    """
    draw() особая функция, вызывается автоматически каждый кадр,
    обычно, 60 FPS. Доступны объекты: screen, actors и др.
    Назначение: отрисовка всего, что должно быть на экране.
    """
    screen.fill(BACKGROUND_COLOR)                                       # очистка экрана
    dig_params = {'color': DIGITS_COLOR,'fontsize': DIGITS_SIZE}        # цвет и размер цифр
    for n in range(0, WIDTH+1, CELL_SIZE):                              # линии бордюра
        screen.draw.filled_rect(Rect(n-7, 0, 15, HEIGHT), BORDER_COLOR) # вертикальные
        screen.draw.filled_rect(Rect(0, n-7, WIDTH, 15), BORDER_COLOR)  # горизонтальные
    for n in range(CELL_SIZE, WIDTH, CELL_SIZE):                        # линии сетки
        screen.draw.line((n, 0), (n, HEIGHT), GRID_COLOR)               # вертикальные линии
        screen.draw.line((0, n), (WIDTH, n), GRID_COLOR)                # горизонтальные линии
    for n in range(SIZE**2):                                            # печать цифр
        x = n % SIZE * CELL_SIZE + CELL_SIZE // 2 - 10
        if playground[n] != ' ' and playground[n] >  9 :
            x -= DIGITS_SIZE // 5
        y = n // SIZE * CELL_SIZE + + CELL_SIZE // 2 - 15
        screen.draw.text(str(playground[n]), (x, y), **dig_params)

    # печать сообщений
    fnt_params = {'color': FONT_COLOR,'fontsize': FONT_SIZE}
    screen.draw.text(str(counter)+"-й ход", (20, 20), **fnt_params)     # счётчик ходов
    if playground == list(range(1, SIZE**2)) + [' ']:                   # Числа упорядочены
        if counter > 0:
            screen.draw.text("Победа!", (1.5*CELL_SIZE, 2*CELL_SIZE - DIGITS_SIZE / 3), **dig_params)
        if counter >= 0:
            screen.draw.text("Клавиша", (WIDTH - CELL_SIZE + 20, HEIGHT - CELL_SIZE + 30), **fnt_params)
            screen.draw.text("Пробел-", (WIDTH - CELL_SIZE + 20, HEIGHT - CELL_SIZE + 50),  **fnt_params)
            screen.draw.text("Старт", (WIDTH - CELL_SIZE + 20, HEIGHT - CELL_SIZE + 70),  **fnt_params)


def play(n):
    """
    Делает ход из клетки с номером n
    в пустую клетку, если это возможно!
    """
    m = playground.index(' ')                                           # индекс пустой клетки
    if n in [m+1, m-1] and m // SIZE == n // SIZE or n in [m-SIZE, m+SIZE]:
        playground[n], playground[m] = playground[m], playground[n]     # делаем ход
        return True
    return False


def on_mouse_down(pos):
    """
    on_mouse_down(pos) особая функция, вызывается автоматически при клике мыши
    Через параметр pos в функцию передаётся кортеж из пары координат (x, y)
    """
    global counter
    x = pos[0] // CELL_SIZE                         # номер столбца
    y = pos[1] // CELL_SIZE                         # номер строки
    n = y * SIZE + x                                # номер нажатой клетки
    if play(n):                                     # ход сделан
        counter += 1


def on_key_down(key):
    """
    on_key_down(pos) особая функция, вызывается автоматически при нажатии
    клавиши на клавиатуре. Через параметр key в функцию передаётся
    код нажатой клавиши.
    """
    global counter
    if key == keys.SPACE :                          # выбор кнопки Старт
        counter = 1000                              # количество перемешиваний
        while(counter != 0):
            n = choice(range(SIZE**2))              # выбор случайного хода
            if play(n): counter -= 1                # если ход сделан


# Запуск игры
pgzrun.go()      # Запускается главный игровой цикл

Лист.

import warnings
warnings.filterwarnings("ignore", category=RuntimeWarning, message=".*AVX2.*")
from random import choice                       # выбрать случайный элемент списка
import pgzrun
"""
Pygame Zero (pgzrun) - это обёртка над Pygame,
которая упрощает создание игр,
автоматизируя многие рутинные задачи.
"""


# Настройки игры, глобальные константы и переменные
WIDTH = HEIGHT = 500                            # ширина и высота окна
SIZE = 4                                        # размер игрового поля (4x4)
CELL_SIZE = WIDTH // SIZE                       # размер клетки
TITLE = "Головоломка 15"                        # заголовок окна
BACKGROUND_COLOR = 'khaki'                      # цвет кнопки
GRID_COLOR = 'dimgray'                          # цвет сетки
BORDER_COLOR = 'gold'                           # цвет бордюра
DIGITS_COLOR = 'sienna'                         # цвет цифр
DIGITS_SIZE = HEIGHT//10                        # размер цифр
FONT_SIZE = DIGITS_SIZE // 2                    # размер шрифта сообщений
FONT_COLOR = 'olive'                            # Цвет шрифта сообщений
playground = list(range(1, SIZE**2)) + [' ']    # виртуальное игровое поле
counter = 0	                                # счётчик ходов


def draw():
    """
    draw() особая функция, вызывается автоматически каждый кадр,
    обычно, 60 FPS. Доступны объекты: screen, actors и др.
    Назначение: отрисовка всего, что должно быть на экране.
    """
    screen.fill(BACKGROUND_COLOR)                                       # очистка экрана
    dig_params = {'color': DIGITS_COLOR,'fontsize': DIGITS_SIZE}        # цвет и размер цифр
    for n in range(0, WIDTH+1, CELL_SIZE):                              # линии бордюра
        screen.draw.filled_rect(Rect(n-7, 0, 15, HEIGHT), BORDER_COLOR) # вертикальные
        screen.draw.filled_rect(Rect(0, n-7, WIDTH, 15), BORDER_COLOR)  # горизонтальные
    for n in range(CELL_SIZE, WIDTH, CELL_SIZE):                        # линии сетки
        screen.draw.line((n, 0), (n, HEIGHT), GRID_COLOR)               # вертикальные линии
        screen.draw.line((0, n), (WIDTH, n), GRID_COLOR)                # горизонтальные линии
    for n in range(SIZE**2):                                            # печать цифр
        x = n % SIZE * CELL_SIZE + CELL_SIZE // 2 - 10
        if playground[n] != ' ' and playground[n] >  9 :
            x -= DIGITS_SIZE // 5
        y = n // SIZE * CELL_SIZE + + CELL_SIZE // 2 - 15
        screen.draw.text(str(playground[n]), (x, y), **dig_params)

    # печать сообщений
    fnt_params = {'color': FONT_COLOR,'fontsize': FONT_SIZE}
    screen.draw.text(str(counter)+"-й ход", (20, 20), **fnt_params)     # счётчик ходов
    if playground == list(range(1, SIZE**2)) + [' ']:                   # Числа упорядочены
        if counter > 0:
            screen.draw.text("Победа!", (1.5*CELL_SIZE, 2*CELL_SIZE - DIGITS_SIZE / 3), **dig_params)
        if counter >= 0:
            screen.draw.text("Клавиша", (WIDTH - CELL_SIZE + 20, HEIGHT - CELL_SIZE + 30), **fnt_params)
            screen.draw.text("Пробел-", (WIDTH - CELL_SIZE + 20, HEIGHT - CELL_SIZE + 50),  **fnt_params)
            screen.draw.text("Старт", (WIDTH - CELL_SIZE + 20, HEIGHT - CELL_SIZE + 70),  **fnt_params)


def play(n):
    """
    Делает ход из клетки с номером n
    в пустую клетку, если это возможно!
    """
    m = playground.index(' ')                                           # индекс пустой клетки
    if n in [m+1, m-1] and m // SIZE == n // SIZE or n in [m-SIZE, m+SIZE]:
        playground[n], playground[m] = playground[m], playground[n]     # делаем ход
        return True
    return False


def on_mouse_down(pos):
    """
    on_mouse_down(pos) особая функция, вызывается автоматически при клике мыши
    Через параметр pos в функцию передаётся кортеж из пары координат (x, y)
    """
    global counter
    if playground == list(range(1, SIZE**2)) + [' ']:
        return                                      # если числа упорядочены
    x = pos[0] // CELL_SIZE                         # номер столбца
    y = pos[1] // CELL_SIZE                         # номер строки
    n = y * SIZE + x                                # номер нажатой клетки
    if play(n):                                     # ход сделан
        counter += 1


def on_key_down(key):
    """
    on_key_down(pos) особая функция, вызывается автоматически при нажатии
    клавиши на клавиатуре. Через параметр key в функцию передаётся
    код нажатой клавиши.
    """
    global counter
    if key == keys.SPACE :                          # выбор кнопки Старт
        counter = 1000                              # количество перемешиваний
        while(counter != 0):
            n = choice(range(SIZE**2))              # выбор случайного хода
            if play(n): counter -= 1                # если ход сделан


# Запуск игры
pgzrun.go()      # Запускается главный игровой цикл

Лист.

import warnings
warnings.filterwarnings("ignore", category=RuntimeWarning, message=".*AVX2.*")
from random import choice                       # выбрать случайный элемент списка
import pgzrun
"""
Pygame Zero (pgzrun) - это обёртка над Pygame,
которая упрощает создание игр,
автоматизируя многие рутинные задачи.
"""


# Настройки игры, глобальные константы и переменные
WIDTH = HEIGHT = 500                            # ширина и высота окна
SIZE = 4                                        # размер игрового поля (4x4)
CELL_SIZE = WIDTH // SIZE                       # размер клетки
TITLE = "Головоломка 15"                        # заголовок окна
BACKGROUND_COLOR = 'khaki'                      # цвет кнопки
GRID_COLOR = 'dimgray'                          # цвет сетки
BORDER_COLOR = 'gold'                           # цвет бордюра
DIGITS_COLOR = 'sienna'                         # цвет цифр
DIGITS_SIZE = HEIGHT//10                        # размер цифр
FONT_SIZE = DIGITS_SIZE // 2                    # размер шрифта сообщений
FONT_COLOR = 'olive'                            # Цвет шрифта сообщений
playground = list(range(1, SIZE**2)) + [' ']    # виртуальное игровое поле
counter = 0	                                # счётчик ходов


def draw():
    """
    draw() особая функция, вызывается автоматически каждый кадр,
    обычно, 60 FPS. Доступны объекты: screen, actors и др.
    Назначение: отрисовка всего, что должно быть на экране.
    """
    screen.fill(BACKGROUND_COLOR)                                       # очистка экрана
    dig_params = {'color': DIGITS_COLOR,'fontsize': DIGITS_SIZE}        # цвет и размер цифр
    for n in range(0, WIDTH+1, CELL_SIZE):                              # линии бордюра
        screen.draw.filled_rect(Rect(n-7, 0, 15, HEIGHT), BORDER_COLOR) # вертикальные
        screen.draw.filled_rect(Rect(0, n-7, WIDTH, 15), BORDER_COLOR)  # горизонтальные
    for n in range(CELL_SIZE, WIDTH, CELL_SIZE):                        # линии сетки
        screen.draw.line((n, 0), (n, HEIGHT), GRID_COLOR)               # вертикальные линии
        screen.draw.line((0, n), (WIDTH, n), GRID_COLOR)                # горизонтальные линии
    for n in range(SIZE**2):                                            # печать цифр
        x = n % SIZE * CELL_SIZE + CELL_SIZE // 2 - 10
        if playground[n] != ' ' and playground[n] >  9 :
            x -= DIGITS_SIZE // 5
        y = n // SIZE * CELL_SIZE + + CELL_SIZE // 2 - 15
        screen.draw.text(str(playground[n]), (x, y), **dig_params)

    # печать сообщений
    fnt_params = {'color': FONT_COLOR,'fontsize': FONT_SIZE}
    screen.draw.text(str(counter)+"-й ход", (20, 20), **fnt_params)     # счётчик ходов
    if playground == list(range(1, SIZE**2)) + [' ']:                   # Числа упорядочены
        if counter > 0:
            screen.draw.filled_rect(Rect(CELL_SIZE+1, 2*CELL_SIZE-DIGITS_SIZE*1.5, CELL_SIZE*2-1, DIGITS_SIZE), 'white')
            screen.draw.filled_rect(Rect(CELL_SIZE+1, 2*CELL_SIZE-DIGITS_SIZE//2, CELL_SIZE*2-1, DIGITS_SIZE), 'blue')
            screen.draw.filled_rect(Rect(CELL_SIZE+1, 2*CELL_SIZE+DIGITS_SIZE*0.5, CELL_SIZE*2-1, DIGITS_SIZE), 'red')
            screen.draw.text("Победа!", (1.5*CELL_SIZE, 2*CELL_SIZE - DIGITS_SIZE*1.3), **dig_params)
        if counter >= 0:
            screen.draw.text("Клавиша", (WIDTH - CELL_SIZE + 20, HEIGHT - CELL_SIZE + 30), **fnt_params)
            screen.draw.text("пробел-", (WIDTH - CELL_SIZE + 20, HEIGHT - CELL_SIZE + 50),  **fnt_params)
            screen.draw.text("Старт", (WIDTH - CELL_SIZE + 20, HEIGHT - CELL_SIZE + 70),  **fnt_params)


def play(n):
    """
    Делает ход из клетки с номером n
    в пустую клетку, если это возможно!
    """
    m = playground.index(' ')                                           # индекс пустой клетки
    if n in [m+1, m-1] and m // SIZE == n // SIZE or n in [m-SIZE, m+SIZE]:
        playground[n], playground[m] = playground[m], playground[n]     # делаем ход
        return True
    return False


def on_mouse_down(pos):
    """
    on_mouse_down(pos) особая функция, вызывается автоматически при клике мыши
    Через параметр pos в функцию передаётся кортеж из пары координат (x, y)
    """
    global counter
    if playground == list(range(1, SIZE**2)) + [' ']:
        return                                      # если числа упорядочены
    x = pos[0] // CELL_SIZE                         # номер столбца
    y = pos[1] // CELL_SIZE                         # номер строки
    n = y * SIZE + x                                # номер нажатой клетки
    if play(n):                                     # ход сделан
        counter += 1


def on_key_down(key):
    """
    on_key_down(pos) особая функция, вызывается автоматически при нажатии
    клавиши на клавиатуре. Через параметр key в функцию передаётся
    код нажатой клавиши.
    """
    global counter
    if key == keys.SPACE :                          # выбор кнопки Старт
        counter = 1000                              # количество перемешиваний
        while(counter != 0):
            n = choice(range(SIZE**2))              # выбор случайного хода
            if play(n): counter -= 1                # если ход сделан


# Запуск игры
pgzrun.go()      # Запускается главный игровой цикл

Лист.