我制作了两个非常相似的奥赛罗 AI。在第一个中,板表示为长度为 100 (10x10) 的数组,其中 8x8 板表示在数组的“中间”,数组的其余部分是边缘周围的缓冲区(索引 11 位于左上角8x8 板的一角,索引 88 是右下角)。要在 position 移动index
,我使用以下代码:
changed = [index]
for direction in (1, 9, 10, 11):
shift = index - direction
while board[shift] == opp:
shift -= direction
if board[shift] == player:
changed += [*range(shift + direction, index, direction)]
for direction in (1, 9, 10, 11):
shift = index + direction
while board[shift] == opp:
shift += direction
if board[shift] == player:
changed += [*range(index + direction, shift, direction)]
为了生成移动,然后我检查可能的索引(内部 8x8 板上的图块)并检查是否len(changed) > 1
. 如果是,我将棋盘上的图块设置changed
给该玩家。
在第二个 AI 中,我原以为移动速度会更快,棋盘被表示为两个 64 位的位板——一个用于目标最大化分数的玩家,另一个用于试图最小化分数的玩家。为了采取行动,我使用与此处相同的代码,刚刚转换为 Python:
new_disk = 1 << index
captured = 0
newmy_disks = my_disks | new_disk
for direction in range(8):
x = shift(new_disk, direction) & opp_disks
for i in range(5):
x |= shift(x, direction) & opp_disks
bounding_disk = shift(x, direction) & my_disks
if bounding_disk != 0:
captured_disks |= x
newmy_disks = newmy_disks ^ captured_disks
newopp_disks = opp_disks ^ captured_disks
使用位板表示,玩 1000 个随机游戏大约需要 7 秒,而数组表示需要 4 秒。
如何使位板表示在生成和移动时更快,是否可以检查可能的移动并同时返回新的位板?