翻译Deep Learning and the Game of Go(5)第3章:实现你第一个围棋AI(下)

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的两个实例之间进行完整的游戏。首先,您要定义方便的功能函数,例如在控制台中打印整个棋盘或个人落子。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值