这是关于蒙特卡洛树搜索解决黑白棋问题的文章,如果你不了解蒙特卡洛树搜索,参看蒙特卡洛树搜索
1. 黑白棋简介
黑白棋(Reversi),也叫翻转棋,是一款经典的策略游戏。
一般棋子双面为黑白两色,故称“黑白棋”。因为行棋之时将对方棋子翻转,则变为己方棋子,故又称“翻转棋” (Reversi) 。
它使用 8x8 的棋盘,由两人执黑子和白子轮流下棋,最后子多方为胜方。
2. 游戏规则
- 开始时,黑棋位于D5和E4,白棋位于D4和E5.
- 一个合法的落子:
i) 在空处落子、并翻转对手一个或多个棋子
ii) 新落子位置必须在可以夹住对方的位置上、对方被夹住的棋子翻转。可以是横着夹、竖着夹、对角线夹
iii) 任何被夹住的棋子必须被反过来 - 如果一方没有合法棋步,也就是无论他下在哪里,都无法翻转对方的棋子了,这一轮只能弃权
- 棋局持续知道棋盘填满或双方都没有合法棋步可下
- 如果一方落子时间超过1min,或者连续三次落子不合法,则判断该方失败
3. 棋盘类
board棋盘,规格时8*8,黑棋用X表示、白棋用O表示、空用.
表示。
类中有如下的函数:
class Board(object)
def __init__(self): #初始化函数
...
def __getitem__(self,index): #获取索引处的落子状态
...
def display(self,step_time=None,total_time=None):#显示棋盘
...
def count(self,color):#统计color一方的棋子数量
...
def get_winnner(self):#判断哪一方获胜
...
def _move(self,action,color):#落子
...
def backpropagation(self,action,flipped_pos,color):#回溯
...
def is_on_board(self,x,y):#判断是否越界
...
def _can_fliped(self,action,color):#判断落子是否合法
...
def get_legal_actions(self,color):#获得合法的走法
...
def board_num(self,action):#棋盘左边转化为索引
...
def num_board(self,action):#索引转化为棋盘坐标
...
4.函数具体实现
__init__
def __init__(self):
"""
初始化棋盘状态
"""
self.empty = '.' # 未落子状态
self._board = [[self.empty for _ in range(8)] for _ in range(8)] # 规格:8*8
self._board[3][4] = 'X' # 黑棋棋子
self._board[4][3] = 'X' # 黑棋棋子
self._board[3][3], self._board[4][4] = 'O', 'O' # 白棋棋子
__getitem__(self,index)
def __getitem__(self, index):
"""
添加Board[][] 索引语法
:param index: 下标索引
:return:
"""
return self._board[index]
diaplay
def display(self, step_time=None, total_time=None):
"""
打印棋盘
:param step_time: 每一步的耗时, 比如:{"X":1,"O":0},默认值是None
:param total_time: 总耗时, 比如:{"X":1,"O":0},默认值是None
:return:
"""
board = self._board
# print(step_time,total_time)
# 打印列名
print(' ', ' '.join(list('ABCDEFGH')))
# 打印行名和棋盘
for i in range(8):
# print