javascript - 计算棋盘游戏领土 (GO) 背后的逻辑

标签 javascript logic flood-fill

所以我正在为 javascript 制作棋盘游戏,但我在计算领土时遇到了麻烦。如果您不知道,GO 就像一个复杂的跳棋,您需要水平和垂直而不是对 Angular 放置棋子。当游戏结束并且您已经为自己的棋子划出边界时,就会出现领土(棋盘边缘算作任何人)。

territory

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

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

所以绿色只会在游戏结束时出现。游戏已经结束,黑棋控制了棋盘的左上角,俘虏了 2 名棋手。里面的小组已被识别并涂上绿色。问题是,我怎么知道绿地属于哪个玩家?

任何人都可以看到黑色拥有领土的所有边/边界(记住棋盘边缘是任何人)。当里面有囚犯时,它开始变得困难。我可以检查与每个绿色单元格相邻的每个单元格。非黑即白不是领土,有犯人就不行。

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

欢迎任何帮助:)

最佳答案

我最终使用自己的算法非常有效地做到了这一点。

它会首先识别有问题的领土并得到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

所以最后我只检查红色圆圈所在的 gem 的每种颜色。如果有任何冲突的颜色,它就不可能是领土。由于在这种情况下唯一的颜色是黑色,我们知道这是一片黑色领土。

关于javascript - 计算棋盘游戏领土 (GO) 背后的逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45401378/

相关文章:

regex - 正则表达式中的逻辑

python - 需要帮助修改洪水填充算法

javascript - 使用 Javascript 对 "Form"进行简单除法

javascript - 我无法使用innerHTML javascript将C源代码设置为html

algorithm - 分析 1 个可变寄存器指令集?

c++ - 填补OpenCV中的漏洞

c - 高效的 8 连接洪水填充

Javascript 从单个下拉列表填充 2 个文本框

javascript - 是否有 JQuery 插件可以在上传时将彩色照片转换为黑白照片?

java - 方法返回 222 * (2 + 2 + 2) 而不是 222 * 222