Распечатай и играй. Настольные игры

Укладка прямоугольников

Самая распространённая задача о пентамино - сложить из всех фигурок, без перекрытий и зазоров, прямоугольник. Поскольку каждая из 12 фигур включает в себя 5 квадратов, то прямоугольник должен быть площадью 60 единичных квадратов. Возможны прямоугольники 6×10, 5×12, 4×15 и 3×20. Каждую из этих головоломок можно решить вручную, но более сложной задачей является подсчёт общего числа возможных решений в каждом случае. (Очевидно, прямоугольники 2×30 и 1×60 составить из пентамино невозможно, поскольку многие фигуры в них просто не помещаются по ширине.)

Для случая 6×10 эту задачу впервые решил в 1965 году Джон Флетчер . Существует ровно 2339 различных укладок пентамино в прямоугольник 6×10, не считая поворотов и отражений целого прямоугольника, но считая повороты и отражения его частей (иногда внутри прямоугольника образуется симметричная комбинация фигур, поворачивая которую можно получить дополнительные решения; для прямоугольника 3×20, приведённого на рисунке, второе решение можно получить поворотом блока из 7 фигур, или, иначе говоря, если поменять местами четыре фигуры, крайние слева, и одну крайнюю справа).

Для прямоугольника 5×12 существует 1010 решений, 4×15 - 368 решений, 3×20 - всего 2 решения (отличающихся вышеописанным поворотом). В частности, существует 16 способов сложить два прямоугольника 5×6, из которых можно составить как прямоугольник 6×10, так и 5×12.

Укладка прямоугольников из односторонних пентамино

Если дополнить набор пентамино зеркальными копиями фигур, не совпадающих со своими отражениями (F, L, P, N, Y и Z), то из полного набора в 18 односторонних пентамино можно сложить прямоугольники площадью 90 единичных квадратов (при этом фигуры не разрешается переворачивать). Задача о составлении прямоугольника 3×30 имеет 46 решений, 5×18 - более 600 тыс. решений, 6×15 - более 2 млн. решений и 9×10 - более 10 млн. решений

Укладка фигур с отверстиями

В какой-то степени более простую (более симметричную) задачу, для квадрата 8×8 с отверстием в центре 2×2, решил еще в 1958 году Дана Скотт (аспирант-математик Принстона). Для этого случая существует 65 решений. Алгоритм Скотта был одним из первых применений компьютерной программы поиска с возвратом .

Другой вариант этой головоломки - выкладывание квадрата 8×8 с 4 отверстиями в произвольно заданных местах. Большинство таких задач имеют решение. Исключением являются случаи с размещением двух пар отверстий вблизи двух углов доски так, чтобы в каждый угол можно было поместить только P-пентамино, или всех четырёх отверстий вблизи одного угла так, что при любом возможном заполнении угловой клетки (с помощью U- или T-пентамино) от доски отсекается ещё одна клетка (см. рисунок).

Для решения этих задач эффективные алгоритмы описал, например, Дональд Кнут . На современном компьютере подобные головоломки решаются за считанные секунды.

Задача об утроении фигур пентамино

Эта задача была предложена профессором Калифорнийского университета Р.М.Робинсоном. Выбрав одну из 12 фигур пентамино, необходимо построить из каких-либо 9 из 11 оставшихся пентамино фигуру, подобную выбранной, но в 3 раза бо́льшей длины и ширины. Решение существует для любого из 12 пентамино, причём не единственное (от 15 решений для Х до 497 для Р). Существует вариант этой задачи, в котором для построения утроенной фигуры разрешается использовать также и саму исходную фигуру. В этом случае число решений от 20 для Х до 9144 для Р-пентамино.

Представленное на рисунке решение , найденное А.ван де Ветерингом, обладает интересным свойством: каждое пентамино используется для утроения девяти из остальных, по одному разу в каждой. Таким образом, из 9 комплектов исходных фигур пентамино можно одновременно сложить все 12 утроенных пентамино.

Настольная игра

Пентамино может использоваться также как настольная игра для двух игроков. Для игры необходима шахматная доска 8×8 и набор фигур пентамино, клетки которых имеют одинаковый размер с клетками доски. В начале игры доска пуста. Игроки поочерёдно выставляют на доску по одной фигуре, закрывая 5 свободных клеток доски. Все выставленные фигуры остаются на месте до конца партии (не снимаются с доски и не передвигаются). Проигравшим считается игрок, который первым не сможет сделать хода (либо из-за того, что ни одна из оставшихся фигур не умещается на свободных участках доски, либо потому, что все 12 фигур уже выставлены на доску).

Анализ игры достаточно сложен (так, в начале имеется даже больше возможных первых ходов, чем в шахматах). Голомб предложил следующую стратегию: стремиться разбить свободное место на доске на два равновеликих участка (и помешать сопернику сделать это). После этого на каждый ход соперника на одном из участков следует отвечать ходом на другом.

Пример партии в пентамино показан на рисунке. Нумерация ходов сквозная (нечётные номера ходов принадлежат первому игроку, чётные - второму). Первоначально игроки делают ходы в центре доски (ходы 1–3), не позволяя друг другу разбить доску на равновеликие участки. Но затем второй игрок делает неудачный ход (4), позволяющий сопернику разбить свободное место на два участка по 16 клеток (ход 5). (В этом примере свободные участки не только равны по площади, но и совпадают по форме - симметричны относительно диагонали доски, но для стратегии это, разумеется, не обязательно.) Далее на ход второго игрока (6) на одном из этих участков первый игрок отвечает ходом на другом (7) и выигрывает. Хотя на доске ещё есть три свободных участка в пять и более клеток, но все подходящие фигуры (I, P, U) уже использованы.

