• Что можно приготовить из кальмаров: быстро и вкусно

    “Пентамино” - одна из самых популярных мировых головоломок, пик популярности пришелся на конец 60-х годов. Сама игра подробно описывалась в журнале “Наука и жизнь”. В эту головоломку могут играть и дети и взрослые.

    Запатентовал головоломку “Pentomino” Соломон Вольф Голомб , житель Балтимора, математик и инженер, профессор университета Южная Калифорния. Игра состоит из плоских фигур, каждая из которых состоит из пяти одинаковых квадратов, соединённых между собой сторонами, отсюда и название. Существуют еще версия головоломок Тетрамино, состоящие из четырех квадратов, от этой игры и произошел известный Тетрис.

    Элементы Пентамино

    Игровой набор “Пентамино” состоит из 12 фигурок. Каждая фигура обозначается латинской буквой, форму которой она напоминает. При решении задач и головоломок фигурки можно вертеть и переворачивать, поэтому при изготовлении игры своими руками элементы делайте двухсторонними.

    Популярные головоломки

    Игры и игрушки на основе Пентамино

    Сейчас в интернет магазинах можно найти игры и головоломки, сделанный на основе элементов Пентамино.

    Пентамино своими руками

    Предлагаем сделать элементы игры из плотного картона или пластика и обклеить цветной бумагой или клеящейся пленкой. Внизу представлен вариант изготовления из картона.

    • Рисуем каждый элемент на твердом картоне или пластике. Рисовать лучше, каждый элемент по отдельности, не складывая в прямоугольник - так вырезать будет легче.
    • Вырезаем первую фигуру “U”, перепроверяем размеры. Далее вырезаем все остальные элементы, проверяя чтобы они спокойно входили в элемент “U” своими выпуклыми частями. Подрезаем, если надо лишнее. На фотографии показаны элементы с размером квадратного модуля 2,5 х 2,5 сантиметра.
    • Обводим готовый картонный элемент на сложенной вдвое цветной бумаге и вырезаем сразу две цветные детали. Лучше цветные детали делать чуть меньше, чем картонные, и приклеиваются лучше, и края не будут отклеиваться от частого использования.
    • Находим коробочку для хранения деталей, куда потом будем складывать также схемы и задания к игре. Схемы можно распечатывать на сайте, а можно рисовать и раскрашивать на тетрадном листе в клеточку.

    Работал в Вычислительном центре Академии наук СССР и занимался электронными системами распознавания речи. И в свободное время создал игру, которая свела с ума весь мир и вот уже более 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 фигурок, и на экране было показано, сколько раз каждая фигурка появилась. Чтобы вы знали, что они выпадают равномерно.


    Пентамино - очень популярная логическая игра и головоломка одновременно. Элементы в игре - плоские фигуры, каждая из которых состоит из пяти одинаковых квадратов. Всего существуют 12 элементов пентамино, обозначаемых латинскими буквами, форму которых они напоминают (см. рисунок).

    Как сделать Пентамино

    Можно изготовить пентамино из кубиков, но тогда Вам нужно будет склеить и обклеить цветной пленкой 60 кубиков - трудновато. Предлагаем сделать элементы их плотного картона.

    • Рисуем каждый элемент на твердом картоне, вырезаем, проверяем, чтобы элемент входил в элемент “U”. Подрезаем, если надо лишнее. Мы рисовали детали из квадратиков 2,5х2,5 см.
    • Обводим готовый картонный элемент на сложенной вдвое цветной бумаге и вырезаем сразу две цветные детали. Лучше цветные детали делать меньше, чем картонные, и приклеиваются лучше, и углы поровнее будут.
    • Клеим клеем-карандашом цветную бумагу с двух сторон картонки.
    • Находим коробочку для хранения деталей, куда потом будем складывать также схемы и задания к игре.

    Игры и задачи с Пентамино

    Сложи прямоугольник.

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

    Один из двух способов складывания прямоугольника 3х20

    Честно скажу, пыталась весь вечер сложить - не получилось, поэтому ребенку такую задачу лучше не предлагать.

    Детям лучше тренироваться на маленьких прямоугольниках из нескольких деталей.
    Вот нарисовали варианты складывания прямоугольников из трех деталей.

    Сложи фигуру

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

    Фигура “Утка”, сложенная по образцу.

    Игры с малышами.

    С малышами играть лучше совсем по другому, не стоит им давать сразу сложные задания на логику, пусть играют с пентамино как с пазлами.

    • Моя дочь (3,5 года) складывает их один в другой, ищет подходящий по цвету или форме, а в получившейся собранной фигуре ищет признаки сходства с животным или знакомым предметом. Например, если фигура похожа на слона, то можно пытается сделать хобот подлиннее или увеличить уши, а потом убрать пару элементов и превратить фигуру в мышь или еще кого-нибудь.
    • Покажите ребенку как складывать маленький прямоугольник. Потом разломайте, как будто нечаянно. Можно перед тем как сломать, обратить внимание ребенка на то, где какие детали лежат. Попросите помочь собрать его заново, а то у вас не получается.

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

    Пентамино из Лего

    Кстати, если у Вас дома много стандартных кирпичиков лего, то можно попробовать сделать пентамино их них. Фигурки сложенные из Лего получаться объемные, и можно будет собирать помимо обычных, плоскостных моделей, объемные фигуры.

    Схема сборки достаточно простая: два ряда кирпичиков уложенные друг на друга со смещением.

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

    Используем уже известную нам по программе «Жизнь» консольную графику, основанную на управляющих 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 .

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