Matrix 整洁地检查附近的单元格是否为空

Matrix 整洁地检查附近的单元格是否为空,matrix,Matrix,我有一个单元格矩阵(在我的例子中是按钮),如果我点击一个按钮,我需要检查附近的(加上形状)单元格是否为空,如果一个单元格为空(只有一个可以),我需要交换两个单元格(空单元格和点击的单元格)。 我现在做的是: if(j < 3) if (!fbarr[i, j + 1].Visible) swap(fbarr[i, j], fbarr[i, j + 1]); if(j &g

我有一个单元格矩阵(在我的例子中是按钮),如果我点击一个按钮,我需要检查附近的(加上形状)单元格是否为空,如果一个单元格为空(只有一个可以),我需要交换两个单元格(空单元格和点击的单元格)。 我现在做的是:

            if(j < 3)
                if (!fbarr[i, j + 1].Visible)
                    swap(fbarr[i, j], fbarr[i, j + 1]);
            if(j > 0)
                if (!fbarr[i, j - 1].Visible)
                    swap(fbarr[i, j], fbarr[i, j - 1]);
            if(i < 3)
                if (!fbarr[i + 1, j].Visible)
                    swap(fbarr[i, j], fbarr[i + 1, j]);
            if(i > 0)
                if (!fbarr[i - 1, j].Visible)
                    swap(fbarr[i, j], fbarr[i - 1, j]);
if(j<3)
如果(!fbarr[i,j+1]。可见)
交换(fbarr[i,j],fbarr[i,j+1]);
如果(j>0)
如果(!fbarr[i,j-1].可见)
掉期(fbarr[i,j],fbarr[i,j-1]);
如果(i<3)
如果(!fbarr[i+1,j].可见)
交换(fbarr[i,j],fbarr[i+1,j]);
如果(i>0)
如果(!fbarr[i-1,j].可见)
掉期(fbarr[i,j],fbarr[i-1,j]);
现在我个人认为这简直是太难看了。
有更好的方法吗?(这是C#如果重要的话)


谢谢

你目前的技术不一定很差,只是不够干而已。通过将偏移量放入某种数据结构中,还可以使搜索空间更加明确。下面是一个使用元组的示例:

var offsets = new List<Tuple<int, int>>
{
    Tuple.Create(0,  1),
    Tuple.Create(0, -1),
    Tuple.Create( 1, 0),
    Tuple.Create(-1, 0)
};

foreach (var offset in offsets) {
    int newI = i + offset.Item1;
    int newJ = j + offset.Item2;

    // New position must be within range
    if (newI >= 0 && newI <= 3 && newJ >= 0 && newJ <= 3) {
        if (!fbarr[newI, newJ].Visible) {
            swap(fbarr[i, j], fbarr[newI, newJ]);
        }
    }
}
var offset=新列表
{
Tuple.Create(0,1),
Tuple.Create(0,-1),
Tuple.Create(1,0),
Tuple.Create(-1,0)
};
foreach(偏移量中的var偏移量){
int newI=i+offset.Item1;
int newJ=j+offset.Item2;
//新位置必须在范围内

如果(newI>=0&&newI=0&&newJ您只有一个if,但您还需要单独创建每个偏移量。因此,这并不理想……但仍比我的想法好。@shoham:是的,但单独列出偏移量的好处是它非常明确,而且可以说更易于阅读。此外,如果您想在searc中添加对角线,请h、 这将是非常容易的。我确信有更多“聪明”的方法来迭代这些偏移量,但我不认为在这种情况下有必要这样做(请记住,聪明往往与可维护性不符——好的代码很简单)。@shoham:我想部分原因是它仍然可能“看起来很奇怪”这是因为C#作为一种语言,仅仅创建和迭代一组常量并不容易。例如,在Python这样的语言中,编写这样的操作要容易得多。