Варианты настольной игры

Пентамино с заранее выбранными фигурами

В этом варианте игры игроки сначала по очереди выбирают по одной фигуре, пока все фигуры не будут распределены между ними. Далее игра проходит по правилам обычного пентамино, с той разницей, что каждому из игроков разрешается ходить только теми фигурами, которые он выбрал. Взявший последнюю фигуру делает первый ход.

Стратегия этого варианта игры, предложенная Голомбом, существенно отличается от стратегии обычного пентамино. Вместо того, чтобы разбить доску на равновеликие участки, игрок стремится создать на доске участки, которые можно заполнить лишь его фигурами, но не фигурами соперника. (Голомб называет такие участки «убежищами».)

Пример партии в пентамино с заранее выбранными фигурами показан на рисунке. Фигуры, выбранные первым и вторым игроками, перечислены слева и справа от доски соответственно. Зачёркнутая буква обозначает, что фигура использована для хода. Сначала игроки избавляются от самых «неудобных» фигур X и W (ходы 1 и 2). Затем первый игрок создаёт «убежище» для фигуры Y (ход 3), второй - для фигур U и P (ходы 4 и 6). В конце партии (ходы 8-10) происходит заполнение этих «убежищ» и партия заканчивается победой второго игрока - у первого остаётся Т-образное пентамино, для которого на оставшейся части доски нет подходящего места.

Другие варианты

  • «Карточное пентамино» - вариант игры с привнесением случайных событий. Фигуры пентамино (или их буквенные обозначения) рисуют на карточках, которые тасуют и раздают игрокам. Игроки выбирают фигуры в соответствии с розданными им карточками. Далее игра идёт по правилам пентамино с заранее выбранными фигурами.
  • Пентамино для четырёх игроков. Четыре игрока, сидящие по четырём сторонам доски, играют двое на двое (игроки, сидящие друг напротив друга, образуют команду). Проигравшей считается команда, игрок которой первым не сможет сделать хода. В эту игру можно играть по любому из трёх вышеописанных вариантов - обычному, с заранее выбранными фигурами или «карточному».
  • «Кто-кого?» В игре участвует от двух до четырёх игроков, но каждый из них играет только за себя. Победителем считается сделавший последний ход, ему засчитывается 10 очков. Игрок, который должен ходить после победителя (т.е. первым не сможет сделать хода) получает 0 очков, а все остальные игроки - по 5 очков. Может быть сыграно несколько партий, набранные в них очки суммируются. Игра также может проводиться по любому из трёх вышеописанных вариантов правил.

Компьютерные игры

С конца 1980-х годов неоднократно выходили различные компьютерные игры, основанные на пентамино. Наиболее известная - основанная на идее тетриса игра пентикс (Pentix). Один из новейших примеров - игра Dwice, которую разработал в году изобретатель Тетриса Алексей Пажитнов .

Примечания

См. также

Ссылки

  • Клуб любителей пентамино - можно прочесть правила, скачать компьютерную версию игры
  • BANJEN Pentamino - реализация игры

Мне подарили на день рождения в прошлом году. Замечательная маленькая вещица - вы можете перемещать отдельные фрагменты, создавая любую форму, а они светятся по отдельности, питаясь через проводящие грани по периметру.

Из-за очевидной связи с тетрисом меня всегда раздражала одна вещь: лампу невозможно составить в чистый прямоугольник. Как бы я ни старался, всегда какой-нибудь кусочек торчал сбоку, а одного не хватало сверху, или получалась другая раздражающая комбинация.


Это раздражение распространялось на многих, кто посещал мою комнату. В частности, один товарищ потратил целый вечер, перебирая фрагменты в разных комбинациях и отказываясь признать, что у кого-то настолько извращённый ум и он успешно спроектировал фрагменты, которые невозможно составить вместе.

Его усилия оказались тщетными. С тех пор я смирился, что лампу, вероятно, невозможно составить в прямоугольник из-за специально подобранного набора фрагментов.

Однако, выпивая прошлым вечером в комнате, другой мой друг (который раньше не подвергался аморальному влиянию лампы) увидел конструкцию на столе, подумал несколько минут и придумал доказательство, что её действительно нельзя составить в прямоугольник. Доказательство оказалось настолько простым и элегантным, что я решил опубликовать его здесь.

Сама лампа состоит из семи отдельных частей: суммарно, это 28 квадратных фрагментов. Таким образом, если мы хотим сформировать правильную фигуру, она должна иметь размеры 7х4 или 14х2. Здесь мы показываем первый вариант просто потому, что у него более естественная форма. Но доказательство действует и для второй фигуры. Теперь представим, что мы пометили каждый квадрат цветом - чёрным или белым - так что вместе они формируют поверхность вроде шахматной доски, как показано вверху. Заметьте, что количество чёрных клеток должно быть равно количеству белых. Именно этим свойством мы будем оперировать.

Итак, получается 14 чёрных клеток и 14 белых. Если посмотреть отдельно на каждый блок, то проблема сразу становится очевидной.

Как видим, для блоков 1-6 количество чёрных фрагментов равно количеству белых. Естественно, местоположение белых и чёрных фрагментов зависит от позиции блока в прямоугольнике, но сама форма указывает количество таких фрагментов (поскольку соседние фрагменты должны быть разных цветов).

