массивы — переполнение стека кода сапера

У меня возникают проблемы при написании части моего кода для тральщика, которая возникает, когда вы нажимаете на пустое место, и это как бы каскадно выходит наружу и приводит к кольцу чисел. У меня есть массив для чисел и массив для бомб. В массиве чисел ноль означает, что там ничего нет. Сначала я проверяю, была ли выбранная точка бомбой, если нет, то есть ли число, а затем оператор else должен привести к каскаду и кольцу чисел. В основном, я прохожу четыре цикла, нажимая на петли вверх, вниз, влево и вправо, пока не найду число. Оттуда у меня есть восемь циклов for, идущих по каждой из этих линий в возрастающем и убывающем порядке x и y, пока не будет найдено число. Как только число найдено, я пытаюсь вернуться к исходной точке, но проверяя границы пути, который я выбрал, чтобы увеличить его, увеличив значение координаты на единицу и уменьшив значение координаты на единицу. По какой-то причине я не могу заставить свой код работать. Вот пример моего цикла while. «checkx» и «checky» — это координаты массива. «показывает» и «показывает» координаты в графическом окне.

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

Решение

Ваш код действительно трудно читать, я не знаю, что означает хх или ххх или 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
}
}

Это даст вам цикл, который покажет все пустое пространство и ближайший номер к нему. Надеюсь, это поможет вам.

)
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]