Подсчет пробелов для ии тетриса в python

#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.