Принципы, которых мы придерживались при разработке данного документа.
Самая сложная задача проекта - обеспечить максимальную интеллектуальность игры, оставив ее при этом привлекательной для неискушенных зрителей и, что еще более важно, пригодной для начала разработки «с нуля», с минимальными необходимыми ресурсами (в том числе и за минимальное время). Нужно, чтобы «с нуля» и быстро можно было разработать и первую версию самой программы, проводящей игры, и первых игроков для нее. Это сразу ограничивает нашу фантазию в изобретении правил. В частности, практически запрещает игры, построенные на понимании человеческих языков. Большая часть правил сделана такими, какие они есть сейчас, в первую очередь чтобы, с одной стороны, оставить разработку максимально простой, и с другой стороны, создать потенциально неисчерпаемое богатство игровых ситуаций и действий.
Общее описание игры.
Игра представляет собой «войну», или, точнее, противоборство, происходящее в игровом мире, большая часть законов которого изначально неизвестна. Игроки сами по себе не обладают никаким «оружием», то есть не могут наносить друг другу никаких «повреждений». В качестве оружия им служат законы игрового мира, а точнее, «агрессивная внешняя среда». В игре никак не участвуют люди, все правила учитываются автоматически симуляционной программой. Правила построены так, что среда отзывается на действия игроков по определенным законам, которые, однако, заранее неизвестны и медленно усложняются с течением времени. Игрок, чей представитель «погиб», то есть оказался в агрессивной внешней среде на достаточно большое время, получает штрафное очко и продолжает игру с новым представителем, возникающем в случайном (но заведомо безопасном) месте игрового мира. Потери информации при этом не происходит, то есть, игрок знает, что «погиб», но помнит все, что было до этого. В игре выигрывает тот, у кого меньше штрафных очков по прошествии всего времени игры.
Между разными партиями игры ее правила и состояние игрового мира не сохраняются. Это делается для того, чтобы старые игроки не имели преимуществ перед только вступающими в игру.
Почему только два игрока? Давайте, все наши игроки будут жить в одном и том же мире!
Найдите в интернете и прочитайте условия и решение замечательной задачи о тройной дуэли. Вот вкратце вывод, который после этого можно сделать: в игре, в которой происходит противоборство между более чем двумя игроками, совсем не обязательно выигрывает лучший. Во многих ситуациях быть слабым игроком оказывается выгодно.
Второе соображение такое: игра должна проходить в реальном времени на не самых мощных компьютерах. Хотелось бы оставлять как можно больше процессорного времени для «размышлений» каждому из игроков, а потому желательно, чтобы их одновременно было как можно меньше.
Почему «смерть» игрока не окончательна? Зачем эти нежизненные условности: «и тут я снова ожил»?
Чтобы сократить влияние случайностей до минимума.
Почему именно война? Мы мирные люди, и не хотим создавать ИИ для военных целей!
Это не война, это, скорее, «войнушка». В нашем мире такие «игроки» воевать не смогут. А «войнушка» нужна затем, чтобы игра была зрелищной, и при этом ее правила были понятны без лишних слов и уточнений. В игре не предполагается никакой агрессии и уж конечно, никакой крови. Кроме того, заметьте, что даже правила шахмат - модель войны.
Почему каждый раз мир создается заново? Пусть это будет один большой и сложный мир, существующий непрерывно.
Поскольку правила, по которым живет окружающая игроков среда, постепенно усложняются, поддержание одного большого и сложного мира требовало бы со временем все больших и больших вычислительных мощностей. Кроме того, такая форма проведения игры очень затрудняет проведение соревнований и требует создание и поддержание единого сервера игры, возможность игры через IP-протокол и т.п., что для начальных этапов излишне.
Все это, разумеется, вовсе не значит, что Вы не сможете проводить очень длинных (часы, дни, недели...) игровых партий.
Физика игрового мира
Игровой мир двумерен и ограничен, хотя и велик по своим размерам. Он состоит из игроков, «полей» и «зарядов». Хотя смысл слов «поле» и «заряд» и напоминает смысл этих слов в физике, все же игровые «поля» и «заряды» серьезно отличаются от, скажем, электрических. Дальше в тексте слова «поле» и «заряд» будут писаться без кавычек, так как ни в каком другом смысле, кроме игровых правил, мы их использовать не будем.
Поле – некоторая гладкая функция, которая может быть вычислена в любой точке всего игрового мира. Полей в игре может быть довольно много, но только часть из них непосредственно влияет на игроков. Поля – единственное, что может непосредственно влиять на игроков и на заряды. Заряды и игроки не могут непосредственно влиять друг на друга, а только за счет создаваемых ими полей. Поля создаются только игроками и зарядами, самостоятельно существующих полей не бывает. В игровом мире действует принцип суперпозиции: поля, создаваемые игроками и объектами, складываются между собой. Поле постоянно меняется с течением времени, поскольку заряды и игроки движутся и меняют свои характеристики. Однако правила устроены таким образом, что поля меняются достаточно медленно, причем на этот процесс можно влиять или понимать законы, по которым это происходит.
Игроки и заряды – точечные, то есть, их положение может быть задано двумя координатами. Все законы, по которым меняется их состояние, не меняются при параллельном переносе или повороте игрового мира на любой угол (то есть, игровой мир однородный и изотропный). Заряды могут создавать различные поля, двигаться под действием полей и менять свое внутреннее состояние под действием полей. Законы, по которым это происходит, могут быть совершенно разными. Но всегда гарантируется их предсказуемое поведение, а именно:
Заряд, вылетевший за пределы игрового мира, исчезает. Игроки не могут выйти за пределы игрового мира, так как при приближении к ним неограниченно нарастает напряженность одного из опасных для них полей.
Одной из главных характеристик игрока является его «здоровье». Оно уменьшается, если напряженность каких-то опасных полей в точке, где находится игрок, превышает 0, пропорционально этой напряженности. Оно не может стать больше некоторого предела, и медленно увеличивается со временем, если меньше его. Если оно становится равно 0 или меньше, игрок «умирает».
Для повышения удобства разработки игроков считается, что какие именно поля влияют непосредственно на игроков, и как именно, известно игрокам заранее. Отмена этого правила не приведет к повышению интеллектуальности игры, а только к дополнительной работе по созданию игрока и к увеличению фактора случайности.
Все заряды делятся на классы. Все заряды одного и того же класса подчиняются одинаковым законам. Время от времени игра производит «мутацию», при этом появляется новый класс зарядов, законы которого похожи на законы «мутировавшего» класса, но отличаются от них. При этом «мутировавший» класс также остается в игре. Если число зарядов в игре не превосходит некоторого максимума, игра может в любой момент времени создать заряд любого класса. Однако она будет располагать его настолько далеко от обоих игроков, насколько возможно. В частности, созданный заново объект всегда находится вне «поля зрения» любого из игроков. Поскольку иногда заряды могут исчезать, они никогда не прекращают появляться, и условия в игровом мире все время меняются.
Зачем нужны «поля» и «заряды»? Давайте у нас будут только объекты, с которыми игроки будут как-то взаимодействовать, и которые будут подчиняться заранее неизвестным правилам. Зачем еще какие-то поля?
В нашем, реальном мире отличить «объекты» от «необъектов», или точно сказать, где проходит граница между двумя «объектами», чаще всего нельзя. Например, автомобиль можно считать объектом, а можно набором объектов – четырех колес, двигателя и т.п. Солнечный зайчик можно считать объектом, а можно и не считать. Для генерала полк – объект, а отдельный взвод его вообще не интересует. Для полковника уже взвод является объектом. Для лейтенанта взвод – набор объектов-людей, и т.п. Похожие мысли выразил А.Егоров в своем замечательном, хотя и сложновато написанном эссе «Граница».
Такие рассуждения могут казаться банальными и неуместными, но они очень важны. В тестовой задаче ни в коем случае не должно быть каких-то выделенных «объектов». Только информация о большом, непрерывном мире, причем не вся, а лишь часть. И именно несоблюдение этого правила не позволило компьютерной игре «Creatures», изначально специально созданной для того, чтобы быть полигоном для разработки ИИ, действительно стать им.
Зачем в таком случае нужны «заряды»? Ведь они же и станут теми самыми «объектами», от которых, как вы говорите, надо избавляться! Хорошо, пусть останутся только поля и законы, ими управляющие.
Без зарядов мы не сможем придумать такие законы поведения полей, которые с одной стороны могут быть очень разнообразными, а с другой – обладают характерной внутренней структурой, то есть, говоря языком философов, познаваемы. В свое оправдание скажем, что игроки не знают о том, где находятся заряды, и прямо влиять на них никак не могут. Они «видят» только непрерывные поля, и только ими же влияют на ситуацию. Вообще, законы, по которым живут заряды, в реализации (читай вторую часть текста) таковы, что часто по поведению поля нельзя понять, один заряд его создает, или несколько. Какие-то «структуры» в этом поле игрок сможет выделить в отдельные, как ему будет казаться, «объекты», но никто не может гарантировать, что его разделение совпадет с внутреигровым разделением на заряды. Больше того, вполне может оказаться и так, что представления игрока о том, что считать «объектами», окажется для его действий даже полезнее, чем угадывание внутриигрового представления.
Почему у нас так много полей, разных классов зарядов, разных законов? Почему заряды могут создавать сразу несколько разных полей и по разным законам? Весь наш реальный мир можно описать совсем небольшим количеством всего вышеперечисленного.
Вы уверены? Почему же это до сих пор не сделано? J И даже если так, игра не в состоянии расчитывать поведение 10^100 зарядов (или что-то около того). J Нам приходится делать сами заряды и законы сложнее, чтобы сделатьигру интеллектуальней.
Но каким же образом и по каким правилам будут появляться новые классы?
Это долгий разговор, и он будет вестись во второй части текста, которая пока еще не написана. Пока скажем только, что какой-то достаточно хороший вариант нами уже придуман. Возможность реализовать необходимые «мутации» классов и соблюдать при этом все «метаправила» есть. Но не хотелось бы обсуждать детали реализации до тех пор, пока мы не обсудим эту первую часть – общие принципы.
Как все это показывать зрителям?
Напряженности основных полей, действующих на игроков можно для начала показывать схематически, цветами. При этом «опасные» поля делать красными, черными, оранжевыми и т.п. (можно представлять себе их как «огонь»), а те поля, действие которых может оказаться и полезным и вредным для игрока в зависимости от ситуации – синими, желтыми, зелеными и т.п. Заряды – точками или символическими обозначениями. Игроков – роботообразными фигурками.
Есть и более красивые способы показывать происходящее. Но об этом мы еще подумаем и расскажем позднее.
Информация о мире, доступная игрокам. Действия игроков.
Все точки, находящиеся на расстоянии не более Х от игрока, называются его зоной видимости. Скорее всего, для большего интереса будет введено, например, такое правило: точки, в которых напряженность «зеленого поля» превосходит 1/расстояние, исключаются из зоны видимости. «Зеленое поле» можно представлять себе как «туман».
Каждый игрок в каждый момент времени обладает следующей информацией:
Кроме того, для получения дополнительной информации игрок может «спросить» у «игрового мира» напряженности полей в любой точке из своей зоны видимости. Это действие он может произвести не более, чем фиксированное число раз (условно говоря, 200) за игровой такт.
Игрок может совершить за такт два вида действий:
Кроме этих действий, игрокам ничего больше делать не разрешается.
Зачем ограничение на количество измерений? Неужели ограничения зоны видимости не достаточно?
Это, во-первых, моделирует ограниченные возможности большинства рецепторов живых существ по одновременному получению информации. Во-вторых, очевидно, мы не сможем, хранить все значения для всех полей в каждой точке мира (просто потому, что мир непрерывен и точек в нем бесконечно много). Значит, каждое такое «измерение» – это, на самом деле, запрос игровому «движку» на вычисление этой функции. Поэтому их число придется ограничивать.
Зачем игроку сразу знать напряженность и градиент полей там, где он находится? Захочет – вычислит.
Для простоты разработки первых, «глупых» алгоритмов. Это настолько важная информация, что мы дадим ее им сразу, «за так». Тем более, ее все равно придется вычислять при моделировании того, что произошло с игроком после прошлого такта.
На этом часть первая, посвященная общим принципам, заканчивается. Скоро на сайте появится вторая часть текста, посвященная деталям предполагаемой реализации этих планов.