2015-07-20 86 views
2

我目前正在創建一個2d數組來表示一個網格上要放置的遊戲元素。我希望能夠總結特定的元素塊,但似乎無法讓我的函數正常工作,並且我懷疑有更簡單的方法來完成此操作。陣列的二維數組中選定的元素的總和(框形?)

例子:

int[6,6] myArray = {{2,1,4,3,1,2,5} 
       ,{4,2,3,3,1,2,4} 
       ,{3,4,9,1,2,7,5} 
       ,{1,6,2,1,3,4,2} 
       ,{2,1,4,6,2,1,0} 
       ,{6,2,8,1,6,5,7} 
       ,{7,6,10,3,9,7,2}}; 

目前代碼:

int BoxSum(int x, int y, int x1, int y1, int [,] arrayM) { 
     int Results = 0; 
     int xmod = (x1 - x)/Mathf.Abs (x1 - x); 
     int ymod = (y1 - y)/Mathf.Abs (y1 - y); 
     if (x1 > x & y1 > y) { 
      for (int ix = x; ix <= x1; ix ++) { 
       for (int iy = y; iy <= y1; iy++) { 
        Results += arrayM [ix, iy]; 
       } 
      } 
     } 
     if (x1 > x & y1 < y) { 
      for (int ix = x; ix <= x1; ix ++) { 
       for (int iy = y; iy <= y1; iy--) { 
        Results += arrayM [ix, iy]; 
       } 
      } 
     } 
     if (x1 < x & y1 < y) { 
      for (int ix = x; ix <= x1; ix --) { 
       for (int iy = y; iy <= y1; iy--) { 
        Results += arrayM [ix, iy]; 
       } 
      } 
     } 
     if (x1 < x & y1 > y) { 
      for (int ix = x; ix <= x1; ix ++) { 
       for (int iy = y; iy <= y1; iy--) { 
        Results += arrayM [ix, iy]; 
       } 
      } 
     } 
     return Results; 
    } 

所以,如果我進入:

(BoxSum(1,1,5,5,myArray)); 

(BoxSum(5,5,1,1,myArray)); 

我想爲兩者都獲得86(獨立於我是否在命令中輸入x,y或x1,y1)。現在他們給我不同的結果,86和0.

謝謝你的幫助!

回答

3

如果你想讓它工作,無論哪些參數是高/低值,你可以做這樣的事情。

private int BoxSum(int x, int y, int x1, int y1, int[,] arrayM) 
    { 
     int lowestX = (x1 > x) ? x : x1; 
     int lowestY = (y1 > y) ? y : y1; 

     int highestX = (x1 > x) ? x1 : x; 
     int highestY = (y1 > y) ? y1 : y; 

     int sum = 0; 

     for (int i = lowestX; i < highestX; i++) 
     { 
      for (int j = lowestY; j < highestY; j++) 
      { 
       sum += arrayM[i, j]; 
      } 
     } 

     return sum; 
    } 
+2

很好的答案。我會使用Math.Min和Math.Max。 – phoog

+0

工作完美!謝謝! – user3470214

2

如果我正在閱讀你的問題,你只是想要一個嵌套for循環,所以: 編輯:忘了那個整理了開始和停止位置的位!添加它。 還採取使用數學最小和最大

using System; 
public class boxes{ 
public int[6,6] myArray; 
public void boxes(){ // This is just a constructor. 
myArray = {{2,1,4,3,1,2,5} 
       ,{4,2,3,3,1,2,4} 
       ,{3,4,9,1,2,7,5} 
       ,{1,6,2,1,3,4,2} 
       ,{2,1,4,6,2,1,0} 
       ,{6,2,8,1,6,5,7} 
       ,{7,6,10,3,9,7,2}}; 
} 
public int BoxSum(int x, int y, int x1, int y1) { 
int sum = 0; 
int xstart = Math.Min(x1, x); 
int ystart = Math.Min(y1, y); 
int xend = Math.Max(x1, x); 
int yend = Math.Max(y1, y); 
for(int i=xstart;i<=xend;i++) 
{ 
    for(int j=ystart;j<=yend;j++) 
    { 
     sum += myArray[i,j]; 
    } 
} 
return sum; 
} 
} 

的phoogs建議我寫了一個簡單的類,我假設你有類似的東西。如果該方法是包含您的數組的類的成員,則不需要將其傳遞給該方法。

+0

這是一個很好的答案,但我認爲如果使用Math.Min和Math.Max而不是那些條件運算符,代碼的意圖會更容易。 – phoog

+1

@phoog好點,我會這樣做。 –

1

現有的答案都不能解釋爲什麼在一種情況下得到錯誤的結果。問題是在處理這種情況下,塊中的錯誤:

if (x1 < x & y1 < y) { 
    for (int ix = x; ix <= x1; ix --) { 
     for (int iy = y; iy <= y1; iy--) { 
      Results += arrayM [ix, iy]; 
     } 
    } 
} 

它應該是:

if (x1 < x & y1 < y) { 
    for (int ix = x; ix >= x1; ix --) { 
     for (int iy = y; iy >= y1; iy--) { 
      Results += arrayM [ix, iy]; 
     } 
    } 
} 

這就是爲什麼Don't repeat yourself(DRY)的原則是很重要的一個很好的例子。讓自己頭痛,並做其他答案的建議。

+0

好點phoog,謝謝指出錯誤。 –

+0

好點!謝謝! – user3470214