Самая популярная мобильная игра: как создавалась «Змейка» для телефонов Nokia

Автор оригинала: Quinn Myers
  • Перевод
Танели Арманто не любит рассказывать людям, что изменил мир. На самом деле я уверен, что если вы не являетесь другом его семьи, то ничего о нём не слышали. Обычно он никогда не рассказывает о своём величайшем достижении, но его дети не упускают случая им похвастаться.

В конце концов, их папа создал Snake.

В 1995 году разработчик ПО из Финляндии по фамилии Арманто устроился на работу в быстрорастущую компанию Nokia. Он имел опыт создания игр, поэтому ему поручили разработать «несколько крутых игр» для будущего мобильного телефона Nokia 6110. Он воспринимал свои игрушки как ещё один способ использования устройства, не сильно отличающимся от создаваемых коллегами календаря и калькулятора.

Сегодня, спустя почти 25 лет, его творение под названием Snake — игра, в которой постепенно удлиняющаяся змея собирает пищу, пытаясь при этом не укусить саму себя — рассматривается как поворотный момент в истории технологий и развлечений. Snake считается первой крупной мобильной игрой, зародившей индустрию, которая сегодня имеет потенциал в 100 миллиардов долларов.

Арманто сдержан и скромен, когда рассказывает о своей карьере. «Очень многие приходят в восторг, когда узнают, что это я написал Snake», — говорит он. «И я думаю, это вполне нормально. Здорово знать, что людям нравилась эта игра».


Телефон, который всё изменил


Мы начнём историю с 1995 года, когда в Nokia прошло всего три года после глобальной модернизации компании. Её новая миссия: целиком сосредоточиться на мобильных технологиях. Хотя мобильные телефоны пока не достигли всемирного признания, они быстро становились меньше, дешевле и проще в использовании. После выпуска в 1993 году Nokia 2110 компания начала работу над Nokia 6110, который должен был дебютировать в декабре 1997 года.

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


Nokia 6110 в синем корпусе.

Арманто: в 1995 году Nokia быстро росла. Все мы были в компании новичками. Это было потрясающе! Мы разрабатывали новые функции для телефонов и должны были носить с собой новейшие устройства, потому что им, разумеется, требовалось тестирование.

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

Я решил, что отлично подойдёт Tetris, даже реализовал и протестировал его. Но в результате от него пришлось отказаться. Tetris Company хотела получать долю от каждого проданного устройства, а Nokia не хотела привязывать никакие платежи к точному количеству проданных продуктов.

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

Ранняя история Snake


Игра Snake существовала и до 1995 года. Впервые она появилась в 1976 году на аркадном автомате Blockade, породившем несколько клонов. Как бы они ни назывались: Nibbler, Worm или Rattler Race, основная концепция оставалась одинаковой.


Арманто: кто-то может думать, что Nokia стала первым производителем, на телефонах которого были игры, но это не так. Просто более ранние устройства не продавались такими тиражами, как 6110.

Раньше я играл в игру наподобие Snake на своём Apple Macintosh. Она была для двух игроков, каждый из которых при помощи клавиатуры управлял собственной змеёй.

Кайл Макнейл, Vice, "Признание в любви к Snake, лучшей мобильной игре”: Snake в её простейшей, самой чистой форме видеоигры, увлекательна, её игровой процесс похож на Pong или Space Invaders. Цепочка пикселей, приятная физика и чувство постепенного увеличения сложности игры".

Арманто: проведя тесты и планирование, мы поняли, что эти змеи будут идеальным решением. Они достаточно просты, чтобы уместиться в ограничения телефона. Не было никакого смысла использовать сложные решения, если всех вполне устроит простое. Мы попытались разыскать информацию, чтобы найти «владельца» Snake-подобных игр, как мы нашли владельца Tetris, но нам не удалось. Поэтому мы стали двигаться дальше.


Создание игры


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

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

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

Nokia начала продавать 6110 в начале 1998 года и с самого начала Snake находилась в стандартной комплектации телефона.

Макнейл: сегодня встроенная в сотовый телефон игра воспринимается как некий возврат к простоте. Нет необходимости ничего скачивать, никаких внутриигровых покупок, нет обновлений и траты мобильного трафика. Достаточно взять в руки Nokia и начать играть.

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


