#python #for-loop #matrix #tetris
Вопрос:
Я пытаюсь создать простой тетрис ai на python(без генетических алгоритмов)
Я хочу посчитать пробелы в сетке и сделать лучший выбор в зависимости от этого.
Под пробелом я подразумеваю место, где вы не сможете разместить фигуру, не очистив некоторые линии.
Моя сетка выглядит примерно так:
[0, 0, 0, 0, 0]
['#ff0000', ....]
[...]
0 представляет собой пустое пространство, в то время как шестнадцатеричный код представляет его, покрытый блоком
Я пытался рассчитать пробелы, подобные этому:
def grid_gaps(grid):
gaps = 0
for x in range(len(grid[0])):
for y in range(len(grid)):
if grid[y][x] == 0 and
(y > 0 and grid[y - 1][x] != 0):
gaps = 1
return gaps
Это хорошо работает, когда сетка такая:
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 1, 1, 0, 0],
[0, 0, 0, 1, 0]
1-это какой-то цвет, он правильно говорит мне, что есть 3 промежутка, но когда сетка выглядит примерно так:
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 1, 1, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 1, 0]
Он снова возвращает 3, но я хочу, чтобы он вернул 6.
Комментарии:
1. Можете ли вы объяснить, что вы подразумеваете под «пробелом»?
2. @Марк Лавин, Где вы не сможете разместить фрагмент, не очистив некоторые строки, я соответствующим образом отредактирую свой вопрос
3. Извините, я веду себя глупо… Является ли «пробел» количеством квадратов, или количеством блоков квадратов, или чем-то еще? И… предполагаем ли мы, что фигуры состоят из одного квадрата?
4. @Марк Лавин, мой друг, это просто блок(или ячейка) в сетке. И каждая фигура в тетрисе занимает четыре клетки. Таким образом, пробел будет пустым квадратом, который нельзя закрыть, не очистив некоторые линии.
Ответ №1:
Я думаю, что проблема в том, что and grid[y - 1][x] != 0
вы смотрите только на ячейку непосредственно над текущей ячейкой, поэтому ваши нижние 3 ячейки во втором примере не учитываются.
Одно быстрое решение, которое я могу придумать,-это установить ячейку зазора на некоторое ненулевое значение после ее подсчета, таким образом, ячейки зазора ниже тоже будут подсчитаны. (Затем установите их обратно на 0 после того, как закончите, если вы используете ту же сетку, а не копию для остальной части игры.)
Комментарии:
1. Мне нравится ваша идея, я использую
deepcopy()
и создам копию и рассмотрю ее, спасибо!
Ответ №2:
Проблема в том, что вы смотрите «вверх», чтобы увидеть, есть ли блокировщик, но вы смотрите только на одну строку. Я думаю, вы хотите реорганизовать это так, чтобы вы перебирали столбцы, и для каждого столбца выполняли итерацию вниз, пока не наберете 1, а затем продолжайте повторять и добавляйте количество пробелов для каждого встречающегося 0.