PHP中的泛洪游戏递归函数算法

时间:2011-01-26 01:50:46

标签: php ajax recursion iteration

我正在尝试制作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 个答案:

答案 0 :(得分:1)

阅读你的代码,看起来如果你总是从(0,0)开始,那么一旦紧邻该单元格的正方形处于玩家控制之下,进一步的检查将不会通过它们。

你会去:

  • 从(0,0)开始
  • check(0,1):已设置为0,什么都不做。
  • check(1,0):已经设置为0,什么都不做。

我想也许你需要删除“控制”方块的概念。您要做的就是重复执行不同颜色的flood fill算法。

我觉得这样的事情可能会更好,其中$ 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);
        }
    }
}