Pyzzle 15, игра известная в нашей стране, как «Пятнашки». «Пятнашки» – это логическая игра-головоломка. Цель игры – упорядочить пронумерованные плитки на игровом размером 4Х4.

Пишем компьютерную версию игры на языке программирования Python с использованием библиотеки Pygame Zero.

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


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

Лист. 1. Подключаем библиотек pgzrun (pygame) и запускаем главный игровой цикл.

В программе листинг 1 метод filterwarnings из библиотеки warnings устраняет сообщение о не оптимально скомпилированной для вашего компьютера библиотеке pgzrun (pygame).

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()      # Запускается главный игровой цикл

Лист. 2.

Образец Код Название CSS Название
          #F0F8FF aliceblue блекло-голубой
         #FAEBD7 antiquewhite античный белый
     #00FFFF aqua синий
          #7FFF00 chartreuse фисташковый
          #F5F5DC azure лазурь
          #F5F5DC beige бежевый
          #FFE4C4 bisque бисквитный
          #FFF8DC cornsilk темно-зеленый
       #FFEBCD blanchedalmond светло-кремовый
       #0000FF blue голубой
       #8A2BE2 blueviolet светло-фиолетовый
       #B8860B darkgoldenrot темный красно-золотой
       #006400 darkgreen темно-зеленый
       #8B008B darkmagenta темный фуксин
       #FF8C00 darkorange темно-оранжевый
    #8B0000 darkred темно-красный
    #8FBC8F darkseagreen темный морской волны
    #2F4F4F darkslategray темный сине-серый
    #9400D3 darkviolet темно-фиолетовый
    #00BFFF deepskyblue темный небесно-голубой
    #1E90FF dodgerblue тускло-васильковый
    #FFFAF0 floralwhite цветочно-белый
    #FF00FF fuchsia фуксии
    #DCDCDC gainsboro гейнсборо
    #DAA520 goldenrod красного золота
    #008000 green зеленый
    #F0FFF0 honeydew свежего меда
    #CD5C5C indianred ярко-красный
    #FFFFF0 ivory слоновой кости
    #E6E6FA lavender бледно-лиловый
    #7CFC00 lawngreen зеленой лужайки
    #ADD8E6 lightblue светло-голубой
    #E0FFFF lightcyan светло-циановый
    #90EE90 lightgreen светло-зеленый
    #FFB6C1 lightpink светло-розовый
    #20B2AA lightseagreen светлый морской волны
    #778899 lightslategray светлый сине-серый
    #FFFFE0 lightyellow светло-желтый
    #32CD32 limegreen зеленовато-известковый
    #FF00FF фуксин blanchedalmond
    #66CDAA mediumaquamarine умеренно-аквамариновый
    #3CB371 mediumseagreen умеренный морской волны
    #BA55D3 mediumorchid умеренно-орхидейный
    #00FA9A mediumspringgreen умеренный сине-серый
    #0C71585 mediumvioletred умеренный красно-фиолетовый
    #0F5FFFA mintcream мятно-кремовый
    #FFE4B5 moccasin болотный
    #000080 navy морской
    #808000 olive оливковый
    #FFA500 orange оранжевый
    #DA70D6 orchid орхидейный
    #98FB98 palegreen бледно-зеленый
    #DB7093 palevioletred бледный красно-фиолетовый
    #FFDAB9 peachpuff персиковый
    #FFC0CB pink розовый
    #B0E0E6 powderblue туманно-голубой
    #FF0000 red красный
    #4169E1 royalblue королевский голубой
    #FA8072 salmon оранжево-розовый
    #2E8B57 seagreen морской зеленый
    #A0522D sienna охра
        #87CEEB skyblue небесно-голубой
        #708090 slategray сине-серый
        #00FF7F springgreen весенне-зеленый
        #D2B48C tan желто-коричневый
        #D8BFD8 thistle чертополоха
        #40E0D0 turquoise бирюзовый
        #F5DEB3 wheat пшеничный
        #F5F5F5 whitesmoke белый дымчатый
        #9ACD32 yellowgreen желто-зеленый
          #A52A2A brown коричневый
         #DEB887 burlywood старого дерева
     #5F9EA0 cadetblue блеклый серо-голубой
          #FF7F50 coral коралловый
          #D2691E chocolate шоколадный
          #6495ED cornflowerblue васильковый
          #000000 black черный
          #DC143C crimson малиновый
       #00FFFF cyan циан
       #00008B darkblue темно-голубой
       #008B8B darkcyan темный циан
    #A9A9A darkgray темно-серый
       #BDB76B darkkhaki темный хаки
       #556B2F darkolivegreen темно-оливковый
    #9932CC darkorchid темно-орхидейный
    #E9967A darksalmon темно-оранжево-розовый
    #483D8B darkslateblue темный сине-серый
    #00CED1 darkturqueise темно-бирюзовый
    #FF1493 deeppink темно-розовый
    #696969 dimgray тускло-серый
    #B22222 firebrick огнеупорного кирпича
    #228B22 forestgreen лесной зеленый
    #F8F8FF ghostwhite туманно-белый
    #FFD700 gold золотой
    #808080 gray серый
    #ADFF2F greenyellow желто-зеленый
    #FF69B4 hotpink ярко-розовый
    #4B0082 indigo индиго
    #F0E68C khaki хаки
    #FFF0F5 lavenderblush бледный розово-лиловый
    #FFFACD lemonchiffon лимонный
    #F08080 lightcoral светло-коралловый
    #FAFAD2 lightgoldenrodyellow светлый золотисто-желтый
    #D3D3D3 lightgrey светло-серый
    #FFA07A lightsalmon светлый оранжево-розовый
    #87CEFA lightskyblue светлый небесно-голубой
    #B0C4DE lightsteelblue светло-стальной
    #00FF00 lime цвета извести
    #FAF0E6 linen льняной
    #800000 maroon оранжево-розовый
    #0000CD mediumblue умеренно-голубой
    #7B68EE mediumslateblue умеренный серо-голубой
    #9370DB mediumpurple умеренно-пурпурный
    #48D1CC mediumturquose умеренно-бирюзовый
    #191970 midnightblue полуночный синий
    #FFE4E1 mistyrose туманно-розовый
    #FFDEAD navajowhite грязно-серый
    #FDF5E6 oldlace старого коньяка
    #6B8E23 olivedrab
    #FF4500 orangered оранжево-красный
    #EEE8AA palegoldenrod бледно-золотистый
    #AFEEEE paleturquoise бледно-бирюзовый
    #FFEFD5 papayawhip дынный
    #CD853F peru коричневый
    #DDA0DD plum сливовый
    #800080 purple пурпурный
    #BC8F8F rosybrown розово-коричневый
    #8B4513 saddlebrown старой кожи
    #F4A460 sandybrown рыже-коричневый
    #FFF5EE seashell морской пены
    #C0C0C0 silver серебристый
        #6A5ACD slateblue серо-голубой
        #FFFAFA snow снежный
        #4682B4 steelblue сине-стальной
        #008080 teal чайный
        #FF6347 tomato томатный
        #EE82EE violet фиолетовый
        #FFFFFF white белый
        #FFFF00 yellow желтый
        #7FFFD4 aquamarine аквамарин

