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