2015-07-20 70 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