«Я никогда не думал, что она станет так популярна»


Возможно, всё дело было в массовом распространении телефона, простоте игры или сочетании этих двух факторов, но Snake превратилась в феномен. Люди впервые начали очень долго смотреть на экраны своих телефонов.

Ханну Корхонен, статья «Evaluating Playability of Mobile Games with the Expert Review Method», опубликованная Association for Computing Machinery: Эпоха игр на мобильных телефонах началась в 1997 году, когда Nokia выпустила на телефоне Nokia 6110 первую мобильную игру под названием Snake. Вероятно, это самая часто играемая мобильная игра, потому что она доступна на более чем 350 миллионах мобильных телефонов по всему миру.

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

Макнейл: это идеальная мобильная игра, потому что в неё играли все, и особенно люди, в жизни не игравшие больше ни в одну игру. Она встроилась в сознание общества так же, как встроена в Nokia 6110.

Арманто: в неофициальных беседах мне говорили, насколько важной была моя игра. Но у её популярности были и другие причины: интерфейс пользователя, намного улучшенный срок жизни от батареи, снижение цен, и так далее. Однако Nokia так никогда и не сообщила, в какой степени моя игра помогла продажам телефона.

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


Из пресс-релиза Nokia 2005 года, посвящённого Nokia N-Gage: мистер Танели Арманто, создатель самой популярной в мире мобильной игры Snake получил особый знак признания от Mobile Entertainment Forum (MEF) за ключевую роль в создании Snake для серии телефонов Nokia 6100. Форум MEF сообщил, что гениальность и видение мистера Арманто внесли значительный вклад в рост индустрии мобильных развлечений. Вчера мистер Арманто получил награду на ежегодном мероприятии MEF в Лондоне.

Арманто проработал в Nokia почти 16 лет, потом ушёл на вольные хлеба, а позже вернулся к учёбе. Сегодня он работает архитектором систем в Ineo Oy.

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

Подробнее
Реклама

