Архивы: по дате | по разделам | по авторам

Игра для настоящих программистов

Архив
автор : Сергей Поваляев   30.10.2002

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

Тем пасмурным февральским утром, когда я нажал на ссылку с интригующим названием «Игра для настоящих программистов», я еще не предполагал, что мне предстоят много дней увлекательного программирования, борьбы с себе подобными (программистами), компьютер в качестве приза и статья в «Компьютерре». На страничке было написано: «Террариум» (Terrarium) - это многопользовательская игра, представляющая собой симулятор природной экосистемы, разработанный средствами .Net Framework. Разработчики могут создавать собственные существа и добавлять их в игру на своих клиентских компьютерах, а специальные телепортеры перемещают их создания между всеми клиентами одноранговой сети «Террариума» [3].

Впрочем, все началось чуть раньше. В очередном порыве энтузиазма я решил изучить что-то новое - на этот раз язык Java, - а через некоторое время нашел и описание языка C#, который содержал все то, чего мне не хватало в Java после программирования на Delphi. Язык C# является частью .Net Framework - продукта фирмы Microsoft, который решает задачи, схожие с задачами Java. .Net Framework предоставляет защищенную объектно-ориентированную среду выполнения, несколько компиляторов (C#, Visual Basic, C++) и огромную библиотеку классов для разработки Windows-приложений, веб-сайтов и веб-сервисов [2]. В отличие от Java у объектов C# имеются свойства (properties), существует аппарат событий (events), можно создавать перечисления (enums) и структуры (structs). Также C# предоставляет новые управляющие конструкции: foreach для перебора списков, using для гарантированного освобождения ресурсов; передачу параметров по ссылке, механизм атрибутов и многое другое [1].

В процессе работы над .Net двое сотрудников фирмы Microsoft решили реализовать популярную идею создания виртуального живого мира, в котором сосуществуют и борются за выживание программы, написанные разными программистами. Эта идея уже не раз находила свое воплощение, но в данном случае Интернет и защищенная среда выполнения .Net Framework позволили реализовать ее на новом уровне. Игра была названа «Террариум» (Terrarium). Чтобы принять в ней участие, достаточно установить на своем компьютере .Net Framework и клиентскую часть «Террариума» [4]. Клиент соединяется с указанным вами или с предлагаемым по умолчанию сервером игры, и на экране появляется пустынный мир, по которому перемещается одинокий синий шар. Этот шар - телепортатор, и уже через несколько минут в наш мир попадают первые поселенцы с других компьютеров. Живые существа в «Террариуме» делятся на растения, травоядных и хищников. Вскоре мир становится более населенным, и вы уже видите хищников, охотящихся на травоядных, или разборки конкурентов за территорию. В принципе на созерцании можно и остановиться - «Террариум» устанавливается на компьютер в качестве хранителя экрана (screen saver) и каждый раз, запускаясь, загружает с диска то состояние мира, в котором вы покинули его. Но мы-то с вами понимаем, что самое интересное не в этом и пора создавать свое собственное живое существо!

Создать его можно, воспользовавшись либо Visual Basic, либо C#. Компиляторы обоих языков распространяются вместе с .Net Framework, который, в свою очередь, можно бесплатно скачать с сайта Microsoft [2]. Кроме того, потребуется описание внутренних механизмов игры и перечень объектов, которые вы будете использовать при программировании. Для этого необходимо обратиться на домашнюю страничку игры [4]. Итак, мы начали создавать животное. Первым делом нужно решить, кого вы хотите создать - хищника или травоядное (растения не представляют интереса для программирования) и каковы будут их основные характеристики: размер взрослых особей, зрение, камуфляж, скорость перемещения, коэффициенты нападения и обороны и так далее. В сумме на основные характеристики дается 100 очков, которые вы должны распределить в соответствии со своим планом. В итоге получается программа, похожая на приведенную ниже (C#):

[ assembly: OrganismClass( “MyTiger” ) ]

[ assembly: AuthorInformation( “Ivanov Ivan”, “” ) ]

// Основные свойства

[ CarnivoreAttribute( false ) ]

[ MatureSize( 25 ) ]

// Очки (в сумме должны быть равны 100)

[ MaximumEnergyPoints( 12 ) ]

[ EatingSpeedPoints( 2 ) ]

[ AttackDamagePoints( 16 ) ]

[ DefendDamagePoints( 8 ) ]

[ MaximumSpeedPoints( 12 ) ]

[ CamouflagePoints( 0 ) ]

[ EyesightPoints( 50 ) ]

public class MyTiger : Animal {}

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

«Террариум» можно запускать и в локальном режиме, в котором ваши животные могут жить, не соприкасаясь с жестоким окружающим миром, и в который вы можете подселить с сервера интересующие вас растения и животных-конкурентов. В наблюдениях за этими тепличными условиями и проходит поначалу основное время общения с игрой.

