Условие победы алгоритма Trax

Я пытался реализовать игру Trax на C++. Для тех, кто не знает: http://www.traxgame.com/about_rules.php

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

Моя первая попытка решения включала путь ко многим if-условиям. Это просто невозможно. Поэтому мне нужно реализовать правильный алгоритм..

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

Привет, MC

2 ответа

Для такого рода игровых вещей Чтобы упростить задачу, я бы добавил небольшое растровое изображение в представление плиток.

  1. создавать карты тайлов

    Наименьшее разрешение, способное представлять все плитки, как это

    Карта тайлов Trax

    Я думаю, что также возможно разрешение 3х3. Вам нужно 4 цвета:

    • Серый - стена
    • Красный - путь плр1
    • Белый - путь плр2
    • Пурпурный - путь плр1, плр2
  2. после каждого хода

    создать растровое изображение доски из растровых изображений тайлов и использовать A*, начиная с последнего отредактированного тайла (и может быть также 4 соседями), и указать путь для каждой начальной точки игрока / пути (желтый). Когда A* будет сделано, проанализируйте данные карты (оранжевый), чтобы найти наибольшее число на карте (зеленая средняя точка). Это точка, в которой заполнение A* прекращается (его не нужно искать). Затем восстановите кратчайший путь назад к начальной точке (коричневая), установив использованные точки карты как непригодные. Затем попробуйте восстановить путь еще раз, если вы можете, то замкнутый контур присутствует

    A

  3. при реконструкции пути

    вычислить ограничивающую рамку использованных точек, так что вам понадобится min,max координаты x,y x0,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;
                }
            }
        }
    }
}
Другие вопросы по тегам