(С) Георгий Евсеев, Сергей Симонович, 1994 Почта: 121019, Москва, Г-19, а/я 16, "Инфорком-Пресс". Тел./факс (095) 956-16-31 E-Mail: postmaster@ircpress.msk.su ЗМЕИНЫЙ БОЙ (Snake Battle) GAMOS, 1992 Большинство пользователей уже привыкло к тому, что основным противником в компьютерной игре является сам компьютер, с его мгновенной реакцией и высоким быстродействием. Иногда психологически личность противника мысленно переносится на создателей программы (в играх типа Adventure). Те же игры, которые рассчитаны на несколько участников (игры для модема, сетевые игры), требуют специальной организации, так как надо собрать несколько человек в одно время. Может показаться, что описанные выше условия являются неизбежным злом, однако это не так, что и доказывает новая неожиданная и оригинальная игра. Каждый пользователь сам создает своего "бойца", который после этого способен жить собственной жизнью. Этот "боец" - это просто отгруженный файл. Любой пользователь, получивший от кого-то такой файл, способен провести на своем компьютере заочное "сражение". 1. Основные понятия. Итак, игра состоит из двух фаз. Первая фаза - это создание боевой змеи, оно будет рассмотрено ниже. Вторая фаза - это само сражение, в котором пользователь играет только роль зрителя и, в какой-то мере, судьи. Битва происходит на клетчатом поле. Каждая "живая" змея состоит из головы, туловища и хвоста. Весь змеиный "интеллект", включая датчики для сканирования окружающей обстановки, находится, разумеется, в голове, а хвост является наиболее уязвимым местом. Наличие головы и хвоста обязательно для каждой змеи, то есть минимальная живая змея имеет длину две клетки. В ходе боя возможны всего лишь два варианта движения змеи. Если голова змеи перемещается на пустую клетку, то все тело змеи перемещается вслед за головой, так что первая клетка туловища оказывается там, где раньше была голова, а хвост оказывается там, где была последняя клетка туловища. Если же змея производит атаку на противника, то ее голова окажется на той клетке, где был хвост другой змеи, а все тело останется на месте. Таким образом, длина укусившей змеи увеличивается на единицу, а длина укушенной - на единицу уменьшается. Змея не может перемещаться на клетку, занятую своим или чужим туловищем, а также за пределы игрового поля. Замечу, что ход на клетку, ранее занятую своим хвостом, возможен, то есть вся змея перемещается одновременно, а не по одной клеточке. Змея всегда перемещается, если у нее есть такая возможность и остается на месте только, если все пути ее перемещения блокированы. Таким образом, суммарная длина участников боя остается постоянной, а длина Вашей змеи является показателем того, насколько успешно воюет именно она. Задача-максимум для пользователя состоит в том, чтобы его змея полностью "съела" всех противников, задача-минимум - добиться того, чтобы его змея имела максимальную длину. В самой битве одновременно участвует от двух до четырех змей. Сразу замечу, что бой с участием четырех змей гораздо интереснее и менее предсказуем, чем с участием пары. Бой заканчивается в одном из четырех случаев: - когда одна змея уничтожила всех противников; - когда ни одна из змей не имеет хода; - когда истекло время боя; - по прерыванию пользователя: "конец боя". Если раунд боя закончился естественным путем (то есть не по последней причине), то, можно снова выбрать опцию "начать бой" и продолжить сражение с участием тех же противников и с сохранением уже набранных очков. Так как фактор случайности играет существенную роль, результат однораундового боя, вообще говоря, не является особо показательным, так что стоит проводить не менее десяти раундов, для того чтобы достаточно объективно оценить силу противников. Наше исследование показало, что надежность порядка 90% в определении победителя дает матч, состоящий из 15 раундов. 2. Создание боевой змеи. Создание боевой змеи включает в себя несколько операций: - выбор имени змеи, которое будет фигурировать в качестве имени дискового файла; - выбор окраски змеи для фазы сражения. Впрочем, если случайно окажется, что две змеи разных авторов будут иметь одну и ту же окраску, то компьютер автоматически перекрасит одну из них в другой цвет, так что путаницы не возникает. - пользователь заполняет паспорт змеи, указав в нем ту информацию, которую считает нужной (например, информацию о себе). - и, наконец, пользователь задает пароль, препятствующий другим пользователям не только изменять, но и просто просматривать его собственную змею, тем самым сохраняя в неприкосновенности его собственные находки. Обратите внимание на то, что ~каждая змея является~ ~интеллектуальной собственностью ее создателя. В этом смысле она~ ~является объектом защиты законом об авторском праве. Поэтому не~ ~следует пренебрегать такой формальной и совсем нетрудоемкой~ ~операцией, как заполнение паспорта змеи~. 3. Обучение змеи. "Все животные равны, но некоторые из них равнее", - сказал когда-то Дж.Оруэлл в своем памфлете "Скотский Хутор". Точно так же и с нашими змеями. От рождения они все равны. У каждой из них по десять клеток и каждая не умеет делать ничего, кроме как двигаться в случайном направлении и кусать противников за хвост, если он сам в рот просится. Для того, чтобы Ваша змея вела себя с умом, ее над обучить. Интересно, что обучение змея производится путем программирования логики ее поведения в самых разнообразных боевых ситуациях. Если Вы не умеете программировать, то эта игра для Вас - просто идеал. Дело в том, что "программирование" выполняется таким доступным, понятным и наглядным способом, что через десять минут после начала игры даже семилетний ребенок сможет с гордостью сказать: "Я умею программировать". И совсем приятно, что тут же можно НАГЛЯДНО увидеть, как ведет себя Ваша программа и сравнить ее с программами других авторов. Как же программируется поведение змеи? Нам, конечно, не хочется рассказывать здесь все то, что и так изложено в help-инструкции к игре, но в двух словах мы все же остановимся на этом вопросе. 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 клеток. Вы можете заполнять эти микросхемы по своему разумению с целью обеспечить наиболее эффективное поведение змеи (что такое "наиболее эффективное поведение" - решайте сами, однозначного ответа тут быть не может). Ваши возможности по программированию поведения змеи зависят и от выбранного Вами уровня сложности. Их три: НОВИЧОК ЛЮБИТЕЛЬ ЭКСПЕРТ Каждый последующий режим дает пользователю более широкие возможности для программирования, что, впрочем, позволяет проводить независимые "соревнования" для разных режимов сложности. Основой логики поведения змеи является ее голова. Эта голова должна быть изображена на каждой используемой матрице в единственном экземпляре. В режимах НОВИЧОК или ЛЮБИТЕЛЬ она всегда находится в центре матрицы, а в режиме ЭКСПЕРТ Вы можете выбрать ее положение произвольно. Таким образом, в режимах НОВИЧОК и ЛЮБИТЕЛЬ Ваша змея "видит" пространство на 3 клетки от головы в любую сторону. В режиме же ЭКСПЕРТ ее радиус "сканирования" больше - до 6 клеток. Голова змеи на исходной матрице всегда смотрит вверх (на север). Компьютер поочередно просматривает все микросхемы, накладывая их таким образом, чтобы голова змеи совпадала с ее текущим положением. Если окружающая обстановка совпала с тем, что занесено в матрицу, то змея перемещается в указанном направлении. Если совпадения не произошло или такой ход невозможен, то в случайном порядке перебираются все повороты и отражения этой карты. Если совпадения не произошло ни в одном варианте, то происходит переход к следующей карте. Если же ни одна карта не дала совпадения, то направление следующего хода выбирается случайным образом. На иллюстрации изображена змея в режиме редактирования. Правая сторона представляет собой набор вариантов, доступных пользователю в режиме ЭКСПЕРТ. В меню вначале идут элементы, которые могут встретиться на игровом поле. Символ "БАРЬЕР" означает клетки, находящиеся за его пределами, то есть пользователь может создать змею, прижимающуюся к границе, или же наоборот, отталкивающуюся от нее. Незанятая клетка микросхемы в виде выступающего голубого бруска означает, что данный квадратик не принимается во внимание. Пример на первой матрице означает: "Если есть возможность укусить врага - делай это". Следующий элемент в столбце меню - "КРОМЕ" - недоступен в режиме НОВИЧОК. Он означает, что элемент изображения считается совпавшим, если он любой, кроме указанного в соответствующем квадратике. При каких обстоятельствах его полезно применять - решать пользователю. Затем следует "ИЛИ-цвет", также недоступный в режиме НОВИЧОК. Для элементов, раскрашенных в один и тот же "ИЛИ-цвет", совпадение фиксируется, если совпал хотя бы один из них. Например, микросхема номер 2 заставляет змею по возможности избегать краев игрового поля, а микросхема номер 3 - двигаться в направлении хвоста змеи-врага. Пользователь имеет в своем распоряжении два таких ИЛИ-цвета (зеленый и синий). Одновременное их использование может означать, что требуется, чтобы совпали хотя бы по одному элементу из каждой группы. Не следует забывать, о том, что повороты и отражения дают одну и ту же схему, в частности, схемы номер 4 и 5 абсолютно эквивалентны, хотя не исключено, что какая-то разница может возникнуть за счет учета случайного перебора вариантов расположения квадрата. Пользователю не следует также забывать о том, что все другие змеи абсолютно равноправны. Поэтому, в частности, использование схемы 3 может привести к тому, что змея пользователя погонится за "далеким хвостом", игнорируя хвост другой змеи, расположенный гораздо ближе. Кроме того, если пользователь будет ориентироваться в какой-то микросхеме на относительное расположение хвоста и туловища змеи врага (как, например, на схеме 6), то не исключен вариант, что будет зафиксировано совпадение при том, что хвост будет принадлежать одной змее, а фрагмент туловища - другой. Следующий пункт меню - "И-цвет" доступен только в режиме ЭКСПЕРТ. Его использование требует, чтобы одновременно совпали все элементы из одноцветной группы. Исходный серый фон для элементов является, по сути дела, также "И-цветом", здесь же добавляются еще два "И-цвета" - красный и черный. Подкраска цветом (И или ИЛИ) клетки с головой своей змеи дает общее указание на то, как именно должны соединяться различные цветовые группы. Наличие пяти различных "логических цветов" позволяет задавать сложные условия поведения змеи. Кроме того, возможна, так сказать, "экономия микросхем" за счет использования двух комбинаций, которые могут быть изображены одновременно, и соединения их "ИЛИ-цветом" (как на схеме 6). Правда, здесь также надо быть готовым к тому, что может сработать не та группа, которая в данный момент была бы нужнее. Последняя действующая клавиша позволяет удалять или вставлять новые квадраты в заданное место. К сожалению, не предусмотрена возможность поменять две схемы местами, так что в таком случае одну из них придется задавать заново. 4. Некоторые стандартные положения. В заключение, на следующей иллюстрации приведены некоторые варианты ситуаций, которые часто встречаются в ходе игры. Здесь они для экономии места "склеены" на один экран. В верхнем левом углу изображена запутавшаяся и заблокировавшая сама себя змея. Если такая ситуация возникнет в ходе игры, то любой противник сможет с комфортом "съесть" значительную часть такой змеи, прежде чем она освободится. Хорошая змея должна стараться избегать подобных ситуаций. Слева в середине изображен "массовый" клубок змей. Окончание раунда сражения подобным образом - не редкость в этой игре. Ситуация в левом нижнем углу встречается очень часто. В данном случае три змеи сидят друг у друга на хвосте, так что в результате каждого такта сражения каждая из них как приобретает, так и теряет одну единицу длины и длина каждой змеи остается неизменной. Подобная ситуация часто возникает и с двумя змеями. Читатель может подумать о том, стоит ли и каким именно образом пытаться разорвать такой цикл. Мы придумали два возможных механизма подобного разрыва, но они пока несовершенны и чаще ухудшают, а не улучшают ситуацию. И, наконец, в правой части картинки изображены две змеи, причем одна из них устойчиво преследует другую, а преследуемая при этом не имеет никакого представления о местонахождении преследователя и полагается только на бегство. Читатель может подумать о том, как, во-первых, добиться того, чтобы его змея не попадала на роль преследуемого, а, во-вторых, что надо сделать, чтобы подобное преследование могло оказаться успешным (змеи ведь движутся с одинаковой скоростью!). 5. Немного об аналогах. Идея сделать программу, которая позволит пользователю не только получить удовольствие от игры, но и самому приложить свои способности, творчество и вдохновение, отнюдь не нова, но в таком совершенном и законченном виде, как ~Змеиный Бой~ проявляется впервые. У давних и опытных любителей компьютерных игр при взгляде на эту программу сразу рождаются какие-то ассоциации с древней культурой под названием ~CoreWar~ ("Бой в Памяти"). Для тех, кто подключился к компьютерным играм в последнее десятилетие, наверное надо напомнить об этом явлении, поскольку о нем давно уже никто не вспоминал. А ~CoreWar~ - была не просто программой, это была поистине культура и явление. И развивалась эта культура наиболее активно в начале 80-х. Суть состояла в том, что каждый программист сам писал себе небольшую программу в машинном коде, после чего две программы разных авторов запускали в память машины. Куда, в какие адреса пошли эти программы, никому неизвестно. Суть игры сводилась к тому, что эти программы должны были "обстреливать" большие пространства памяти машины с целью "зацепить" и уничтожить программу-соперника. Когда жертва не подавала операционной системе сигналов "Я жива", бой заканчивался. Но "обстреливать" память наугад - не единственное, чем занимались бойцы. Лучшие образцы умели "размножаться", "залечивать" поврежденные участки, "маскироваться", "сканировать" память и пр. ~CoreWar~ получила широчайшее распространение (на Западе). Проводились чемпионаты, турниры. Организовывались клубы, а эти клубы выпускали регулярные бюллетени, то есть, появились как бы средства массовой информации по этой культуре. Многочисленные журналы имели постоянные разделы, в которых организовывались соревнования, рассказывалось о новых открытиях и достижениях. Конечно, участие в подобных мероприятиях было доступно только для программистов, причем высокой квалификации. Кроме турниров для определения лучшей программы, проводились многочисленные конкурсы на самую короткую, самую оригинальную программу. Это движение много дало развитию программирования как искусства и созданию новых технологий. При всей своей массовости движение ~CoreWar~ не могло захватить круги обычных пользователей, но зато дало неожиданный побочный эффект Невооруженным взглядом видно, что те же свойства, которыми должен обладать хороший "боец в памяти", нужны и зловредному вирусу. Так, из культуры ~CoreWar~ произросли самые выдающиеся вирусоводы и вирусоведы. Мы не знаем почему, может быть именно из-за того, что самые психически ущербные программисты стали проявлять порочную страсть к написанию (и распространению) вирусов, это движение стало затухать где-то к 1984 году, и сейчас о нем редко вспоминают. Конечно полной аналогии между ~Боем в памяти~ и ~Змеиным Боем~ нет и быть не может, но нам очень хотелось бы, чтобы "Змеиный Бой~ тоже стал родоначальником массового движения и новой культуры. У этой программы для этого есть все необходимые данные. Она довольно азартна, дает возможность пользователю проявить свои творческие способности и добиться самоопределения и признания. Все это возможно. Единственное, чего долгое время в России не было, так это средства массовой информации, которое могло бы взять на себя заботы о координации действий пользователей и организацию массового движения. Теперь такое средство есть - это Ваш PC-REVIEW. "Инфорком-Пресс" особо займется пропагандой ~"Змеиного Боя"~, распространением этой программы и организацией соревнований. Мы рассчитываем на то, что эта программа станет той основой, которая позволит сблизить отечественных производителей и потребителей программного обеспечения в России. По этому поводу читайте статью "Змееводам и Змеелюбам!" в этом номере журнала.