计算棋盘游戏区域(GO)背后的逻辑

时间:2017-07-30 15:17:47

标签: javascript logic flood-fill

所以我正在制作桌面游戏GO for javascript,我在计算领土时遇到了麻烦。如果你不知道,GO就像一个复杂的检查器,你可以水平和垂直放置石头而不是对角线。当游戏结束并且你已经制作了一块石头的边框(棋盘边缘算作任何人)时,就会出现领土。

territory

所以上面的图片是我到目前为止所拥有的。

白色=玩家1,黑色=玩家2,绿色=领土

所以绿色只在比赛结束时出现。游戏现在已经完成,黑方控制了左下角的2名囚犯。内部组已被识别并以绿色着色。问题是,我怎么知道绿色领土属于哪个球员?

任何人都可以看到黑色拥有领土的所有边/边界(记住板边缘是任何人)。当里面有囚犯时,它开始变得艰难。我可以检查每个绿色细胞附近的每个细胞。如果有黑色和白色,它不是一个领土,但如果有囚犯则不会起作用。

我认为可能选择的一种方法是尝试识别围绕它的边界。如果我能做到这一点,我可以很容易地检查它的领土。使用正方形但是圆形或任何变形形状来计算边界peices会很容易吗?我不确定。

任何帮助都是适当的:)

2 个答案:

答案 0 :(得分:0)

我最终使用自己的算法设法做到了这一点。

它将首先识别有问题的区域并获得lowX,lowY,highX,highY。所以在这种情况下,它分别是0,0,5,5。然后我像这样做一个for循环:

    for (var j = lowX; j < highX + 1; j++)
    {       
        var lowColumnY = null;
        var highColumnY = null;

        for (var k = 0; k < territories[i].length; k++)
        {               
            if (territories[i][k].x == j)
            {
                if ((lowColumnY == null) || (territories[i][k].y < lowColumnY))
                {
                    lowColumnY = territories[i][k].y;
                    console.log(lowColumnY);
                }

                if ((territories[i][k].y > highColumnY) || (highColumnY == null))
                {
                    highColumnY = territories[i][k].y;
                }
            }                               
        }

这样滚动领域的所有列并计算出低点和高点,它们是声明的前2个变量。然后我重复Y的for循环,最后我留下边框的每个坐标。我通过绘制红色圆圈来证明这一点,因此它易于视觉化,因为你可以看到它不会干扰任何囚犯。

territory

所以最后我只检查红色圆圈所在的每种颜色的石头。如果有任何冲突的颜色,它就不能成为领土。在这种情况下,唯一的颜色是黑色,我们知道它是一个黑色领域。

答案 1 :(得分:-1)

我将自己发表一个想法并尝试这种方法。所以我将首先获得该领域中最左边的列,在这种情况下它的索引为0.我将使用for循环滚动查找列中最上方和最下方的每一列。首先是第0列。最高的石头是0,最大的是5。(忽略板标记)。由于这必须是这个形状的顶部和底部边界,我将检查顶部上方和下方的石头并记下它们。

由于石头0,0的顶部是板的边缘,其标记为“两者”。现在在底部,它将被标记为“黑色”。我们现在拥有这个领土的所有者。我将对所有列重复此操作,然后对所有行重复此操作,如果它有任何冲突的所有者,我将打破循环,因为它不能成为一个领域。

我只是想到了这个,我现在就试试吧