如何计算网格上三个不同的坐标是否彼此相邻?

问题描述

我正在使用C#制作链接游戏,其中玩家具有不同颜色的单元格的网格,并垂直,水平或对角地链接相同颜色的单元格。目前,我正在使用5x5网格。左下角的坐标是(0,0),右上角的坐标是(4,4)。

我正在尝试检测一个死锁的板,因此,当至少没有三个可连接一种颜色的单元时,却真的很难实现这种逻辑。

我正在获取某种颜色的所有单元格的列表,我想编写一个函数来检查这些单元格的坐标,以查看三个单元格是否相邻。

例如,假设我有一块带有以下蓝色单元格的面板(圆圈是蓝色):

x x x x x
x x x o o
x x x o x
o x x x x
o x x o o

我从左到右,从下到上扫描木板,然后通过:

0,0
3,0
4,0
0,1
3,2
3,3
4,3

据此,我知道(3,2)可以连接到上面的(3,3)。然后我知道(3,3)可以连接到(4,3)右侧。

有人知道如何编写一个函数来遍历这些坐标并检查相邻坐标吗?为了使其中三个可连接返回真还是假?

谢谢!

解决方法

我会创建一组连接瓷砖的列表。实现此目的的方法之一是使用递归函数。

一些伪代码:

void function addAdjacentTiles(List knownTiles,Tile currentTile):
    append currentTile to knownTiles
    for each tile adjacent to currentTile:
        if adjacentTile is the same colour and is not in knownTiles:
            addAdjacentTiles(adjacentTile) // This is the recursive part


listOfGroups = empty list

for each tile:
    if (tile is not in listOfGroups):
        tileGroup = empty list
        addAdjacentTiles(tileGroup,tile)
        append tileGroup to listOfGroups

longest = max(the sizes of all groups)

请注意,addAdjacentTiles函数不必返回任何内容,因为它修改了可变的knownTiles变量。