Однако, блок 7 нарушает гармонию. Независимо от того, как его разместить, он всё равно состоит из трёх фрагментов одного цвета и одного фрагмента другого цвета, это свойство напрямую следует из его формы.

Таким образом, если посчитать расцветку на всех блоках, то получится 13 клеток одного цвета и 15 клеток другого цвета, независимо от расположения блоков в общей структуре. А ведь нам нужно по 14 фрагментов каждого цвета, но мы никак не можем их получить, так что изначальное условие невозможно соблюсти, что и требовалось доказать.

Вывод

Доказательство само по себе настолько простое: я даже разочарован, что сам не нашёл его раньше. Тем не менее, приятно знать, что не придётся больше тратить время на бездумное тасование фрагментов в надежде на прорыв.

Может быть, мне стоит перенести свой раздражение с самой лампы на того, кто умышленно спроектировал её таким образом.

Применим технологию ООП для программирования игры.

Используем уже известную нам по программе «Жизнь» консольную графику, основанную на управляющих escape-последовательностях. Но, в отличие от программы «Жизнь», откажемся от непосредственного управления терминалом (команды print , печатающие на терминал трудно запоминаемые escape-последовательности), и положимся на библиотеку, которая делает всю эту работу за нас, предоставляя нам удобный набор процедур.

Раз уж мы решили применить ООП для решения нашей задачи, продумаем объектную модель игры.

Полезно будет отделить в программе ту часть, которая отвечает за пользовательский интерфейс (графика, работа с клавиатурой и звук). Для этой цели предусмотрим пакет процедур Tetris::UI (User Interface ). Такое отделение будет полезно в случае, если мы в дальнейшем захотим усовершенствовать пользовательский интерфейс, например, использовать вместо скромной, консольной, полноценную графику, X Window System. Тогда нам придётся внести изменения лишь в текст модуля Tetris::UI вместо того, чтобы отыскивать по всему тексту программы вызовы графических процедур или процедур для работы с клавиатурой.

Можно пойти ещё дальше - предусмотреть в программе несколько вариантов пользовательского интерфейса, на выбор, в зависимости от ключей в командной строке. Для каждого из вариантов пользовательского интерфейса можно создать свой пакет процедур, например, Tetris::UI::Term::Slangy для консольной графики и Tetris::UI::X11 для полноценной. Оба пакета будет содержать один и тот же набор процедур (ядро), так что остальная часть программы будет «общаться» с пакетом только через это ядро одним и тем же способом. Кроме того, если это понадобится, каждый из этих пакетов можно дополнить другими, вспомогательными процедурами и переменными, специфическими для данного типа интерфейса. Остальная часть программы будет обращаться к ядру пакета, отвечающего за интерфейс, даже не зная, какой тип интерфейса он реализует.

Но пока не будем браться за всё сразу, а реализуем простой пользовательский интерфейс на основе консольной графики в пакете Tetris::UI . Содержимое пакета обсудим позднее.

Есть несколько библиотек, которые упрощают работу с консольной графикой. Наиболее популярными из них являются libncurses и libslang . Их возможности примерно одинаковы, однако в настоящее время libncurses испытывает определённые трудности, если терминал работает с кодировкой UTF-8 , которая даёт возможность одновременно вводить и выводить символы из всех национальных алфавитов, используя всю таблицу символов UCS (большой файл!). Различные символы в кодировке UTF-8 имеют различную длину (в байтах), что пока сбивает с толку библиотеку libncurses . Не дожидаясь, когда ошибки в этой библиотеке будут исправлены, воспользуемся библиотекой libslang , которая не испытывает подобных трудностей.

Обе эти библиотеки написаны на языке C, и предназначены для использования в программах, написанных на C. Чтобы применить возможности таких библиотек в программах, написанных на других алгоритмических языках, требуются дополнительные ухищрения. Мы приспособили библиотеку libslang для использования в Perl, создав пакет процедур Term::Slangy . Этот пакет должен быть установлен на компьютере.

Пользователи операционной системы Mandriva Linux версий 2010.0 и 2010.1 могут скачать пакет RPM и установить его при помощи команд:

% su Password: *пароль суперпользователя* # rpm -vhi perl-Term-Slangy-323.0.0-1tz2010.0.i586.rpm Подготовка... ########################################### 1:perl-Term-Slangy ###########################################

Для его использования в программе нужно включить в текст команду

Perl

use Term::Slangy;

После этого станут доступны процедуры из этого пакета. Обсудим их подробнее.

InitTT()

Эта процедура обязательно должна вызываться перед началом использования консольной графики. Она определяет размер терминала (количество строк и столбцов), узнаёт тип терминала и отыскивает в базе данных terminfo, какие управляющие escape-последовательности отвечают каким управляющим действиям.

termTT()

Эта процедура обязательно должна вызываться после использования консольной графики, иначе терминал останется в изменённом, испорченном состоянии, и возвращать его в исходное придётся командой reset .

rows()
cols()

Процедуры возвращают размер терминала - количество строк и столбцов соответственно.

utf8Mode( $mode )

Включает поддержку кодировки UTF-8 . Если $mode равен -1 , этот режим будет установлен, если терминал настроен на использование этой кодировки. Как правило, именно это и требуется. Вызов данной процедуры должен предшествовать вызову initTT() .

clear()

Процедура очищает экран. Видимые изменения наступят лишь после вызова процедуры refresh() .

