3.4 创建你第一个AI:可以想见的最弱AI
在实现了围棋棋盘和游戏状态类之后,您可以构建您的第一个围棋AI。这个机器人将是一个很弱的玩家,但它将为你的后续所有改进奠定基础。首先,您需要定义所有机器人都要调用的接口,并把定义放入agent文件下中的base.py中。
class Agent:
def __init__(self):
pass
# 根据棋盘盘面状态去选择相应落子
def select_move(self,game_state):
raise NotImplementedError() # 预留一个借口先不实现,让子类去实现
就是这样一种方法,机器人所做的一切都是在当前游戏状态下选择一个落子。当然,在内部,这可能需要十分复杂的操作,如评估目前的棋盘盘面,但玩游戏,这就是我们的机器人永远需要的。
我们的第一个实现将尽可能的弱智:它将随机选择任何有效的移动,并且不去填它自己的真眼。你可以把这个随机AI放在agent下面。回想起第二章,在围棋中,学生的排名通常从30级到1级。按这个比例,你的随机机器人在30级水平,是绝对的初学者。
import random
from dlgo.agent.base import Agent
from dlgo.agent.helpers import is_point_true_eye
from dlgo.goboard_slow import Move
from dlgo.gotypes import Point
# 随机落子AI
class RandomBot(Agent):
def select_move(self, game_state):
# 合法落子集合
valid_moves = []
for r in range(1, game_state.board.num_rows+1):
for c in range(1, game_state.board.num_cols+1):
point = Point(row=r,col=c)
# 保证合法且不是自填眼位
if game_state.is_valid(Move.play(point)) and not is_point_true_eye(point,game_state.current_player):
valid_moves.append(point)
if not valid_moves:
print("over")
return Move.play(random.choice(valid_moves))
现在保证你的agent模块是如下结构(空的_init_py以初始化模块):
dlgo
agent
__init__.py
helpers.py
base.py
naive.py
最后,您可以设置一个驱动程序,在随机落子AI的两个实例之间进行完整的游戏。首先,您要定义方便的功能函数,例如在控制台中打印整个棋盘或个人落子。