2015-07-13 4 views
3

Я пытаюсь сделать интерактивную игру карты (как Risk), в котором у меня есть много путей SVG, который похож на этот:
Example SVG Map
Как найти соседние пути в SVG-файле?

Таким образом, когда player1 щелкает территорию player2, чтобы напасть он, кликнутая территория должна иметь границу с территорией другого игрока. Недопустимая атака.

Я думал хранить все пути, и это соседние пути в многомерном массиве, как это:

path[0] -> path[0][0] path[0][1] path[0][2] 
path[1] -> path[1][0] path[1][1] 

Но так как моя карта огромна, это действительно неэффективно для меня, чтобы сделать это так , Любые предложения по решению этой проблемы?

+0

В чем проблема? эти пути, которые вы хотите сохранить - от куда и куда они идут? –

+0

http://i.imgur.com/hNpThyB.jpg Итак, на этой карте. Игрок1, у которого есть зеленая территория, должен быть способен атаковать желтую территорию 2, но не 3, так как у Игрока 1 нет границ с территорией 3. Моя проблема в том, что мне нужно найти способ предотвратить нападение на территорию 3. – LazyHands

+0

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

ответ

2

создать таблицу стран

Содержит информацию о смежности, каждая страну обычно до 7 соседей, если у вас есть маленькие государства, как Ватикан, Люксембург, ... Таким образом, для равномерного отображения разбиения можно использовать статическое число соседей , Что-то вроде этого:

  • int map[countries_max][neighbors_max];

Единая карта деление

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

родовой карта деление

Вы должны проверить, если какая-либо часть границы пути страны рядом/параллельно с любой частью другой страны границы пути. Если да, то сохраните индекс страны в списке соседей. Это можно сделать только в том случае, если у вас есть пограничные пути.

родовое карта деление (без пограничных путей)

В случае, если ваша карта растр или вектор, но не в виде замкнутых многоугольников/путей в стране (например, вы можете иметь деление пути вместо), то выше подходы непригодны. Когда вы атакуете, вы знаете начальную и конечную позицию атаки так, чтобы лить линию от начала до конца (DDA или Bresenham) и подсчитывать, сколько пересекаемых границ пересекаются (подсчет краев цвета). Если счетчик равен 1, действительный. У этого будут ложные негативы, если вы будете атаковать несколько раз подряд, пересекая одну и ту же границу.

+0

Спасибо! Я попробую их. – LazyHands

1

Я думаю, что идея использования массива для такого рода вещей - неправильный способ следовать.

Вы должны попытаться создать class Map, и все функции внутри этого класса будут представлять территорию, и все игроки будут объектами этого класса. Делая это, вы можете управлять ситуацией более простым способом.

Например: знать, если player1 уже получил ту часть карты, вам нужно будет только чтобы увидеть, если функция player1.Brazil (где Brazil функция внутри class Map объектного player1) уже с флагом = Правда. Этот флаг будет boolean, и всякий раз, когда вы получаете эту территорию, вы должны изменить этот флаг на True.

Таким образом, сравнивая как функции игрока 1, так и 2 игрока с простым оператором if, вы можете создавать соседние пути, которые будут соблюдать правила игры.

+0

Спасибо за комментарий. Но что, если было более двух игроков? Мы не будем находить соседние пути снова. – LazyHands

+0

@ UlaşAnılAÇIKEL приветствую друга. Каждый игрок будет объектом, и каждый из них будет иметь информацию о территориях, которые у них уже есть, поэтому не имеет значения, сколько у вас игроков, если вы хотите узнать, можете ли вы атаковать определенную часть карты, вы просто нужно было бы назвать fuctions той части карты, каждого игрока и сравнить с логикой игры, используя оператор if. Конечно, это будет все труднее, если вы будете продолжать увеличивать количество игроков. Но для меня это отличный алгоритм. –

Смежные вопросы