Комментарии 49

    +2

    у нокии есть змейка покруче, в 3d, интересно есть ли она под андроид?
    https://m.youtube.com/watch?v=iUVPmWPzfqk

      0
      да, это супер штука в свое время была) Я обычно не люблю «ремейки», но тут реально хорошая игрушка получилась.
      +5

      Интересно, но хотелось бы больше технических деталей, конечно.

        +4
        Макнейл: это идеальная мобильная игра, потому что в неё играли все, и особенно люди, в жизни не игравшие больше ни в одну игру.

        Это была идеальная мобильная игра, потому что она не подталкивала вас к совершению внутриигровых покупок, оплате премиум аккаунта и т.п. Все мобильные игры того времени были идеальными, ведь они были созданы для удовольствия игрока.
          +11
          Моя история про Змейку.
          В 91м году один из компьютерных журналов напечатал листинг Nibbles на QBasic. На то время у меня был ЕС1840 с GW-Basic на дискете с MS DOS, катастрофическая нехватка игр и неуемный оптимизм 8-летнего ребенка. Несколько дней я кропотливо перебивал код из журнала и исправлял опечатки, чтобы в итоге узнать, что инструкции QBasic и GW-Basic не полностью совместимы и код в принципе не запустится — обязательно нужны номера строк, отличаются некоторые операторы, а команда PLAY почему-то не издает звук и ее пришлось комментировать. Так я сделал первый в своей жизни порт. И понеслось :)
            0
            Так всё-таки запустил?
              +3
              Конечно! :) Играть же надо было во что-то
            +12
            То есть человек просто реализовал давно известную игру на новой платформе, по сути украл идею, а его превозносят как создателя? Забавно.
              +8
              Присоединяюсь.
              В змейку я еще на СМ-4 играл. В 1985 году.
                0
                на СМ-4 играл

                АААА… это зеленое свечение дисплеев в ВЦ ЛГУ имени Петера Стучки… Змейку не помню, но помню «Танчики»! По «сети»! В тот же примерно год!
                +8
                Ну сам он, вроде как, не считает им совершённое подвигом. А люди любят раздувать из мухи слона…
                  0

                  Написано действительно чудно.


                  Но он не был бы таким быстрым, если бы вызывал сбои в телефоне, происходящие из-за утечек памяти. Поэтому я реализовал его так, чтобы утечек памяти не было.

                  Интересно, он был первый в подобных подвигах, что аж без ликов реализовать столь сложный проект?

                    0
                    Думаю нет. Я думаю что это сложности перевода с финского на английский. Имелось в виду, что «я хотел сделать её настолько быстрой, насколько возможно… можно было бы сделать её ещё быстрее, если бы я допустил утечки памяти… но я этого не хотел и сделал её без утечек».

                    Невыясненным остался один вопрос: как, чёрт побери, он собирался сделать «Змейку» быстрее, допустив утечки памяти?

                    Вот это меня как бы больше волнует — я себе этого даже представить не могу…
                +13

                "как создавалась «Змейка» для телефонов Nokia":
                -Хотели сначала тетрис, но оказалось, что у тетриса был владелец, поэтому решили делать змейку.
                -Это феномен.
                -Моя самая любимая игра.
                -А ещё я добавил задержки и не стал добавлять утечки памяти.
                -Сначала я нарисовал круг, и вот уже получилась сова, т.е. змейка!

                  0
                  «Эрикссону», кстати, наличие владельца у тетриса как-то не помешало.
                  +6
                  Арманто сдержан и скромен, когда рассказывает о своей карьере. «Очень многие приходят в восторг, когда узнают, что это я написал Snake», — говорит он

                  … поэтому я скромно умалчиваю, что я её не писал, а просто перенёс на новую платформу, — думает про себя Арманто при этом, но вслух не говорит.
                    +3
                    Про перенос можно было бы говорить, если бы он где-то взял код и монтировала его.

                    Но змейка, как бы, настолько простая вещь, что её проще написать, чем портировать… Особенно если писать нужно на ассемблере под нестандартную платформу…
                      +1
                      Прошивка 6110 однозначно писалась на С, в ней видно следование соглашениям о вызове, стековые переменные итд. Там уже относительно приличное железо было — 32-битный процессор (ARM7TDMI) для UI и верхнего уровня GSM протокола, DSP (что-то из ранних TMS320) для нижних, flash память как бы не 512К.
                    +2
                    Когда о мобильных телефонах мы и не мечтали.
                    image
                      +2
                      Питон на 8-битном процессоре!
                        0
                        Но не Micropython
                      +5
                      Поэтому я реализовал его так, чтобы утечек памяти не было.

                      То ли баг перевода, то ли человек и правда гордится тем, что реализовал код так, как и надо писать программы — без утечек памяти!

                      А в змейке всегда поражало, что у нее этакая красивая графическая заставка, и совершенно неграфический, аскетичный геймплей. Прямо стоило подогнать стили заставки и игры — впрочем, кого это из программистов волновало?
                        +1
                        А в змейке всегда поражало, что у нее этакая красивая графическая заставка, и совершенно неграфический, аскетичный геймплей. Прямо стоило подогнать стили заставки и игры

                        Как вы себе эту подгонку представляете?
                        Разрешение экрана у 6110 всего 84x48, для украшательств банально нет пикселей.

                          –1

                          Не рисовать красоты (заставку) там, где их в игре не будет.

                            +1
                            Создатели демосцен так не думают.
                              +1

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


                              Следуя вашей логике, нужно убрать с обёртки шоколадных конфет «Мишка косолапый» репродукцию, ведь внутри нет никаких мишек в сосновом бору.


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


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


                              Вряд ли это можно счесть здравым предложением.

                          +1
                          Никогда не любил эту игру!
                            +2

                            Бунтарь!

                              0
                              Тоже всегда был равнодушен к ней, пока случайно не попробовал режим на двоих, и вот это уже совсем другое дело. Попробуйте, от напряжения можно вспотеть.
                              +4
                              Этой игре более 50 лет, и популярна она именно на Motorolla. Ни о чем статья.
                                +2

                                Играл в эту змейку на тетрисе на батарейках еще когда телефоны были с проводами!

                                  +1
                                  Помню когда-то в журнале «Радио» публиковался код для этой игры для компьютера Радио 86РК. Так вот, Радио 86РК у меня не было, а был ZX Spectrum. Осложнилось дело тем, что у Радио 86РК экран текстовый, а спектрума — графический (да ещё и по нынешним меркам очень нестандартный). Вышел из положения тем, что вместо вывода символа — менял атрибуты знакоместа, так что вместо цепочки букв «О» у меня ползала просто белая полоса. Тогда я был ещё школьником, поэтому восторг от того, что игру удалось самому ввести с клавиатуры был огромным. Что там ваши нокии…
                                    +1
                                    Было дело, игрался змейкой на Радио-86рк. Работала быстро, тк была на ассемблере. Я туда еще немного своего функционала добавил и звуковое сопровождение на таймере (по моему таймер был ви53, на 3 канала, в стандартном комплекте его не было, зато был хрипящий динамик подключенный к выходу разрешения прерываний).
                                    Ну а Nokia черно белая у меня до сих пор как второй телефон идет, причем по сравнению с iPhone ловит мобильную связь лучше в зоне с плохим покрытием, и батарейка 10 дней держит.
                                      0
                                      Было дело, игрался змейкой на Радио-86рк
                                      Почти уверен, что их там было много. Слишком простая и примитивная (хотя и затягивающая) игра, а авторскими правами тогда никто не заморачивался.
                                        0

                                        Да, возможно были другие, но это была «та самая» которая была опубликована в журнале Радио с подробным объяснением как этот код работает. Собственно это и была моя точка входа в программирование.

                                      0
                                      Кому интересно, вот залипательная змейка littlebigsnake.com
                                        +1
                                        Тем временем где-то на планете грустит один создатель Змейки :(
                                        Или давно умер уже.

                                        Недавно была статья История алгоритмов рандомизации «Тетриса», вот бы и про рандомизацию в Змейке почитать.

                                        Кто-нибудь релизовывал Змейку сам? Там используется массив из координат каждого пикселя змейки или у вас другое решение? И чему соответствует размер массива? Размеру количества пикселей экрана?
                                        Просто подумал, что можно хранить не координаты, а длину отрезка и поворот — одной цифрой со знаком. Допустим, -7 — это поворот против часовой и до этого поворота позади остаётся отрезок в семь пикселей. По памяти выигрыш должен быть в два раза, зато значительно возрастут вычисления?
                                          0
                                          Есть множество способов сделать змейку. Массив — это в примерах для начинающих программистов на Бейсике из 70-х. А по нормальному — не надо никаких массивов, длин и вычислений. Достаточно хранить только координаты и вектор головы и хвоста. Т.е. мы знаем, в какую сторону движется голова — куда в экране ставить новый элемент, и откуда движется хвост — где стирать лишний элемент. Для удлинения на элемент достаточно один раз пропустить стирание элемента, тогда голова передвинется, а хвост нет, и змейка станет длиннее.
                                            +1
                                            А откуда хвосту знать где поворачивать?
                                            И вместо внутреннего массива используется массив пикселей экрана, значит? Ещё, чтобы реализовать неоднородный фон, понадобится рисовать змейку на отдельном слое.
                                              0
                                              Почти все реализации змейки работают на регулярной сетке. Это могут быть непосредственно знакоместа текстового экрана, или буфер в памяти, но в общем да — в любом случае всегда уже есть некий массив флагов, показывающих, занята ли клетка игрового поля элементом змейки (также камнем, морковкой, стеной). И этого достаточно, чтобы описать все возможные положения и перемещения змейки. В классических реализациях ещё добавляют растущий массив элементов в памяти, и вот как раз он реально не нужен. Скорее всего причина его появления в том, что эти (старые) программы были призваны как раз продемонстрировать использование массивов, а цели эффективно реализовать игру в них не стояло.

                                              Про вектор хвоста я подзабыл, да, важный момент в том, что он хранится прямо в сетке. Это похоже на волновой алгоритм — пишем вектор головы в сетку, и, зная начальную позицию, читая значения из сетки, можем восстановить весь путь, пройденный головой, т.е. всю длину змейки. Если тело змейки не анимировано, достаточно перерисовывать только голову и хвост.
                                                0
                                                В классических реализациях ещё добавляют растущий массив элементов в памяти, и вот как раз он реально не нужен.
                                                А где эта «классическая реализация» существует??? Змейка — была одной из первых программ, которые я реализовал в школе (Turbo Pascal, вот это вот всё, SegB000/SegB800, вот это вот всё), и никогда не задумывался над тем, что это может быть реализовано иначе чем для каждого знакоместа хранить направление…

                                                Интересно всё же увидеть — что я пропустил…
                                                  0
                                                  Я имею в виду реализации из книжек по программированию на Бейсике, которые появились у нас в конце 80-х. В них были подобные варианты с массивом.
                                                    0
                                                    Круто. Конечно BASIC способствует кривому коду, но всё-таки предел какой-то должен быть…
                                                  0
                                                  Для Трона очень подходит, ведь по сути Трон — Змейка без хвоста.
                                                  А насчёт своей идеи выигрыша по памяти в два раза я поторопился — он ещё больше, т.к. поворотов бывает меньше даже чем самый длинный отрезок Змейки.
                                                    0
                                                    А насчёт своей идеи выигрыша по памяти в два раза я поторопился — он ещё больше, т.к. поворотов бывает меньше даже чем самый длинный отрезок Змейки.
                                                    Вы считаете максимальный возможный выигрыш? А зачем? Чтобы игра упала, если кто-то будет играть «неправильно»? Понятно же, что если кто-то устроит из Питона кривую Гильберта, то вам потребуется больше памяти, чем с тривиальным решением…
                                                      0
                                                      Допустим, у нас экран 2 на 2, массив на 4 элемента. Если заполнить его Змейкой, то это три отрезка и три элемента — разве не так?
                                                        +1
                                                        Так. На таком только поле ваша оптимизация может иметь смысл. Так как длина отрезка всегда один и её можно не хранить.

                                                        Но «Змейка» на поле 2x2 — это какая-то ну исключительно грустная «Змейка»…

                                                        А если поле будет хоть чуть-чуть больше, скажем 3x3, то вам уже потребуется на каждый отрезок три бита: один на длину, два на направление.

                                                        Отрезков на поле 3x3 может быть до шести — это уже 18 бит.

                                                        А «наивная реализация» — это чётко два бита на каждый элемент, только направление и всё. То есть те 18 бит, только манипулировать проще.

                                                        Начиная же с размера 4x4 там уже получается 12 отрезков по 4 бита (2 на направление, 2 на длину), итого 48.

                                                        А с наивной реализацией — 32 бита.

                                                        Ну и так далее — чем больше будет поле, тем больше вы будете проигрывать в наихудшем случае…
                                                          0
                                                          Хранить в битах — об этом речи в теме не шло же, тут уже совсем всё по другому :)
                                                          Выходит тогда, что мой способ больше подходит цветным Змейкам с неоднородным фоном.
                                                            0
                                                            У разных людей — разные умолчания. Нам нужно хранить «дофига» направлений — по одному на каждую точку поля. Чтобы хвост стирать.Как ещё их хранить, если не как по паре бит на точку? Мне всегда казалось это самым разумным, как-то никогда даже не задумывался о том, чтобы по другому хранить. Я змейку в школе писал, тогда я ни про какие «Big O» не знал… структура данных была смешная (Turbo Pascal, поле 80x25):
                                                            var
                                                              GoTop : array[1..25] of set of 1..80;
                                                              GoLeft : array[1..25] of set of 1..80;


                                                            Сейчас, когда вы заговорили об экономии при использовании явно не слишком эффективного метода (ну то есть он сходу кажется неэффективным: данные неоднородны, манипуляции сложные) — пошёл, посмотрел на кривую Гильберта, посчитал… Всё равно тот вариант, что у меня — проще и быстрее… хотя сегодня я, наверное, сделал бы по другому (уж как минимум использовал числа от 0 до 79, а не от 1 до 80)… но идея та же, всё равно.

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

                                          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                          Самое читаемое