我在编写扫雷的代码部分时遇到了麻烦,当你点击一个空白区域时它就会出现,它会向外级联并产生一个数字环。我有一个数字设置数组和一个炸弹阵列。在数字数组中,零表示没有任何内容。我首先检查点击的点是否是炸弹,如果没有,那么是否有数字,然后else语句必须导致级联和数字环。基本上我经历了四个循环,向上,向下,向左,向右循环框,直到我找到一个数字。从那里我有八个for循环,沿x和y的递增和递减顺序沿着这些行中的每一行,直到找到一个数字。一旦找到一个数字,我会尝试返回原点,但是通过检查我到达那里的路径的边界,将坐标值增加1并将坐标值减1。出于某种原因,我无法让我的代码工作。这是我的while循环的一个例子。 “checkx”和“checky”是数组的坐标。 “revealxposition”和“revealyposition”是图形窗口中的坐标。
int i=0;
while(i == 0 && checkx < length && checky < length)//right
{
if(numbers[checkx][checky] != 0)
{
revealxposition = (checkx*20) + 5;
revealyposition = (checky*20) + 3;
showNumber(revealxposition, revealyposition, numbers[checkx][checky]);
xmax = checkx;
i = 1;
}
else
{
if(checkx == (length - 1))
{
i = 1;
xmax = length;
a = checkx*20;
b = checky*20;
c = a+20;
d = b+20;
line(a,b,c,d);
line(a,d,c,b);
}
else
{
a = checkx*20;
b = checky*20;
c = a+20;
d = b+20;
line(a,b,c,d);
line(a,d,c,b);
checkx++;
}
}
}
这是我的一个for循环的例子:
for(int xx = checkx; xx < xmax; xx++)
{
int z = 0;
int xxx = xx;
while(z == 0 && checky < length)
{
if(numbers[xx][checky] != 0)
{
revealxposition = (xx*20) + 5;
revealyposition = (checky*20) + 3;
int originalxposition = revealxposition;
int originalyposition = revealyposition;
showNumber(revealxposition, revealyposition, numbers[xx][checky]);
//reveal diagonals and back
while(bombs[xx][checky] != 1 && checky >= originaly)
{
counter++;
revealxposition = originalxposition - 20;
xx = xxx - 1;
showNumber(revealxposition, revealyposition, numbers[xx][checky]);
checky--;
revealyposition -= 20;
}
xx = xxx;
checky = originaly;
revealxposition = originalxposition;
revealyposition = originalyposition;
counter = 0;
while(bombs[xx][checky] != 1 && checky >= originaly)
{
counter++;
revealxposition = originalxposition + 20;
xx = xxx + 1;
showNumber(revealxposition, revealyposition, numbers[xx][checky]);
checky--;
revealyposition -= 20;
}
xx = xxx;
z = 1;
counter = 0;
}
else
{
a = xx*20;
b = checky*20;
c = a+20;
d = b+20;
line(a,b,c,d);
line(a,d,c,b);
checky++;
}
}
checky = originaly;
}
答案 0 :(得分:0)
您的代码真的难以阅读,我不知道xx或xxx是什么意思或a=xx*20;
我做了一次扫雷,我非常确定有更简单的方法来检查空白区域。目标是使用递归。让我告诉你一个例子。
void checkNumber(x,y) {
revealNumber(x,y); // write the number
if(Number[x,y] == 0){ // if it is blank space, check all 8 square around
if(x>0)
checkNumber(x-1,y); // check left
if(x<maxX)
checkNumber(x+1,y); // check right
// repeat for up,down and diag
}
}
这将为您提供一个循环,显示所有空格和最接近的空格。希望它可以帮到你。
)