Я пишу клон Tetris, и я прототипируюсь на C#. Конечный код должен работать во встроенной системе (с использованием 8-битного процессора и очень маленькой ОЗУ), поэтому я пытаюсь использовать наивный алгоритм, чтобы сделать линию чистой.Наивная сила тяжести для игры в тетрис с использованием 2D-массива для игрового поля
Сейчас мое игровое поле представляет собой 2D массив:
private readonly TetrominoType[][] _playfield;
(где TetrominoType
это перечисление, обозначающие либо None, либо один из 7 типов, используемое для окрашивания блоков)
Когда линия очищается, я хочу изменить этот массив на месте, где моя проблема. Возьмем такой пример:
Before After
0 # # # #
1 # # # #
2 # # # #
3 # # # #
4 # # # #
5 #xxxxxx# # #
6 #x xx# # #
7 #xxxxxx# # #
8 #xxxxxx# #x xx#
9 #x xxxx# #x xxxx#
######## ########
я уже определил, что линии 5, 7 и 8 нужно удалить, и, таким образом, другие линии должны упасть, оставив меня с государством справа.
Мой наивный способ для перебора в обратном направлении и скопировать строчку выше очищаемой один, в основном:
for(int iy = 9; iy >= 0; iy--) {
if(_linesToClear.Contains(iy)) {
for(int ix = 0; ix < 6; ix++) {
_playfield[iy][ix] = _playfield[iy-1][ix];
}
}
}
Проблема здесь в том, что выше линии также может быть очищен (например, если iy == 8
я не» t хочу скопировать строку 7, но строка 6), а также что мне нужно очистить скопированную строку (iy-1
) - или скопировать строку над той, которая, в свою очередь, должна стекать вверх.
Я попытался подсчитать, сколько строк я уже пропустил, но это работает только в том случае, если я создаю новый массив и затем меняю его, но я не могу получить математическую работу для модификации массива play-in-place.
Возможно, это действительно просто, но я просто не вижу алгоритма. Кто-нибудь знает, как я могу это сделать?
Это не будет работать, но вы считали, что сканирование игрового поля для * удаленной строки * удалено, и соответственно отрегулируйте остальные, и повторите этот алгоритм до тех пор, пока не будет удаленных строк? Такой алгоритм «развертки» часто используется для деконструирования графиков зависимостей - в то время как они неэффективны, они действительно легко рассуждать и могут соответствовать законопроекту здесь. С другой стороны, они, вероятно, не настолько эффективны, насколько это возможно. –
@KirkWoll Я думал об этом, он казался неэффективным, даже не проверяя его, поэтому я мог бы дать ему еще один выстрел. Даже на процессоре с частотой 1 МГц 6502 (целевой) это должно быть довольно быстро. Чувствует себя слишком грубой силой, но, опять же, иногда грубая сила - именно то, что нужно. –
Я думаю, что обычный код для этого «снизу вверх», скопируйте все строки, которые должны остаться, заполните остальные пустые строки »- всего 2 индекса для запоминания - текущая строка для записи и текущая строка для чтения (read> = записывать)...Также вы можете удалить одну строку/перерисовку в зависимости от того, что вы хотите показать. –