Табл. 1.

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()      # Запускается главный игровой цикл

Лист.

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
    if m // SIZE == n // SIZE:
        if m > n:                                                       # пустая клетка справа
            for i in range(m, n, -1):
                playground[i], playground[i-1] = playground[i-1], playground[i]
            return True
        if m < n:                                                       # пустая клетка слева
            for i in range(m, n, 1):
                playground[i], playground[i+1] = playground[i+1], playground[i]
            return True
    if m % SIZE == n % SIZE:
        if m > n:                                                       # пустая клетка снизу
            for i in range(m, n, -SIZE):
                playground[i], playground[i-SIZE] = playground[i-SIZE], playground[i]
            return True
        if m < n:                                                       # пустая клетка сверху
            for i in range(m, n, SIZE):
                playground[i], playground[i+SIZE] = playground[i+SIZE], playground[i]
            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(' ')                                           # индекс пустой клетки
    step = 0                                                            # Шаг и направление
    if m // SIZE == n // SIZE:                                          # m и n в одной строке
        step = -1                                                       # пустая клетка справа
        if m < n:                                                       # пустая клетка слева
            step = 1
    if m % SIZE == n % SIZE:                                            # m и n в одной колонке
        step = -SIZE                                                    # пустая клетка снизу
        if m < n:                                                       # пустая клетка сверху
            step = SIZE
    if step != 0:
        for i in range(m, n, step):
            playground[i], playground[i+step] = playground[i+step], playground[i]   # ход
        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()      # Запускается главный игровой цикл

Лист.