2014-07-21 72 views
1

我有一個單元格矩陣(在我的情況下是按鈕),如果我點擊一個按鈕,我需要檢查附近(加形狀)單元格是否爲空,如果單元格是空的(只有一個可以),我需要交換兩個單元格(空單元格和單擊單元格)。 我現在要做的是:整潔地檢查附近的單元格是否爲空

  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

您當前的技術不一定是壞事,它只是還沒幹。您還可以通過將偏移量轉換爲某種數據結構來使搜索空間更加明確。下面是使用元組的一個示例:

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

您確實只有一個if,但您還需要分別創建每個偏移量。所以這不是理想的......但仍然比我的想法更好。 – shoham

+0

@shoham:沒錯,但單獨列出偏移量的好處是它非常明確,可以說更易於閱讀。另外,如果您想要在搜索中添加對角線,這將非常容易。我相信有更多的「巧妙」方法來迭代這些偏移量,但我認爲在這種情況下並不需要這麼做(請記住,聰明性通常與可維護性不一致 - 好的代碼很簡單)。 – voithos

+0

好吧,我想你是對的。謝謝。 – shoham

相關問題