"Snake" - история создания и особенности игры (С) 1999, Пелепейченко Александр __________________________________________ Предисловие. Игра Snake задумывалась как игра для двух или более человек, поэтому "самому с собой" играть в нее будет не очень инте- ресно. Да и вообще она вышла довольно-таки сложной для всеобщего понимания. Практика показала что 95% загрузивших игру юзают ее, не используя основной возможности (ин- теллект), а только сидят и смотрят на вза- имное поедание. :) Между тем 5%, хоть и понимают как именно следует обучать змею, практически не юзают сию прогу. Цель этого хелпа - ознакомление с общими принципами работы со змеями. Также здесь вы найдете некоторые советы. 1. Основные понятия. Итак, игра состоит из двух фаз. Первая фаза - это создание боевой змеи, оно будет рассмотрено ниже. Вторая фаза - это само сражение, в котором пользователь играет только роль зрителя и, в какой-то мере, судьи. Битва происходит на клетчатом поле. Каждая "живая" змея состоит из головы, ту- ловища и хвоста. Весь змеиный "интеллект", включая датчики для сканирования окружаю- щей обстановки, находится, разумеется, в голове, а хвост является наиболее уязвимым местом. Наличие головы и хвоста обяза- тельно для каждой змеи, то есть мини- мальная живая змея имеет длину две клетки. В ходе боя возможны всего лишь два ва- рианта движения змеи. Если голова змеи пе- ремещается на пустую клетку, то все тело змеи перемещается вслед за головой, так что первая клетка туловища оказывается там, где раньше была голова, а хвост ока- зывается там, где была последняя клетка туловища. Если же змея производит атаку на про- тивника, то ее голова окажется на той клетке, где был хвост другой змеи, а все тело останется на месте. Таким образом, длина укусившей змеи увеличивается на еди- ницу, а длина укушенной на единицу уменьшается. Змея не может перемещаться на клетку, занятую своим или чужим туловищем, а также за пределы игрового поля. Змея всегда пе- ремещается, если у нее есть такая возмож- ность и остается на месте только тогда, если все пути ее перемещения блокированы. Таким образом, суммарная длина участни- ков боя остается постоянной, а длина Вашей змеи является показателем того, насколько успешно воюет именно она. Задача-максимум для пользователя состоит в том, чтобы его змея полностью "съела" всех противников, задача-минимум - добиться того, чтобы его змея имела максимальную длину. В самой битве одновременно участвует от двух до четырех змей. Сразу замечу, что бой с участием четырех змей гораздо инте- реснее и менее предсказуем, чем с участием пары. Бой заканчивается в одном из случа- ев: - когда одна змея уничтожила всех против- ников; - когда ни одна из змей не имеет хода; - по прерыванию пользователя: СТОП. (в любом случае надо нажать СТОП) Можно продолжить сражение, обновить по- ложения змей, выйдя и зайдя в БОЙ снова. Так как фактор случайности играет су- щественную роль, результат однораундового боя, вообще говоря, не является особо по- казательным, так что стоит проводить не менее десяти раундов, для того чтобы дос- таточно объективно оценить силу противни- ков. Исследование показало, что надежность порядка 90% в определении победителя дает матч, состоящий из 15 раундов. 2. Создание боевой змеи. Создание боевой змеи включает в себя несколько операций: - выбор имени змеи. - выбор пароля змеи. - пользователь заполняет паспорт змеи, указав в нем ту информацию, которую считает нужной (например, информацию о себе). 3. Обучение змеи. Как же программируется поведение змеи? Итак, слушайте... 3.1 Чему змею учить будем? 1. Змея должна "видеть" поле. Она долж- на уметь находить хвост противника, начи- нать его преследование, сближаться и ата- ковать. Итак, змея должна "сканировать" окружающее пространство. Чем больше радиус "сканирования" Вашей змеи, тем интеллекту- альнее ее поведение. 2. Змея должна избегать тупиковых ситу- аций вблизи кромки поля. Пример такой си- туации, когда она не может никуда дви- нуться, приведен на рис. 1. Хвост такой змеи беззащитен для атак соперников. От кромки вообще, по-видимому, стоит дер- жаться подальше, кроме тех случаев, когда там водится добыча. Рис. 1. "Тупик" у стенки. 3. "Умная" змея может избегать ситуа- ции, когда она запутывается в собственных (и не только собственных) кольцах (рис.2) Рис.2 "Тупик" в собственных кольцах. 4. В ситуации "собачьих бегов", когда две змеи безуспешно преследуют друг друга по замкнутому маршруту, "умная" змея должна уметь "срезать" углы и сокращать расстояние (рис. 3) Рис.3 Техника "срезания" углов 5. Змея должна уметь "разрывать" устой- чивые связи. В ситуации, когда две змеи, повинуясь своему "инстинкту" (правильнее сказать - Вашей программе) пожирают друг друга с хвоста, "умная" змея разорвет та- кую связь. Одним словом, программа на "разрыв связи" должна иметь более высокий приоритет, чем "основной инстинкт" (рис. 4) Рис. 4 Патовая ситуация "взаимного поедания". 6. Ваша змея может "уметь" еще очень и очень многое. Так, например, удавалось по- лучать очень неплохие результаты даже и для очень "глупых" змей, которых обучили только одному - правильно оценивать и об- рабатывать дебютную ситуацию. 7. Бои с участием 2-х, 3-х или 4-х бой- цов проходят по-разному. Известны примеры отличных индивидуальных бойцов, которые не способны хорошо работать в групповой схватке и наоборот. Так что "сила" бойца - понятие относительное. Все зависит от то- го, с кем и в каких условиях ему придется сразиться. Поэтому воспитание "универ- сального" бойца - это дело, связанное с чувством баланса и многими компромиссами. 8. Интересно, что во многих случаях си- ла бойцов - понятие нетранзитивное. Так, если змея "Альфа" устойчиво побеждает "Бе- ту", а "Бета", в свою очередь, не дает спуску "Гамме", то это еще совсем не озна- чает, что "Альфа" будет сильнее "Гаммы". Вполне может оказаться, что у последней есть такие индивидуальные черты характера, которые "Альфе" окажутся не по зубам. По- работав несколько дней со своими бойцами, Вы сами это почувствуете и, опять же, вос- питание универсального бойца станет делом скрупулезного исследования и взвешенного баланса различных качеств и свойств. 3.2 Как учат змею. Программирование змеи выполняется очень элегантно, наглядно и доступно. В "голове" у Вашего питомца установлены 9 программи- руемых матриц. Матрица N1 имеет более вы- сокий приоритет, чем матрица N2 и т.д. То есть, если змея исполняет программу, запи- санную в первой матрице, то до остальных она не дойдет. Если же реальная обстановка не соответствует программе, записанной в матрице N1, то может быть использована матрица N2 и т.д. Каждая "матрица" имеет размер 7х7 кле- ток. Вы можете заполнять эти матрицы по своему разумению с целью обеспечить наибо- лее эффективное поведение змеи (что такое "наиболее эффективное поведение" - решайте сами, однозначного ответа тут быть не мо- жет). Основой логики поведения змеи является ее голова. Эта голова должна быть изобра- жена на каждой используемой матрице в единственном экземпляре (кроме того, она должна быть поставлена туда после всех ос- тальных голов, а уже потом все остальные надо убрать). Голова змеи на исходной мат- рице всегда смотрит вверх (на север). Компьютер поочередно просматривает все матрицы, накладывая их таким образом, что- бы голова змеи совпадала с ее текущим по- ложением. Если окружающая обстановка сов- пала с тем, что занесено в матрицу, то змея перемещается в указанном направлении. Если совпадения не произошло или такой ход невозможен, то в случайном порядке переби- раются все повороты и отражения этой кар- ты. Если совпадения не произошло ни в од- ном варианте, то происходит переход к сле- дующей карте. Если же ни одна карта не да- ла совпадения, то направление следующего хода выбирается случайным образом. Незанятая клетка матрицы в виде сеточки означает, что данный квадратик не принима- ется во внимание. Элемент в столбце меню "НЕ" означает, что элемент изображения считается совпав- шим, если он любой, кроме указанного в со- ответствующем квадратике. При каких обстоятельствах его полезно применять - решать пользователю. Элемент "ИЛИ" - совпадение фиксируется, если совпал хотя бы один из подкрашеных этим цветом. Пользователю не следует также забывать о том, что все другие змеи абсолютно рав- ноправны. Поэтому, в частности, может произойти, что змея пользователя погонится за "далеким хвостом", игнорируя хвост дру- гой змеи, расположенный гораздо ближе. Кроме того, если пользователь будет ориен- тироваться в какой-то матрице на относи- тельное расположение хвоста и туловища змеи врага, то не исключен вариант, что будет зафиксировано совпадение при том, что хвост будет принадлежать одной змее, а фрагмент туловища - другой. 4. Некоторые стандартные положения. Запутавшаяся и заблокировавшая сама се- бя змея. Если такая ситуация возникнет в ходе игры, то любой противник сможет с комфортом "съесть" значительную часть та- кой змеи, прежде чем она освободится. Хо- рошая змея должна стараться избегать по- добных ситуаций. "Массовый" клубок змей. Окончание раун- да сражения подобным образом - не редкость в этой игре. Три змеи сидят друг у друга на хвосте. В результате каждого такта сражения каждая из них как приобретает, так и теряет одну единицу длины и длина каждой змеи остается неизменной. Подобная ситуация часто возни- кает и с двумя змеями. Читатель может по- думать о том, стоит ли и каким именно об- разом пытаться разорвать такой цикл. Я придумал два возможных механизма подобного разрыва, но они пока несовершенны и чаще ухудшают, а не улучшают ситуацию. Две змеи, причем одна из них устойчиво преследует другую, а преследуемая при этом не имеет никакого представления о местона- хождении преследователя и полагается только на бегство. Читатель может подумать о том, как, во-первых, добиться того, что- бы его змея не попадала на роль преследуе- мого, а, во-вторых, что надо сделать, что- бы подобное преследование могло оказаться успешным (змеи ведь движутся с одинаковой скоростью!). 5. Немного об аналогах. Вообще прообразом Snake явилась PC-de- mo. В хелпе к ней имелось следующее: Идея сделать программу, которая позво- лит пользователю не только получить удо- вольствие от игры, но и самому приложить свои способности, творчество и вдохнове- ние, отнюдь не нова, но в таком виде, как "Змеиный Бой" проявляется впервые. У давних и опытных любителей компьютер- ных игр при взгляде на эту программу сразу рождаются какие-то ассоциации с древней культурой под названием "CoreWar" ("Бой в Памяти"). Для тех, кто подключился к компьютерным играм в последнее десятиле- тие, наверное надо напомнить об этом явле- нии, поскольку о нем давно уже никто не вспоминал. А "CoreWar" была не просто программой, это была поистине культура и явление. И развивалась эта культура наиболее активно в начале 80-х. Суть состояла в том, что каждый программист сам писал себе не- большую программу в машинном коде, после чего две программы разных авторов запуска- ли в память машины. Куда, в какие адреса пошли эти программы, никому неизвестно. Суть игры сводилась к тому, что эти программы должны были "обстреливать" большие пространства памяти машины с целью "зацепить" и уничтожить программу-соперни- ка. Когда жертва не подавала операционной системе сигналов "Я жива", бой заканчивал- ся. Но "обстреливать" память наугад - не единственное, чем занимались бойцы. Лучшие образцы умели "размножаться", "залечивать" поврежденные участки, "маскироваться", "сканировать" память и пр. "CoreWar" получила широчайшее распрост- ранение на Западе. Проводились чемпионаты, турниры. Организовывались клубы, а эти клубы выпускали регулярные бюллетени, то есть, появились как бы средства массовой информации по этой культуре. Многочисленные журналы имели постоянные разделы, в которых организовывались сорев- нования, рассказывалось о новых открытиях и достижениях. Конечно, участие в подобных мероприяти- ях было доступно только для программистов, причем высокой квалификации. Кроме турни- ров для определения лучшей программы, про- водились многочисленные конкурсы на самую короткую, самую оригинальную программу. Это движение много дало развитию програм- мирования как искусства и созданию новых технологий. При всей своей массовости движение "Co- reWar" не могло захватить круги обычных пользователей, но зато дало неожиданный побочный эффект. Невооруженным взглядом видно, что те же свойства, которыми должен обладать хороший "боец в памяти", нужны и зловредному вирусу. Так, из культуры "Co- reWar" произросли самые выдающиеся вирусо- воды и вирусоведы. Мы не знаем почему, может быть именно из-за того, что самые психически ущербные программисты стали проявлять порочную страсть к написанию (и распространению) вирусов, это движение стало затухать где-то к 1984 году, и сейчас о нем редко вспоминают. Конечно полной аналогии между "Боем в памяти" и "Змеиным Боем" нет и быть не мо- жет. Но я думаю, что сама идея довольно хороша для создания нового направления в написании игровых программ. __________________________________________