当前位置:   article > 正文

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

reversi

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

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):#索引转化为棋盘坐标
		...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

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'  # 白棋棋子
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

__getitem__(self,index)

    def __getitem__(self, index):
        """
        添加Board[][] 索引语法
        :param index: 下标索引
        :return:
        """
        return self._board[index]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/135325?site
推荐阅读
相关标签
  

闽ICP备14008679号