蒙特卡洛树搜索-黑白棋(一):黑白棋介绍及棋盘类

本文介绍了如何使用蒙特卡洛树搜索(MCTS)解决黑白棋问题,从黑白棋的基本规则出发,阐述了棋盘类的设计,并讨论了合法落子的条件。文章还提到了游戏结束的判定标准以及测试环节。
摘要由CSDN通过智能技术生成

这是关于蒙特卡洛树搜索解决黑白棋问题的文章,如果你不了解蒙特卡洛树搜索,参看蒙特卡洛树搜索

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
  • 7
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值