cursorVisibility( $mode )

Изменяет вид курсора в зависимости от $mode : при 0 курсор становится невидимым, при 1 - видимым. Изменения проявятся после вызова refresh() .

move( $row , $column )

Перемещает курсор в точку экрана с координатами ( $column , $row )

writeString( $string )

Выводит строку $string в текущем положении курсора. Курсор сдвигается. Изменения проявятся после вызова refresh() .

writeChar( $char )

Выводит символ $char в текущем положении курсора. $char - целочисленный номер символа из таблицы символов UCS . Курсор сдвигается. Изменения проявятся после вызова refresh() .

fillChar( $row , $col , $height , $width , $char )

Заполняет символом $char прямоугольную область экрана. Левый верхний угол прямоугольника в точке экрана с координатами ( $row , $col ), высота и ширина - $height и $width . Изменения проявятся после вызова refresh() .

hLine( $row , $col , $width , $char )
vLine( $row , $col , $height , $char )

Заполняет символом $char горизонтальную и вертикальную линию, начиная от точки с координатами ( $row , $col ). Соответственно ширина и высота линии - $width и $height . Изменения проявятся после вызова refresh() .

colorPair( $color , $foreground , $background )

Определяет цветовую пару (передний план, фон) и присваивает ей номер $color . Передний план - $foreground , фон - $background . Чтобы не запоминать значения параметров $foreground и $background , в классе определены константы, приведённые в таблице:

название цвета цвет значение параметра
чёрный COLOR_BLACK
красный COLOR_RED
зелёный COLOR_GREEN
коричневый COLOR_BROWN
синий COLOR_BLUE
фиолетовый COLOR_MAGENTA
циан COLOR_CYAN
светло-серый COLOR_LGRAY
серый COLOR_GRAY
ярко-красный COLOR_BRIGHT_RED
ярко-зелёный COLOR_BRIGHT_GREEN
ярко-жёлтый COLOR_BRIGHT_BROWN
ярко-синий COLOR_BRIGHT_BLUE
ярко-фиолетовый COLOR_BRIGHT_MAGENTA
яркий циан COLOR_BRIGHT_CYAN
ярко-белый COLOR_BRIGHT_WHITE

Процедуры, использующие цвета, должны ссылаться на них по номеру $color .

fillColor( $row , $col , $height , $width , $color )

Заполняет цветом $color прямоугольную область экрана. Левый верхний угол прямоугольника в точке экрана с координатами ( $row , $col ), высота и ширина - $height и $width . Изменения проявятся после вызова refresh() .

setColor( $color )

Делает цвет $color текущим. Дальнейшее рисование осуществляется этим цветом.

initKeypad()

Эта процедура должна вызываться перед вызовами процедур, работающих с клавиатурой.

refresh()

Эту процедуру следует вызвать каждый раз, когда нужно сделать видимыми результаты работы «рисующих» процедур.

getKey()

Останавливает программу в ожидании нажатия клавиши. Как только клавиша нажата, возвращает номер введённого символа из таблицы символов UCS .

inputPending( $msec )

Процедура ожидает нажатия клавиши в течение $msec миллисекунд. Если за этот период клавиши не нажимались, возвращает 0 . Иначе завершается немедленно после нажатия, возвращая 1 .

Нам потребуются три системы декартовых координат (). Одна (красная) связана с экраном, её начало будет находиться в левом верхнем углу экрана. Другая (жёлтая) - со стаканом, с началом в его левом верхнем углу. И, наконец, третья, зелёная, будет связана с текущей фигурой. Начало последней системы координат разместим в левом верхнем углу прямоугольника с вертикальными и горизонтальными сторонами, описанного около фигуры.


Первая координатная система нужна, поскольку рисовальные процедуры из пакета Term::Slangy используют именно её. Перемещения фигуры внутри стакана удобнее отсчитывать по отношению к стакану, для этого потребуется вторая. Наконец, для рисования самой фигуры удобнее задавать положения квадратов, из которых она составлена, относительно какой-нибудь выделенной точки в фигуре, на роль которой просится левый верхний угол её описанного прямоугольника.

Будем рассматривать фигуры тетриса как объекта класса Tetris::Figure .

В начале работы программы создаются семь фигур и размещаются в массиве. Затем происходит следующее. Из массива фигур выбирается случайным образом одна - «текущая». Она размещается в верхней части стакана и начинает своё падение, отзываясь на нажатия клавиш управления. Как только текущая фигура утратит возможность сдвигаться вниз, фигура становится набором клеточек на дне стакана. Однако она не прекращает своего существования и ждёт своего часа в массиве фигур, пока снова не выпадет случайно её номер.

Под действием управляющих клавиш фигура может сдвигаться вправо/влево, поворачиваться на 90° в обе стороны, или упасть на дно стакана. В отсутствие нажатий в течение определённого времени фигура сдвигается вниз, пока это возможно. Следует учесть, что все описанные сдвиги и повороты выполняются только в пределах стакана, причём таким образом, чтобы фигура не перекрывала клеточки, уже находящиеся на дне стакана. Если клеточки или границы стакана мешают выполнить манёвр, ничего не происходит.

Данные объекта $figure класса Tetris::Figure включают информацию о форме фигуры и её цвете. Такие разнородные сведения удобно хранить в ассоциативном массиве с ключами shapes (форма) и color (цвет).

