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

时间:2014-07-21 21:00:44

标签: matrix

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

            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]);

现在个人认为这很丑陋 有没有更好的方法来做到这一点? (如果重要的话,这是C#)

由于

1 个答案:

答案 0 :(得分:1)

你目前的技术并不一定是坏的,它不够干。您还可以通过将偏移量转换为某种数据结构来使搜索空间更加明确。以下是使用元组的示例:

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]);
        }
    }
}