在 python 中计算俄罗斯方块 ai 的间隙
Counting gaps for a tetris ai in python
我正在尝试在 python(没有遗传算法)
中制作一个简单的俄罗斯方块 ai
我想数一数格子的空隙,据此做出最佳选择。
我所说的空隙是指不清除一些线就无法放置棋子的地方。
我的网格是这样的:
[0, 0, 0, 0, 0]
['#ff0000', ....]
[...]
0代表一个空白space,而十六进制代码代表它被一个块覆盖
我试过这样计算差距:
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]
它再次 returns 3 但我想要它 return 6.
我认为问题在于 and grid[y - 1][x] != 0
只查看当前单元格正上方的单元格,因此第二个示例中底部的 3 个单元格未被计算在内。
我能想到的一个快速解决方法是在计算间隙单元格后将其设置为某个非零值,这样下方的间隙单元格也将被计算在内。 (然后在你完成后将它们设置回 0,如果你在游戏的其余部分使用相同的网格而不是副本。)
问题是您正在“向上”查找是否有拦截器,但您只查找了 一个 行。我想你想重新组织它,所以你迭代列,对于每一列,向下迭代直到你击中 1,然后继续迭代并添加到遇到的每个 0 的间隙计数。
我正在尝试在 python(没有遗传算法)
中制作一个简单的俄罗斯方块 ai我想数一数格子的空隙,据此做出最佳选择。
我所说的空隙是指不清除一些线就无法放置棋子的地方。
我的网格是这样的:
[0, 0, 0, 0, 0]
['#ff0000', ....]
[...]
0代表一个空白space,而十六进制代码代表它被一个块覆盖
我试过这样计算差距:
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]
它再次 returns 3 但我想要它 return 6.
我认为问题在于 and grid[y - 1][x] != 0
只查看当前单元格正上方的单元格,因此第二个示例中底部的 3 个单元格未被计算在内。
我能想到的一个快速解决方法是在计算间隙单元格后将其设置为某个非零值,这样下方的间隙单元格也将被计算在内。 (然后在你完成后将它们设置回 0,如果你在游戏的其余部分使用相同的网格而不是副本。)
问题是您正在“向上”查找是否有拦截器,但您只查找了 一个 行。我想你想重新组织它,所以你迭代列,对于每一列,向下迭代直到你击中 1,然后继续迭代并添加到遇到的每个 0 的间隙计数。