AlphaZero算法玩游戏《步步为营》(Quoridor)

 

引入

  最近突然想起2个月前做的一个项目,还处于起步阶段,就是利用AlphaZero算法玩一个叫步步为营的游戏,最初写这个项目其实是受人所托,后来初步完成后由于各种原因,打比赛,做项目等等,就一直荒废在那里了。先介绍下这个游戏,中文名叫步步为营,英文名叫Quoridor,这个游戏在中国或许不火,但是以前在国外还是特别火的。属于一款益智类的桌游,大体如下面这个样子:

 

游戏可以由2-4人玩耍,以2人举例,两人处于对立面,每人有一个棋子和十块挡板,回合制进行游戏,每一回合只能走一次,你可以选择移动棋子,也可以选择放一块挡板,但是挡板不能重复用,放完就没了。桌面大小10*9,起初每个人的棋子都在最靠近自己这边的中间位置,走到对面的最后一排,无论哪个位置都算你赢,也就是说对面最后一排9个位置随便哪个都行。

乍一听这个游戏还蛮简单的,其实玩起来很难受,为什么很难受呢?因为你会发现有时候你好不容易靠近对面了,一块挡板过来可能这边就被封死了,必须原路返回绕一大圈才能走,因为规定不能把对手完全堵死,所以出口的位置很关键,你可以把出口留在很刁钻的位置。。这个自己慢慢体会。

下面我写下百度百科上完整的规则:

  • 你可以看到本路径棋横10条、竖8条凹下的路径,20个挡板,四人不同颜色的木人。

  • 游戏开始前,所有玩家(2-4)每人一个小木人,平分所有挡板。

  • 游戏开始,木人放在边路,开始向对岸行驶,谁最先到达对岸者为胜利者。如果玩家为3人或4人,一人胜利之后,其他玩家还可以继续争夺第二名、第三名。你可以在棋盘的任何方向行走,每次只能一步或者放挡板。放挡板的目的是阻挡对方到达对岸,如果选择放挡板的话,木人就不能走路,如果木人走一步,就不能放挡板。需要注意的是,挡板不能把别人完全挡死,也就是说至少要留出一个出口。

  • 当两子相邻的时候可以跳过对面棋子,在对面棋子的另外三个方向上都可以移动,也就是相当于走了两步

用AlphaZero算法实现

  既然阿尔法狗之前闹得这么火,我也来蹭一下热度,用这个算法实现这个游戏,当然我还不确定是否这个算法适合这个游戏,但是效果至少不会很差就是了,个人感觉和A*算法结合起来或许会更加好些,因为这个游戏放了挡板之后就有点寻路的意味在里面了。但是现在先不考虑传统方法了,虽然minmax+AB算法效果就很不错。我也会考虑加在里面最为评测棋力的考量。

设计关键  

其实主要就是设计输入的格式,也就是桌面状态的表示方法,原论文是8次历史棋局,以前还用过人工特征。还有就是网络的设计,这里我不多说了,具体细节可以看我Github项目代码的介绍,写的相对详细一些,项目地址等下给出。

关于代码

代码呢,花费的时间不长,所以不太完善,多进程多线程都没有实现,但是初步已经可以跑通了,这也是一个长期的项目,我写这篇博客也是为了督促我抓紧把这个项目的完善和后续工作提上日程,不然可能就一直荒废在那里了。。现在我看这个项目,实现细节都有点遗忘了。。看来还是老了。不过虽说代码还不完善,但是感兴趣的人也可以训练这个模型了,看看效果了。

项目地址这里 ,对项目感兴趣的可以Star一下,关注我长期的更新,有什么好的建议也可以留言。

 

 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值