#!/usr/bin/Anaconda3/python
# -*- coding: utf-8 -*-
class Board(object):
"""
Board 黑白棋棋盘,规格是8*8,黑棋用 X 表示,白棋用 O 表示,未落子时用 . 表示。
"""
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' # 白棋棋子
def __getitem__(self, index):
"""
添加Board[][] 索引语法
:param index: 下标索引
:return:
"""
return self._board[index]
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(board)
print(str(i + 1), ' '.join(board[i]))
if (not step_time) or (not total_time):
# 棋盘初始化时展示的时间
step_time = {"X": 0, "O": 0}
total_time = {"X": 0, "O": 0}
print("统计棋局: 棋子总数 / 每一步耗时 / 总时间 ")
print("黑 棋: " + str(self.count('X')) + ' / ' + str(step_time['X']) + ' / ' + str(
total_time['X']))
print("白 棋: " + str(self.count('O')) + ' / ' + str(step_time['O']) + ' / ' + str(
total_time['O']) + '\n')
else:
# 比赛时展示时间
print("统计棋局: 棋子总数 / 每一步耗时 / 总时间 ")
print("黑 棋: " + str(self.count('X')) + ' / ' + str(step_time['X']) + ' / ' + str(
total_time['X']))
print("白 棋: " + str(self.count('O')) + ' / ' + str(step_time['O']) + ' / ' + str(
total_time['O']) + '\n')
def count(self, color):
"""
统计 color 一方棋子的数量。(O:白棋, X:黑棋, .:未落子状态)
:param color: [O,X,.] 表示棋盘上不同的棋子
:return: 返回 color 棋子在棋盘上的总数
"""
count = 0
for y in range(8):
for x in range(8):
if self._board[x][y] == color:
count += 1
return count
def get_winner(self):
"""
判断黑棋和白旗的输赢,通过棋子的个数进行判断
:return: 0-黑棋赢,1-白旗赢,2-表示平局,黑棋个数和白旗个数相等
"""
# 定义黑白棋子初始的个数
black_count, white_count = 0, 0
for i in range(8):
for j in range(8):
# 统计黑棋棋子的个数
if self._board[i][j] == 'X':
black_count += 1
# 统计白旗棋子的个数
if self._board[i][j] == 'O':
white_count += 1
if black_count > white_count:
# 黑棋胜
return 0, black_count - white_count
elif black_count < white_count:
# 白棋胜
return 1, white_count - black_count
elif black_count == white_count:
# 表示平局,黑棋个数和白旗个数相等
return 2, 0
def _move(self, action, color):
"""
获取反转棋子的坐标
:param action: 落子的坐标 可以是 D3 也可以是(2,3)
:param color: [O,X,.] 表示棋盘上不同的棋子
:return: 返回反转棋子的坐标列表
"""
# 判断action 是不是字符串,如果是则转化为数字坐标
if isinstance(action, str):
action = self.board_num(action)
# 获取 action 坐标的值
x, y = action
# 更改棋盘上 action 坐标处的状态,修改之后该位置属于 color[X,O,.]等三状态
# print("color",color,action)
self._board[x][y] = color
# 将 action 转化为棋盘坐标
action = self.num_board(action)
return self._flip(action, color)
def _flip(self, action, color):
"""
反转棋子 返回反转棋子的坐标列表
:param action: 落子坐标可以是 D3 也可以是(2,3)
:param color: [O,X,.] 表示棋盘上棋子的状态
:return: 返回反转棋子的坐标列表
"""
# 储存反转棋子的数字坐标
flipped_pos = []
# 存储反转棋子的棋盘坐标。比如(2,3)--> D3
flipped_pos_board = []
# 判断action 是不是字符串,如果是则转化为数字坐标
if isinstance(action, str):
action = self.board_num(action)
for line in self._get_lines(action):
for i, p in enumerate(line):
if self._board[p[0]][p[1]] == self.empty:
break
elif self._board[p[0]][p[1]] == color:
flipped_pos.extend(line[:i])
break
for p in flipped_pos:
self._board[p[0]][p[1]] = color
p_board = self.num_board(p)
if p_board not in flipped_pos_board:
flipped_pos_board.append(p_board)
# return flipped_pos
# 反转棋子打印的是棋盘坐标列表
return flipped_pos_board
def backpropagation(self, action, flipped_pos, color):
"""
回溯
:param action: 落子点的坐标
:param flipped_pos: 反转棋子坐标列表
:param color: 棋子的属性,[X,0,.]三种情况
:return:
"""
# 判断action 是不是字符串,如果是则转化为数字坐标
if isinstance(action, str):
action = self.board_num(action)
self._board[action[0]][action[1]] = self.empty
# 如果 color == 'X',则 op_color = 'O';否则 op_color = 'X'
if color == 'X':
op_color = 'O'
else:
op_color = 'X'
for p in flipped_pos:
# 判断一下p是不是数字坐标
# 判断action 是不是字符串,如果是则转化为数字坐标
if isinstance(p, str):
p = self.board_num(p)
self._board[p[0]][p[1]] = op_color
def _get_lines(self, action):
"""
根据 action 落子坐标获取 8 个方向的下标数组
:param action: 落子坐标
:return: 8 个方向坐标
"""
# 判断action 是不是字符串,如果是则转化为数字坐标
if isinstance(action, str):
action = self.board_num(action)
row, col = action
# 生成棋盘坐标
board_coord = [(i, j) for i in range(8) for j in range(8)] # 棋盘坐标
ix = row * 8 + col
# 获取ix // 8 整除,取余
r, c = ix // 8, ix % 8
left = board_coord[r * 8:ix] # 要反转
right = board_coord[ix + 1:(r + 1) * 8]
top = board_coord[c:ix:8] # 要反转
bottom = board_coord[ix + 8:8 * 8:8]
if r <= c:
lefttop = board_coord[c - r:ix:9] # 要反转
rightbottom = board_coord[ix + 9:(7 - (c - r)) * 8 + 7 + 1:9]
else:
lefttop = board_coord[(r - c) * 8:ix:9] # 要反转
rightbottom = board_coord[ix + 9:7 * 8 + (7 - (c - r)) + 1:9]
if r + c <= 7:
leftbottom = board_coord[ix + 7:(r + c) * 8:7]
righttop = board_coord[r + c:ix:7] # 要反转
else:
leftbottom = board_coord[ix + 7:7 * 8 + (r + c) - 7 + 1:7]
righttop = boa

onnx
- 粉丝: 1w+
最新资源
- 金工机械数控自动化实习日志-机械-20篇-每篇300字(1).doc
- 高校计算机应用教学中激励策略的运用(1).docx
- 利用网络与计算机技术改进医院财务管理水平(1).docx
- 有关微型计算机商品买卖合同计算机集成合同计算机集成合同(1).docx
- 刍议我国互联网经济的盈利模式(1).docx
- 信息化手段在农村经济管理中的应用初探(1).docx
- 医学硕士研究生《多元统计方法及程序设计》课程的考核方式改革与(1).docx
- 软件工程文档(1).doc
- 互联网公司岗位晋升模型(1).ppt
- 企业档案管理信息化研究(1).docx
- 互联网金融模式下小微企业的融资问题探讨(1).docx
- 计算机组成与结构第八章(1).ppt
- 【推荐下载】工业网络通信标准之路-我国提议曾被被否定(1).pdf
- 本科毕设论文-—基于plc的全自动包装机系统设计(1).doc
- EN-1Transformer专题培训课件(1).pptx
- 浅析人工智能技术在机械电子工程领域的应用(1).docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈


