Я изучал этот урок тетриса, и я наткнулся на функцию, которая удаляет строки и переводит строки на один уровень вниз. Я вроде понимаю, что происходит с этими функциями, но некоторые части меня смущают. Я постараюсь объяснить это как можно лучше, но вот ссылка на урок, если вам это нужно: http://javilop.com/gamedev/tetris-tutorial-in-c-platform-independent-focused-in-game-logic-for-beginners/
Для меня это выглядит как функция для запуска массива с последнего номера строки:
void Board::DeleteLine (int pY)
{
// Moves all the upper lines one row down
for (int j = pY; j > 0; j--)
{
for (int i = 0; i < BOARD_WIDTH; i++)
{
mBoard[i][j] = mBoard[i][j-1];
}
}
}
Затем есть функция, которая вызывает у меня проблемы, которые я объясню:
void Board::DeletePossibleLines ()
{
for (int j = 0; j < 20; j++)
{
int i = 0;
while (i < 10)
{
if (mBoard[i][j] != 1) break;
i++;
}
if (i == 10) DeleteLine (j);
}
}
Если вы не знакомы, идея состоит в том, чтобы удалить строку, которая состоит полностью из 1
, Но if (mBoard[i][j] != 1) break;
остановил бы цикл, если бы первая строка не была 1
, Как бы петля достигла 1
это где-то в середине mBoard[][]
массив если break
мешает ему сделать что-нибудь возможное сразу?
Я что-то здесь упускаю? Это моя интерпретация этого. Возможно, кто-то видит то, чего я не вижу?
Редактировать:
Спасибо за ответы, ценится.
Вы можете структурировать код следующим образом:
for (int j = 0; j < 20; j++)
{
int i = 0;
while (i < 10)
{
if (mBoard[i][j] != 1)
{
break; //only breaks the while loop and will continue with if (i == 10)
}
else
{
i++;
}
}
if (i == 10)
{
DeleteLine (j);
}
}
Теперь вы можете ясно видеть, что break;
только прерывает ваш while
петля но не твой for
петля.
Перерыв выпрыгнет из цикла while. Так что если вы встретите строку, которая имеет не-1 где-то в середине, я будет индексом в строке, и цикл for продолжится со следующей строки (J), начиная с i = 0 снова.
break
только прерывает один петля, while
петля в вашем случае. for
цикл продолжается счастливо.
На заметку, это while
может быть легко (и должно) быть преобразовано в for
и может быть сжат в соответствии с его распознаваемым шаблоном for-if-break:
for (int j = 0; j < 20; ++j)
{
int i;
for(i = 0; i < 10 && mBoard[i][j] == 1; ++i);
if (i == 10) DeleteLine (j);
}