В свое время я остановил выбор на травоядных. Хотя удачное животное создать одинаково трудно, будь оно травоядным или хищником, начинать проще с травоядного. Источник пищи, растения, никуда не убегают, не меняют свои повадки и при должном с ними обращении обеспечивают пропитание достаточно долго. Хищник, напротив, должен постоянно двигаться, выслеживая и преследуя добычу, прижимая ее к кустам или к границам мира, хищнику приходится постоянно приспосабливаться к новым повадкам травоядных.

Первый этап соревнования проходил с 4 по 11 марта 2002 года на российском сервере, запущенном Московским отделением фирмы Microsoft. 11 марта в полдень замерялась суммарная численность животных на всех компьютерах, составляющих российскую экосистему, и виды с наибольшей численностью отбирались для участия во втором этапе. На первом этапе участник мог опробовать сколько угодно вариантов существ, на втором же борьба проходила только между отобранными видами, в которых уже нельзя было ничего изменить. 20 марта были объявлены итоги конкурса: в категории травоядных победил я, а в категории хищников - Дмитрий Кузьменко. 2 апреля в офисе фирмы Microsoft состоялось награждение победителей конкурсов Microsoft Office Extensions и победителей и участников второго тура конкурса «Террариум».

Борьба была непростой. Конкурентоспособное животное у меня получилось только к обеду 10 марта. Создавая свое животное, я реализовал несколько идей. Во-первых, так как животное видит не весь мир, а только маленький кусочек, я добавил зверю память о тех местах, где он бывал, или о животных, которых видел. У каждого объекта в памяти имелся коэффициент «забывания». Чем больше времени тому назад животное видело объект, тем коэффициент был меньше. Если он становился слишком мал, информация забывалась полностью. Этот коэффициент впоследствии учитывался при принятии решения, стоит ли убегать от хищника, которого видел несколько минут назад, или лучше пожевать травки, до которой пара шагов. Дополнительная память помогала предсказать, что будет дальше с окружающим миром: если животное старое - когда оно умрет, если хищник куда-то двигался - где он сейчас находится. Во-вторых, животное составляло перечень задач нескольких видов: а) убегай от, б) иди к растению, в) нападай на конкурента, г) отходи от границ мира и д) просто гуляй. Каждой задаче присваивался коэффициент важности в зависимости от условий. Допустим, важность задачи «иди к растению» зависела от расстояния до растения, количества пищи в растении, коэффициента «забывания» и степени голода. Задача «нападай на конкурента» позволяла убивать молодые и потому еще не очень крепкие особи конкурентов. Задача «отходи от границ мира» заставляла животное удаляться от краев, где вероятность пасть жертвой хищника была наиболее высока. Задача «просто гуляй» выполнялась в отсутствие других задач и была предназначена для изучения местности в поисках пищи и конкурентов. Для исполнения выбиралась важнейшая из них, а в некоторых случаях сразу две. Например, если важнее было убежать от хищников, то выбирался вектор движения, равный сумме векторов, направленных от местоположения хищников и помноженных на важность задачи (то есть опасность хищника).

Когда, казалось, судьба первого этапа была решена, появился новый противник. Травоядное zmeat, созданное Александром Потоцким, реализовало необычную стратегию борьбы с конкурентами. Общепринятым поведением травоядных был экологический баланс с растительным миром, то есть когда животное видело, что растение находится на грани смерти, оно переставало его есть, давая возможность растению немного восстановиться. Zmeat продемонстрировало более выгодную тактику - в отсутствие конкурентов оно берегло растения, а при наличии травоядных других видов съедало растения до конца. Зачастую это приводило к экологическому коллапсу, после которого вымирали все растения и животные за исключением пары растений на краях мира и несколько zmeat, обитающих возле них. Минута-другая, и вот мир уже заселен потомками выживших растений и хитрых zmeat.

В последние часы тура я постарался перенять эту тактику и еще добавил коммуникацию между животными посредством скорости. Различным скоростям движения были присвоены разные смыслы: быстрый бег означал, что за животным гонится хищник, бег помедленней - животное увидело еду, поспешный шаг - намерение напасть на конкурента. Таким образом, мои животные смогли кооперироваться: убегать от хищника, даже не видя его, направляться к невидимой еде или следовать за сородичем, чтобы наподдать вместе слабому конкуренту. Так появился мой последний вид травоядного - sam3 [5].

По окончании российского конкурса некоторые участники запустили своих зверюшек в мировую экосистему, где те показали себя во всей красе. Долгое время мой sam3 удерживал лидерство среди травоядных, создания Дмитрия Кузьменко - среди хищников, а животные Шамиля Сайфутдинова побеждали в обеих категориях.

Сейчас выпущена новая версия игры: «Террариум» 1.1, и каждый может принять участие в соревновании в мировой экосистеме и соревнованиях, периодически проводящихся в разных странах.


Список ресурсов:

  1. Сравнительный обзор C#  

  2. .Net Framework Home

  3. Игра для настоящих программистов. Российская домашняя страничка Terrarium

  4. Terrarium Home

  5. Исходный текст моего травоядного

© ООО "Компьютерра-Онлайн", 1997-2021
При цитировании и использовании любых материалов ссылка на "Компьютерру" обязательна.