3

我制作了两个非常相似的奥赛罗 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 秒。

如何使位板表示在生成和移动时更快,是否可以检查可能的移动并同时返回新的位板?

4

0 回答 0