我正在尝试制作Flood-It风格的游戏,我遇到了主要算法的问题。
算法会检查您已控制的每个方格,并找到具有您无法控制的所选颜色的相邻方块。
变量:
1 - $ board:保持棋盘状态的二维数组
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);
}
}
}
答案 0 :(得分: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);
}
}
}