Pull to refresh

Гипербург — трехмерный вариант игры «Каркассон»

Reading time 5 min
Views 2.3K
Недавно на одном из форумов, посвященных многомерным пространствам, был задан вопрос: «А какие игры реализованы в нетривиальных пространствах, в частности, нет ли где реализации игры Каркассон на плоскости Лобачевского?» Вопрос мне показался интересным, тем более, что про эту игру я ни разу не слышал.

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

Понятно, что простор для обобщений в сторону нетривиальной геометрии огромен. Можно вместо квадратных карточек разработать треугольные или шестиугольные. Можно укладывать квадратные карточки на поверхность куба (появится 8 особых точек, в которых сходятся 3 а не 4 карточки, но это не очень принципиально). Можно нарисовать на плоскости Лобачевского квадратную сетку, в каждой вершине которой сходится 5 (или 6, или бесконечно много) квадратов. А можно заменить квадратные клетки на кубические и строить карту в пространстве.

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



Для начала надо было решить, какую именно версию игры я буду адаптировать: существует несколько разных базовых наборов клеток и правил, у которых есть еще и расширения дополнительными элементами и объектами. Выбор пал на вариант «Discovery» (он же «New World», он же «Новые земли»). Там земля делится на три области (моря, горы, равнины), и за завершенные (и даже за незавершенные) объекты можно получить очки.

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

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



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

В базовом варианте есть четыре элемента топографии: города, дороги, монастыри, и поля, занимающие всю остальную территорию. Игроки в процессе игры могут занимать дороги (участки, ограниченные концами или перекрестками), города (области, ограниченные стенами), монастыри (отдельные клетки) и поля. За завершенные объекты (кроме полей) начисляются очки (объекты при этом освобождаются), а поля оцениваются только в конце игры.

Понятно, что в трехмерном случае идея поля, как элемента топографии, не срабатывает: дороги не делят землю на части, и в большинстве случаев вся карта оказывается одним большим полем с вкраплениями городов. Чтобы сохранить интерес, я добавил к городам и дорогам другую аналогичную пару — моря и реки. С немного другим подсчетом очков: если город оценивается по площади, то море — по числу портов (клеток, где в него впадают реки и участков, граничащих с городами), а в реках, в отличие от дорог, перекрестки не являются границами участка. Но это все косметические правки. Первый вопрос — как будет выглядеть игровое поле, и какие будут игровые карточки.

Для игры нужно, чтобы фрагменты объектов на новых клетках продолжали недостроенные объекты, уже находящиеся на поле. Значит, грани клеток должны давать удобные возможности для их состыковки. Проще всего этого добиться, если сделать рельеф на граниях симметричным — чтобы любые две клетки с гранями одинакового типа могли состыковаться по этим граням любым из четырех возможных способов. Выбранные игровые элементы (равнина, река, море, дорога, город) дают такую возможность: достаточно, чтобы город и море могли занимать грани только целиком, а дороги и реки проходили через центры граней. Если бы добавилась такая деталь рельефа, как каньоны (двумерные поверхности, которые делят пространство на части), то этот способ не прошел бы — пришлось бы учитывать взаимную ориентацию клеток относительно оси, проходящей через их центры. Но в текущей версии игры каньонов нет.

Клетку я поделил на 7 зон: 6 соответствуют граням и имеют форму усеченных квадратных пирамид, а седьмая — в центре, имеет форму куба. Внешние зоны могут быть в одном из 5 состояний (все, кроме монастырей), внутренняя — в одном из шести. Геометрия и топографические свойства клетки полностью определяются состояниями ее зон: два участка моря или города, принадлежащие соседним граням являются смежными, если ровно две грани клетки (причем смежные) находятся в состоянии «дорога», то дорога соединяет центры этих граней (в остальных случаях — соединяет грань с центральной зоной). И есть несколько ограничений. Например, если в клетку входит три или более дороги, то центральная зона должна быть «городом» (и играть роль перекрестка).

Перечислять все возможные клетки я побоялся, и выбрал случайную генерацию: сначала у клетки определяются состояния всех граней (с определенными вероятностями: равнина — с вероятностью 1/2, река и дорога — по 1/6, море и город — по 1/12), потом определяются возможные состояния центральной клетки. Если в центре возможен монастырь, он ставится с вероятностью 1/8, а если этого не случилось — состояние выбирается равновероятно из всех возможных. После этого клетка предлагается для игры. (Позже я посчитал, что количество различных клеток — примерно 750, так что можно сгенерировать и включить в программу их полный список, заодно снабдив каждую какой-нибудь вероятностью появления)

Стартовая клетка выглядит так:



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



Для вращения клетки и поля используется левая кнопка мыши, для поворота камеры — правая. Для приближения/удаления — Ctrl+левая кнопка.

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



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



Через несколько ходов ориентироваться в ситуации на поле становится сложно:



Для облегчения жизни игроков есть несколько дополнительных режимов визуализации. Для того, чтобы проанализировать внешние грани клеток на поле (и понять, куда можно ходить), внешние грани поля делаются менее прозрачными:



Чтобы лучше проанализировать форму отдельных объектов, можно уменьшить их прозрачность и повысить прозрачность внешних граней равнины:



И, наконец, чтобы надежнее определить цвет фишки на поле (например, если фишка находится в море или в городе), да и просто увидеть положение всех фишек, есть режим, в котором все объекты становятся белыми и почти прозрачными:



Перед началом игры можно выбрать число игроков (от 2 до 5) и продолжительность игры (число ходов — от 20 до 10000). После их выбора надо нажать кнопку New Game.

Прочитать более подробные правила (по-английски) можно
на этой странице. Исполняемый код можно скачать отсюда, а исходные тексты — отсюда. Программа написана на C# с использованием библиотеки Open Toolkit. Для работы требует Windows с .NET 2.0
Tags:
Hubs:
+39
Comments 25
Comments Comments 25

Articles