Алгоритм рекурсивной функции игры Flood-It в PHP - PullRequest
3 голосов
/ 26 января 2011

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

Алгоритм проверяет каждый квадрат, которым вы уже управляете, и находит смежные квадраты, имеющие выбранный цвет, который вы не контролируете.

Переменные:

1 - $ board: двумерный массив, содержащий состояние доски

  • Квадраты, которыми вы управляете в массиве: = 0
  • Квадраты, которыми вы не управляете, варьируются от 1 до 6 и представляют разные цвета.

2 - $ color: цвет, выбранный пользователем

3 - $ size: размер квадрата игрового поля

4 - $ rkey / $ ckey: строка и столбец в двумерном массиве

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

Вот пример игры, которую я пытаюсь сделать: http://floodit.appspot.com/

function checkRecursive($rkey, $ckey)
{
    global $board, $size, $color;
    if ($board[$rkey][$ckey] == 0)
    {
        if ($rkey < $size-1 && $board[$rkey + 1][$ckey] == $color)
        {
            $board[$rkey + 1][$ckey] = 0;
            checkRecursive($rkey + 1, $ckey);
        }
        if ($ckey < $size-1 && $board[$rkey][$ckey + 1] == $color)
        {
            $board[$rkey][$ckey + 1] = 0;
            checkRecursive($rkey, $ckey + 1);
        }
        if ($rkey > 0 && $board[$rkey - 1][$ckey] == $color)
        {
            $board[$rkey - 1][$ckey] = 0;
            checkRecursive($rkey - 1, $ckey);
        }
        if ($ckey > 0 && $board[$rkey][$ckey - 1] == $color)
        {
            $board[$rkey][$ckey - 1] = 0;
            checkRecursive($rkey, $ckey - 1);
        }
    }
}

1 Ответ

1 голос
/ 26 января 2011

Читая ваш код, похоже, что если вы всегда начинаете с (0,0), то после того, как квадраты, непосредственно прилегающие к этой ячейке, находятся под контролем игрока, дальнейшие проверки не пройдут их.

Вы пойдете:

  • начать с (0,0)
  • check (0,1): уже установлено на 0, ничего не делать.
  • check (1,0): уже установлено в 0, ничего не делать.

Я думаю, может быть, вам нужно удалить понятие "контроля" квадратов.Все, что вам нужно сделать, - это неоднократно выполнять алгоритм заливки разными цветами.

Я думаю, что-то вроде этого может быть лучше, где $ oldcolor - это цвет вашей начальной ячейки перед началоми $ newcolor - это цвет, выбранный пользователем:

function checkRecursive($rkey, $ckey)
{
    global $board, $size, $oldcolor, $newcolor;
    if ($board[$rkey][$ckey] == $oldcolor)
    {
        $board[$rkey][$ckey] = $newcolor
        if ($rkey < $size-1 && $board[$rkey + 1][$ckey] == $oldcolor)
        {            
            checkRecursive($rkey + 1, $ckey);
        }
        if ($ckey < $size-1 && $board[$rkey][$ckey + 1] == $oldcolor)
        {
            checkRecursive($rkey, $ckey + 1);
        }
        if ($rkey > 0 && $board[$rkey - 1][$ckey] == $oldcolor)
        {
            checkRecursive($rkey - 1, $ckey);
        }
        if ($ckey > 0 && $board[$rkey][$ckey - 1] == $oldcolor)
        {
            checkRecursive($rkey, $ckey - 1);
        }
    }
}
...