我目前正在创建一个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。
谢谢你的帮助!
如果你想让它不管哪个参数是高/低值都工作,你可以这样做:
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;
}
如果我没看错你的问题,你只需要一个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;
}
}
我写了一个简单的类,我假设你也有类似的东西。如果该方法是包含数组的类的成员,则不需要将其传递给该方法。 现有的答案都不能解释为什么你在一个情况下得到了错误的结果。问题是处理这种情况的块中的一个错误:
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];
}
}
}
这是一个很好的例子,说明为什么不要重复自己(DRY)原则很重要。为避免自己的头痛,按照其他答案的建议去做。