2015-04-20 1 views
0

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

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

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

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

здоровается, MC

+0

Можете ли вы объяснить, как вы представляете плитки в памяти. – gomons

+0

Плитка имеет цвет (красный или белый) и тип (крест, кривая 1, кривая2). Существует простой массив 2d, где я устанавливаю зависимые числа, если плитка помещается и сохраняется в векторе. – MrCotton

+0

Вы можете использовать рекурсию или цикл для проверки состояния выигрыша. Из каждой плитки попробуйте перейти на другую плиту (по правилам) и на каждом шаге проверить, посетили ли плитку (условие цикла), или плитки имеют длину длиной 8. – gomons

ответ

0

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

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; 
       } 
      } 
     } 
    } 
} 
+0

Как бы вы проверили, в каком направлении идет цикл? он не подходит для всех путей ..? если плитка установлена, проверьте ее только в одном направлении. Но если есть несколько плиток, распространяющихся от одного, я проверяю, что он не работает, – MrCotton

+0

Рекурсия проверяет все направления. Функция 'canMoveTo (i + 1, j)' должна возвращать true, если вы можете получить из tile 'i, j' в tile' i + 1, j'. Код не тестировался, это своего рода псевдокод и иллюстрирует только идею. – gomons

+0

Может быть ошибка, потому что если я пойду в случае 1 с i + 1 и вызову рекурсию, я тоже могу перейти к случаю 2 с i-1 и закончим бесконечным циклом. – MrCotton

0

Для этого вида игры вещи, чтобы сделать вещи легко, я хотел бы добавить небольшие растровое представление плитки

  1. создают карты плитки

    макс. разрешение может содержать все плитки

    Trax tiles map

    думаю тоже 3x3 разрешение будет выполнимо. Вам нужно 4 цвета:

    • серый - настенные
    • Красный - путь plr1
    • Белый - путь plr2
    • Magenta - путь plr1, plr2
  2. после каждого включения

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

    A*

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

    вычислений ограничивающего параллелепипеда используемых точек, так что вы будете нуждаться в min,max х, у координаты x0,x1,y0,y1 (в плитки).Из этого, если петель найдено вы знаете:

    columns = x1-x0+1 
    rows = y1-y0+1 
    

    поэтому условие выигрыша только одного if от этого

Надеется, что это помогает, я разработал эту технику для замкнутого контура петли обнаружения/подсчетом в моих Carcassonne

+0

вы можете объяснить, как вы это сделаете для такой программы, как моя? – MrCotton

+0

@MrCotton вы не предоставили никакой информации о своей программе, поэтому я не могу быть более конкретным, чем это сейчас. Потому что я просто догадываюсь, как выглядит ваша структура плитки, как вы ее открываете и т. Д. ... сначала дайте более подробную информацию – Spektre