【问题标题】:The logic behind calculating board game territory (GO)计算棋盘游戏领土 (GO) 背后的逻辑
【发布时间】:2017-07-30 15:17:46
【问题描述】:

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

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

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

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

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

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

任何帮助都会得到帮助:)

【问题讨论】:

  • 你必须为它创建自己的算法
  • 好吧,我收集到了,但是该算法的逻辑是什么?我刚刚意识到我可以滚动浏览组中的每一个部分。如果它的四面都是绿色,它在中间,可以移除以识别边界。不确定这是否适用于囚犯
  • 我不知道 Go 是如何工作的。您是否需要找到划分棋盘的棋子路径(因为您说的是洪水填充)-检查this question
  • 我已经计算了棋盘的分区。我使用洪水填充来做到这一点,并将组着色为绿色。
  • 我可以给你一些我制作的游戏算法的例子,一个是扫雷游戏,每行从左到右从上到下进行,另一个是迷宫生成器,检查它是否是可解决与否,虽然我不知道他们是否会有很大帮助,也没有很好的评论

标签: javascript logic flood-fill


【解决方案1】:

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

它将首先识别有问题的区域并获取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 循环,最后我留下了边框的每个坐标。我已经通过绘制红色圆圈来证明这一点,因此它易于视觉化,并且您可以看到它不会干扰任何囚犯。

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

【讨论】:

  • 还有@torazaburo,你现在脸上挂着鸡蛋,因为说它不起作用:)
【解决方案2】:

我将自己发布一个想法并尝试这种方法。因此,我将首先获取该区域中最左侧的列,在本例中其索引为 0。我将使用 for 循环滚动浏览每一列,找出该列中最高和最低的石头。所以首先是第0列。最上的石头是0,最下的石头是5。(忽略棋盘标记)。因为这必须是这个形状的顶部和底部边界,所以我将检查顶部上方和底部下方的石头并记下它们。

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

我只是在脑海中想到了这个,我现在要尝试一下

【讨论】:

  • 我只是在脑海里想到了这个,我现在就去尝试一下 那么这不是一个答案。在您实施并发现它有效之后,这将是一个答案(提示:它不会)。
  • 为什么不呢?逻辑似乎完美无缺。此外,答案部​​分不适用于始终有效的确定性答案。人们发布建议以及他们认为可行的方法。如果是这样,op 会打勾并说它工作正常
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多