Поскольку фигуры не обладают самостоятельной способностью нарисоваться на экране (обязанность рисовать возложена на класс Tetris::UI), просто пронумеруем цвета числами и разместим эти числа как значения, отвечающие ключу color . Класс Tetris::UI разберётся, как сопоставить эти номера реальным цветам, используемым при рисовании.

Наиболее сложный момент - внутреннее представление формы фигуры. Напрашивающееся решение, основанное на двумерном массиве, заполненном нулями и единицами, возможно, однако грозит осложнениями. При поворотах фигуры этот двумерный массив придётся серьёзно перерабатывать. Хотелось бы, чтобы при поворотах левый верхний фигуры оставался на прежнем месте.

Вместо вычислений форм фигуры, получающихся при поворотах, мы для каждой фигуры создадим массив, содержащий всё такие её формы. Ссылку на этот массив разместим как значение, отвечающее ключу shapes . Самый первый (имеющий индекс 0) элемент массива содержит текущую форму фигуры. При повороте влево этот первый элемент удаляется из начала массива и добавляется в конец. При вращении вправо, наоборот, удаляется последний элемент и добавляется в начало. На наше счастье некоторые фигуры обладают поворотной симметрией. Фигуры «I», «Z», «S» имеют симметрию второго порядка, поэтому их формы повторяются после двукратного поворота; их массив форм будет содержать только два элемента. Фигура «Q» имеет симметрию четвёртого порядка, и её массив форм будет состоять из единственной формы. Оставшиеся фигуры «T», «J», «L» не имеют поворотной симметрии, поэтому в их массивах форм будет по четыре элемента.

