C ++ Tetris: функция, которая удаляет строки

Я изучал этот урок тетриса, и я наткнулся на функцию, которая удаляет строки и переводит строки на один уровень вниз. Я вроде понимаю, что происходит с этими функциями, но некоторые части меня смущают. Я постараюсь объяснить это как можно лучше, но вот ссылка на урок, если вам это нужно: 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 мешает ему сделать что-нибудь возможное сразу?

Я что-то здесь упускаю? Это моя интерпретация этого. Возможно, кто-то видит то, чего я не вижу?

Редактировать:

Спасибо за ответы, ценится.

1

Решение

Вы можете структурировать код следующим образом:

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 петля.

0

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

Перерыв выпрыгнет из цикла while. Так что если вы встретите строку, которая имеет не-1 где-то в середине, я будет индексом в строке, и цикл for продолжится со следующей строки (J), начиная с i = 0 снова.

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);
}
0
По вопросам рекламы [email protected]