Условие победы алгоритма Trax
Я пытался реализовать игру Trax на C++. Для тех, кто не знает: http://www.traxgame.com/about_rules.php
До сих пор я построил доску и создал правила, в которых я могу разместить свою следующую плитку и какую из них мне разрешено устанавливать. Но сейчас я борюсь с условиями победы. Как видите, мне нужна линия минимум из 8 плиток..
Моя первая попытка решения включала путь ко многим if-условиям. Это просто невозможно. Поэтому мне нужно реализовать правильный алгоритм..
Моя вторая попытка использования битборда становится довольно сложной, поэтому мой вопрос был бы: есть ли более простой способ, которого я сейчас упускаю.
Привет, MC
2 ответа
Для такого рода игровых вещей Чтобы упростить задачу, я бы добавил небольшое растровое изображение в представление плиток.
создавать карты тайлов
Наименьшее разрешение, способное представлять все плитки, как это
Я думаю, что также возможно разрешение 3х3. Вам нужно 4 цвета:
- Серый - стена
- Красный - путь плр1
- Белый - путь плр2
- Пурпурный - путь плр1, плр2
после каждого хода
создать растровое изображение доски из растровых изображений тайлов и использовать A*, начиная с последнего отредактированного тайла (и может быть также 4 соседями), и указать путь для каждой начальной точки игрока / пути (желтый). Когда A* будет сделано, проанализируйте данные карты (оранжевый), чтобы найти наибольшее число на карте (зеленая средняя точка). Это точка, в которой заполнение A* прекращается (его не нужно искать). Затем восстановите кратчайший путь назад к начальной точке (коричневая), установив использованные точки карты как непригодные. Затем попробуйте восстановить путь еще раз, если вы можете, то замкнутый контур присутствует
при реконструкции пути
вычислить ограничивающую рамку использованных точек, так что вам понадобится
min,max
координаты x,yx0,x1,y0,y1
(в плитках). Из этого, если петля найдена, вы знаете:columns = x1-x0+1 rows = y1-y0+1
таким образом, условие выигрыша только одно
if
из этого
Надеюсь, это поможет, я разработал эту технику для поиска / подсчета путей в замкнутом контуре в моей игре Каркассон
Я могу предложить вам использовать рекурсию. Я могу неправильно понять вашу, но в любом случае:
bool isWin(int i, int j, int length) {
if (length >= 8)
return true;
if (canMoveTo(i + 1, j)) {
if (isWin(i + 1, j, length + 1))
return true;
}
if (canMoveTo(i - 1, j)) {
if (isWin(i - 1, j, length + 1))
return true;
}
if (canMoveTo(i, j + 1)) {
if (isWin(i, j + 1, length + 1))
return true;
}
if (canMoveTo(i, j - 1)) {
if (isWin(i, j - 1, length + 1))
return true;
}
return false;
}
bool isWin(int i, int j) {
int length = 0;
isWin(i, j, length);
}
..
main() {
for (int i = 0; i < HEIGHT; ++i) {
for (int j = 0; j < WIDTH; ++j) {
if (isTilePresent(i, j)) {
if (isWin(i, j)) {
if (isRed(i, j))
std::cout << "Red is won!" << std::endl;
else
std::cout << "White is won!" << std::endl;
}
}
}
}
}