所以我正在制作桌面游戏GO for javascript,我在计算领土时遇到了麻烦。如果你不知道,GO就像一个复杂的检查器,你可以水平和垂直放置石头而不是对角线。当游戏结束并且你已经制作了一块石头的边框(棋盘边缘算作任何人)时,就会出现领土。
所以上面的图片是我到目前为止所拥有的。
白色=玩家1,黑色=玩家2,绿色=领土
所以绿色只在比赛结束时出现。游戏现在已经完成,黑方控制了左下角的2名囚犯。内部组已被识别并以绿色着色。问题是,我怎么知道绿色领土属于哪个球员?
任何人都可以看到黑色拥有领土的所有边/边界(记住板边缘是任何人)。当里面有囚犯时,它开始变得艰难。我可以检查每个绿色细胞附近的每个细胞。如果有黑色和白色,它不是一个领土,但如果有囚犯则不会起作用。
我认为可能选择的一种方法是尝试识别围绕它的边界。如果我能做到这一点,我可以很容易地检查它的领土。使用正方形但是圆形或任何变形形状来计算边界peices会很容易吗?我不确定。
任何帮助都是适当的:)
答案 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循环,最后我留下边框的每个坐标。我通过绘制红色圆圈来证明这一点,因此它易于视觉化,因为你可以看到它不会干扰任何囚犯。
所以最后我只检查红色圆圈所在的每种颜色的石头。如果有任何冲突的颜色,它就不能成为领土。在这种情况下,唯一的颜色是黑色,我们知道它是一个黑色领域。
答案 1 :(得分:-1)
由于石头0,0的顶部是板的边缘,其标记为“两者”。现在在底部,它将被标记为“黑色”。我们现在拥有这个领土的所有者。我将对所有列重复此操作,然后对所有行重复此操作,如果它有任何冲突的所有者,我将打破循环,因为它不能成为一个领域。
我只是想到了这个,我现在就试试吧