Но как закодировать ту или иную форму фигуры? Мы предлагаем не совсем обычный подход. Каждую ряд фигуры будем кодировать с помощью строки, в которой заполненные клетки изображаются символом ■ , а отсутствующие - символом □ (вместо этих символов можно взять любые другие, скажем, # и пробел). Строки, соответствующие рядам фигуры, соединяются вместе, а в качестве разделителя рядов используется символ | (см. 40.1. «Формы фигур тетриса и кодирующие их строки»). Информации, заключённой в такой строке, вполне достаточно, чтобы, к примеру, вычислить ширину и высоту фигуры.


New( $shapes , $color )

Конструктор новых фигур. Передаваемые параметры - информация о форме ($shapes) и цвете ($color) фигуры.

width()
height()

Возвращают соответственно ширину и высоту фигуры (в клеточках).

getCell( $j , $i )

Возвращает 1 , если в системе координат, связанной с фигурой («зелёной», см. рисунок 40.3. «Системы координат в программе tetris.pl »), клетка с координатами ( $j , $i ) принадлежит фигуре, и 0 в противном случае.

shape()

Возвращает текущую форму фигуры, точнее, кодирующую эту форму строку. Напомним, что это первый элемент массива форм.

rotateLeft()
rotateRight()

Поворачивают фигуру соответственно влево и вправо.

Show()
hide()

Показаться и скрыться (стать невидимой).

move( $dir )

Сдвинуться или повернуться. Параметр $dir указывает направление сдвига или поворота в соответствии с таблицей:

Данная процедура не приводит к перемещению фигуры на экране. Она всего лишь меняет её внутренние свойства (к примеру, координаты фигуры в стакане). Чтобы действительно переместить фигуру на экране, нужно вызвать процедуру showMove .

showMove( $dir )

Переместиться в соответствии с параметром $dir и показать перемещение на экране.

canMove( $dir )

Возвращает 1 , если фигура может сдвинуться или повернуться в соответствии с направлением $dir ; в противном случае возвращает 0 .

fall()

Init()

Подготовить пользовательский интерфейс (экран, клавиатуру) к работе. Вывести баннер с названием программы и сведениями об авторах.

term()

Завершить работу пользовательского интерфейса: очистить экран, зажечь курсор, вернуть экран в первоначальное состояние.

showFigure( $fig , $x , $y , $color )

Показать фигуру $fig (объект класса Tetris::Figure) в стакане, используя «жёлтые» координаты $x и $y . Если параметр $color не указан, используется собственный цвет фигуры, в противном случае используется указанный номер цвета.

showNextFigure( $fig )

Показать фигуру $fig как следующую, то есть вне стакана, в специально предназначенном для этого месте под надписью «Следующая:».

showScore( $score )

Показать текущий счёт $score рядом с надписью «Счёт:».

showGlass()

Показать стакан.

play( $fileName )

Проиграть аудиофайл, чьё имя указано в параметре $fileName .

Текста пока нет

Работал в Вычислительном центре Академии наук СССР и занимался электронными системами распознавания речи. И в свободное время создал игру, которая свела с ума весь мир и вот уже более 30 лет не теряет популярности. Мы поговорили с создателем легендарного «Тетриса» — об истории игры, буднях советских программистов и современном игровом рынке.

Людмила Алексеева, АиФ.ru:​ Алексей Леонидович, чем вы занимаетесь сейчас?

Мне почти 60 лет, я уже пенсионер, так что — живу и наслаждаюсь пенсией. Совсем отрасль не оставил, у нас есть маленькая активная группка, мы вместе работаем уже много лет, делаем небольшие головоломные игры для Appstore.

Алексей Пажитнов. Фото: www.globallookpress.com

— «Тетрис» — очень простая игра, и в плане правил, и в плане интерфейса. Как вы думаете, если бы её придумали в наше время, была бы она так популярна у современных пользователей?

— История не знает сослагательного наклонения. Так что то, что я по этому поводу скажу, наверное, будет чистой спекуляцией. Что я могу сказать? Игра хорошая, но сейчас, поскольку мы не прекращаем над ней работать, мы понимаем, что она стала немножечко старомодной. Всё-таки игра была сделана на одного игрока, и многочисленные попытки за эти 30 лет сделать двухигроковую версию пока не увенчались успехом. Было несколько хороших результатов, но такого эффекта, как сам тетрис произвёл, достичь ещё не удалось.

Кроме того, для управления тетрисом нужно 6 клавиш. Современный игрок привык использовать только одну, так что в этом смысле игра тоже немножко старомодна — требует некоторого обучения, как в неё играть. Но независимо от всего этого, за 30 лет технологии сильно изменились, а человеческие мозги, я надеюсь, остались такими же. То, что нравилось нам в молодости, наверняка будет нравиться вам и сейчас.

— Я правильно понимаю, что вы не оставляете попытки сделать «Тетрис» на двоих?

— Да, мы по-прежнему работаем над ним. И вообще наша задача и глобальная цель — сделать «Тетрис» олимпийским видом спорта. Мы пробуем это сделать, есть медленный прогресс. Но ещё одна проблема — «Тетрис» хорош, чтобы в него играть, но не так хорош, чтобы его смотреть. Не хватает зрелищности. Явно надо сделать какую-то версию, чтобы это было поистине зрелищно для всех.

— Вы бывали на турнирах по игре в «Тетрис», которые периодически проходят?

— Один раз был. Помню, в 90-е годы в Nintendo объявили всемирные соревнования по тетрису. Ну, приехали там человек 15 из Европы, Америки, и пришло в три раза больше японских школьников. Вот такие всемирные соревнования. Всерьёз рассматривать их я бы не стал. Хотя небольшие соревнования часто устраиваются, в разных странах проходят локальные турниры. Ну, приезжает человек 6-10, играют, есть даже комментатор, который громко кричит, всё очень азартно проходит. Но не всемирный размах, конечно.

Фото: Shutterstock.com / Sam Aronov

— Были ли попытки как-то усложнить игру — ведь во многих современных играх много всяких бонусов, монеток, дополнительных раундов?

— С точки зрения дизайнера, обвязка — это некие костыли. Если у вас в механике что-то не так, то можно создать для пользователей дополнительную мотивацию. Заставить человек получить очки, поставить ему цель добиться чего-то. Но «Тетрису» костыли никогда особо не требовались — сама по себе игра хороша. Нашу другую головоломку, Marbly, мы снабдили этими обвязками, потому что не хотели сильно выделяться среди других игр, чтобы не отпугнуть игроков. Ведь у современных игр обвязка достаточно мощная.

— «Тетрис» был написан в 1984 году на языке программирования «Паскаль». А как объяснить современному человеку, который ещё не родился тогда, на каком компьютере была создана игра? Если сравнить с мощностью обычного современного пользовательского компьютера?

— Это был компьютер, созданный в лаборатории Вычислительного центра Академии наук на базе «Электроники-60». «Электроника-60» — это первый компьютер, претендовавший на то, чтобы быть персональным. Рабочее место, где программист сидел, вбивал программу, прогонял её, получал результаты. Проблема с «Электроникой-60» была в том, что у неё вводным устройством был консул, такая печатная машинка, вы, наверное, даже не представляете, что это. Когда я говорил слово «консул» 10 лет назад, те, кто помнили, как это выглядело, начинали дико хохотать. Огромная тяжелейшая механическая печатная машинка, которая с диким треском работала, отправляя данные в ЭВМ. Печатала она отвратительно. Худшего наказания для человека, чем поработать на ней, придумать было невозможно. А чтобы данные хранить, была ленточная операционная система. Это были даже не перфокарты, а перфоленты. Если у тебя ошибка в коде, в случае с перфокартами можно было просто заменить одну карту на правильную. Перфоленту приходилось менять полностью! Хоть что-нибудь создать на таких машинах было почти невозможно. Сама машина была отвязана от своих внешних устройств, и к ней можно было присоединять любые другие устройства. И к «Электронике-60» тогда навесили дисплей. Что-то вроде отдельно стоящего телевизора, который умел выдавать на экран текст, 24 строки. Никакой графики не было вообще. Памяти на этой машине было 512 килобайт — тогда это была потрясающе огромная оперативная память. Сейчас с 512 килобайтами, по-моему, даже e-mail не сможете послать.

— Получается, на этой махине «Тетрис» и был написан?

— По сути, да. Операционная система тогда была на флоппи-дисках. И вот когда появился дисплей и флоппи-дисковая система, было ощущение какого-то идеального комфорта. Нам казалось, что мы таким образом проработаем ещё многие десятилетия. Мы не чувствовали, что нам нужно что-то ещё. Прекрасно обходились без интернета. Подцепляли графику, чтобы позабавиться. Я вообще занимался системами распознавания речи. Тогда никто всерьёз это не принимал. Да, были какие-то КГБшные и военные приложения этих разработок, например чтобы прослушивать разговоры, автоматически что-то отлавливать в них. Но это был вопрос такого далёкого будущего, что мы считали это фундаментальным исследованием. Это сейчас я в полном восторге от современных систем распознавания речи, поскольку я знаю немного, как это работает изнутри. Тот факт, что система сходу начинает вас понимать, — для меня это просто чудо.

— С Siri разговариваете?

— Немного. Я ещё в то время, когда профессионально этим занимался, так устал что-то долбить голосом в компьютер, что с тех пор у меня какое-то отторжение.

— Если вернуться к «Тетрису», помните, кто был первым игроком?

— Долгое время только я. В той версии было 10 уровней, и на уровне 5-6 я сидел добрых три-четыре недели. Без графики, цвета, звуков «Тетрис» был совсем не таким. Ещё и экран дрожал. Фигурки были сделаны, по сути, из скобок и пробелов. В общем, было сложновато, поэтому я и был единственным игроком. Но когда она у меня заиграла, я не мог остановиться, ни доделать, ни дооформить. Мои коллеги видели, что я делаю, и тоже захотели попробовать. Их зацепило. Потом я уже сделал рабочую версию на дискетке. Пользователи «Электроники-60» должны были дружить между собой: софтвер друг другу передавали, иначе машину не оснастишь. Кто что напишет, делится с другими. Очень скоро на всех «Электрониках-60» играли в тетрис. И только через год или полтора мы сделали версию для PC. Потому что в 84 году мы даже PC не видели, он появился на полгода позже.

— Позже «Тетрис» начала выпускать американская Mirrorsoft, которая продавала игру, ещё не имея прав на неё. Потом был спор за покупку прав на «Тетрис» между двумя компаниями — Atari и Nintendo — настоящие коммерческие войны. А что вы получили за это? Премию, автомобиль отечественный, устную благодарность?

— Ничего. В тот момент, когда какие-то деньги капнули назад в институт, я там уже не работал. Так-то, наверное, они бы и рады были что-то мне предложить. Мне PC-версию помогал сделать Вадим Герасимов , ему, по-моему, подарили персональный компьютер. Все сотрудники Вычислительного центра получили какие-то бонусы: кто холодильник, кто ещё что. Просто я тогда уже там не трудился.

— История, которая меня удивила, — что вы через 10 лет смогли получить назад права на своё изобретение. Как вам это удалось?

— Вопрос о моих правах всегда был серым и непонятным местом и с юридической, и с практической точки зрения. Я особо не педалировал эту тему, не старался настоять на своих правах. Но в определённый момент вокруг «Тетриса» возник юридический спор. Права были неправильно проданы одной компании без согласия советской стороны. Когда стали оформлять эти вещи юридически, понадобилось понять всю историю. И возник вопрос, кто изобретатель. Я написал заявление, что я, такой-то, создал игру тогда-то, первое её публичное появление было там-то. И на 10 лет предоставил права на эту игру Вычислительному центру. В тот момент 10 лет казались совершенно необозримым сроком. В тот момент ни одна игра больше 6 месяцев не жила. Поэтому никто и не думал, что к этому вопросу ещё вернутся. Бумага приняла серьёзный статус. С ней все согласились, она была предъявлена в судах. И через 10 лет, согласно этой бумаге, права ко мне вернулись.

— Есть ли у тетриса конец? Я слышала, один профессор математически доказал, что выиграть в него невозможно...

— Профессор решал забавную для него задачу — можно ли написать алгоритм, который бы любую последовательность заведомо выигрывал. И на этот вопрос ответ был дан отрицательный. Результат был для меня неожиданным: я-то думал, что такой алгоритм можно составить. Но нельзя сказать, что хороший игрок не может долго продержаться в игре.

— Вы работали в Microsoft, где, наверняка, было огромное количество гиков. А вы персонаж для них по-своему культовый, мне кажется. Не докучали ли вниманием?

— Я работал в игровом департаменте, там всё-таки трудились более-менее профессионалы, они всё видели, их ничем не удивишь. Ну, первый день они, может, и разинут на меня варежку. А потом — ну я же такой же, как вчера. На улицах меня не узнают. Разве что один раз за 30 лет такое было. «Кинозвездой» я никогда не был и, надеюсь, не буду.

— Я слышала, вы поклонник настольных игр. А какие игры для вас самые любимые?

— Мы в семье часто играем в Settlers of Catan. Классическая настольная игра, по-моему, лучшая из всех. Она существует уже лет 35. Я её обожаю. Ещё очень люблю кубики Рубика! Вот у меня под рукой сейчас 2 на 4, я ещё не умею такой собирать. Головоломки, всякие штучки дурацкие — это всё моё!

— А это пригождается при создании электронных игр?

— Конечно! В основе этих вещей лежат какие-то принципы, которые иногда можно приложить и к компьютерной игре. В общем-то, тетрис я делал, имея в виду настольную игру «Пентамино». У меня до сих пор хранится коробочка с ней, ей лет 50 уже. Это фигурки из пяти квадратов, 12 штук различных форм. Их можно вытряхнуть из коробки, попробовать сложить из них красивую форму. А предмет головоломки — собрать эти 12 штук в прямоугольник. Я много играл в нее, чувствовал эти формы и решил запрограммировать такую игру. Правда, для игры в реальном времени эти фигурки были сложноваты и по количеству, и по формам. Я сделал 7 фигурок из 4 квадратов.

Настольная игра «Пентамино». Фото: Shutterstock.com / Philip Date

— Какие игры вам нравятся из электронных?

— Я люблю всякие головоломки. Помимо популярной «2048» (я считаю, хорошая игра, и большая похвала дизайнеру, который её сделал) я ещё играю в очень похожую на нее игру Catthrees. Она примерно так же устроена, но другой интерфейс. Она не настолько математична, в ней больше случайного. Очень мне понравилась игра Flow: там расставлены точки, и нужно их соединить линиями, чтобы они заполнили всё поле. Мы даже сделали с друзьями игру в таком стиле, она называется Symbol-link.

— Как вы считаете, как должна происходить монетизация игр? Они должны быть платными изначально или зарабатывать рекламой и продажей бонусов и подсказок?

— Я человек старомодный и считаю, что они должны быть изначально платными. Вам не жалко трёх долларов на чашку кофе? А от чашки кофе вы получаете удовольствие в лучшем случае 15 минут. А почему бы вам не заплатить 5 долларов за несколько часов полного счастья с интересной игрой? Я не понимаю этого: люди почему-то не платят, потому что считают, что кто-то на этих вещах разбогатеет. Поверьте, там доходы такие, что ни о каком богатстве речи быть не может. Это очень тяжёлая работа. Для нашей игры Marbly мы сделали 300 уровней. В день больше 10 уровней сделать нельзя. Это месяц серьёзной работы. Сидишь, пробуешь, исправляешь, решаешь. Перед тобой большой массив данных, которые надо проверить, оттестировать, оформить. Я надеюсь, в конце концов люди начнут ценить результат человеческого труда.

— Это в России такая ситуация с платными играми или везде так?

— Везде. Есть много самонадеянных ребят, которым надо выпендриться или доказать, что они тоже большие. Они пишут и размещают игры бесплатно. Код, как правило, у этих игр ужасный, ошибок много, идеи, как правило, сворованы. Но они создают у игроков впечатление, что это нормально и все игры должны быть такими. А люди, которые этим профессионально занимаются, должны следовать рынку — раз сложилась такая установка, то надо с ней что-то делать. Пробовали мы выпускать главную игру бесплатно, а всякие удобства и привилегии продавать. Ничего в этом хорошего нет. Мы должны стоять в дурацкой третьей позиции, типа: играйте в плохую версию, а чтобы играть, как человек, заплатите. Ну что это такое? На это сердятся. Ругают нас. Я всё-таки надеюсь, что на рынке наведут порядок. Он сейчас колоссально вырос в связи с распространением смартфонов, планшетов, отсюда и такой хаос. Но это временно.

— «Тетрис» часто воруют?

— Ещё как! Сколько мы судились! Но «Тетрис» — это серьёзный бренд, который защищён. У нас на то, чтобы следить за правом на интеллектуальную собственность, уходят серьёзные средства, но мы готовы их тратить. Мы уже 30 лет следим за качеством игры, улучшаем её. И защищаем, конечно.

— Почему единственная действительно известная компьютерная игра родом из России — «Тетрис»? Ведь у нас достаточно много отличных программистов, математиков...

— Программист и математик — лица с голосом совещательным. Здесь главное игровой дизайн, ведь игра — это скорее психологический продукт, нежели технический. Но у нас есть хорошие дизайнеры, и в России выходили очень неплохие игры. Просто наша часть индустрии немножко в стороне от всего. И пробиться русскому парню тяжелее, чем американскому молодцу.

Вообще, появлялись сильные игры. Вот есть такая игра — шарики, Balls. В неё играют, по-моему, не меньшее количество лет, чем в «Тетрис», хотя Женя Сотников , который сделал эту игру, уже давно ушёл из игровой индустрии.

— Насколько наши программисты сейчас востребованы за рубежом?

Любой хороший программист востребован в мире. Только в Microsoft работают 5-6 сотен русских программистов, что очень немало. Как и в любом сообществе из 5-6 сотен людей там есть и разгильдяи, и охламоны, и очень талантливые люди.

— В целом, у нас традиционно неплохое техническое образование с хорошим математическим и программистским базисом. В какой-то момент такие сотрудники были не очень востребованы, потому что нужно было выдавать километры кода, причем очень простого. Для этого особого образования не нужно. Но сейчас, поскольку задачи все более интеллектуальные, серьёзные программисты всё более востребованы.

— Вы давно живёте в Сиэтле. Бываете в родной Москве?

— Стараюсь побывать дома каждый год. У меня в Москве квартира, я приезжаю. В этом году был с апреля по июль. Очень люблю весну в Москве, июнь — обожаю.

— С каким чувством вы уезжали из России?

— Да как такового отъезда у меня не было. Я ехал поработать года на три. А в итоге семья приехала, дети в школу пошли, оказалось, есть смысл дом купить. Потом моя страна исчезла. Там и остался. Оглянуться не успел, как вроде как уехал навсегда. Но что значит навсегда? У меня в Москве квартира, я вроде как вполне себе москвич.

— Последний вопрос по поводу «Тетриса» — от моей коллеги. Вот бывает в игре, что ты так выстроил фигуры, что спасти тебя может только прямая «палочка» и больше ничего. И ты её ждёшь, ждёшь, а она всё не вылетает, как назло. Есть ли в этом умысел программиста, который специально так запрограммировал, что нужная фигурка не появляется? Или это просто совпадение?

— Я понимаю, о чём речь. Это свойство выборочной памяти. Вашей коллеге эта палочка прилетала очень много раз тогда, когда ей не нужно было. Она её ставила и мгновенно об этом забывала. А вот когда нужная деталь не приходит — вот такие случаи запоминаются. И кажется, что какие-то злые силы тебе вредят. Поэтому в первой версии игры я специально (я как знал, что будут меня обвинять в злонамеренности) украсил экран именно статистикой. Я вывел все 7 фигурок, и на экране было показано, сколько раз каждая фигурка появилась. Чтобы вы знали, что они выпадают равномерно.

Статьи по теме: