"""
Created on Mon Apr 8 16:42:58 2019
@author: MoMaek
"""
#evaluation:棋盘评估类,给当前棋盘打分
class evaluation(object):
def __init__(self):
self.POS = []
for i in range(15):
row = [(7 - max(abs(i - 7), abs(j - 7))) for j in range(15)]
self.POS.append(tuple(row))
self.POS = tuple(self.POS)
self.STWO = 1 # 冲二
self.STHREE = 2 # 冲三
self.SFOUR = 3 # 冲四
self.TWO = 4 # 活二
self.THREE = 5 # 活三
self.FOUR = 6 # 活四
self.FIVE = 7 # 活五
self.DFOUR = 8 # 双四
self.FOURT = 9 # 四三
self.DTHREE = 10 # 双三
self.NOTYPE = 11
self.ANALYSED = 255 # 已经分析过
self.TODO = 0 # 没有分析过
self.result = [0 for i in range(30)] # 保存当前直线分析值
self.line = [0 for i in range(30)] # 当前直线数据
self.record = [] # 全盘分析结果 [row][col][方向]
for i in range(15):
self.record.append([])
self.record[i] = []
for j in range(15):
self.record[i].append([0, 0, 0, 0])
self.count = [] # 每种棋局的个数:count[黑棋/白棋][模式]
for i in range(3):
data = [0 for i in range(20)]
self.count.append(data)
self.reset()
# 复位数据
def reset(self):
TODO = self.TODO
count = self.count
for i in range(15):
line = self.record[i]
for j in range(15):
line[j][0] = TODO
line[j][1] = TODO
line[j][2] = TODO
line[j][3] = TODO
for i in range(20):
count[0][i] = 0
count[1][i] = 0
count[2][i] = 0
return 0
# 四个方向(水平,垂直,左斜,右斜)分析评估棋盘,再根据结果打分
def evaluate(self, board, turn):
score = self.__evaluate(board, turn)
count = self.count
if score < -9000:
stone = turn == 1 and 2 or 1
for i in range(20):
if count[stone][i] > 0:
score -= i
elif score > 9000:
stone = turn == 1 and 2 or 1
for i in range(20):
if count[turn][i] > 0:
score += i
return score
# 四个方向(水平,垂直,左斜,右斜)分析评估棋盘,再根据结果打分
def __evaluate(self, board, turn):
record, count = self.record, self.count
TODO, ANALYSED = self.TODO, self.ANALYSED
self.reset()
# 四个方向分析
for i in range(15):
boardrow = board[i]
recordrow = record[i]
for j in range(15):
if boardrow[j] != 0:
if recordrow[j][0] == TODO: # 水平没有分析过?
self.__analysis_horizon(board, i, j)
if recordrow[j][1] == TODO: # 垂直没有分析过?
self.__analysis_vertical(board, i, j)
if recordrow[j][2] == TODO: # 左斜没有分析过?
self.__analysis_left(board, i, j)
if recordrow[j][3] == TODO: # 右斜没有分析过
self.__analysis_right(board, i, j)
FIVE, FOUR = self.FIVE, self.FOUR
THREE, TWO = self.THREE, self.TWO
SFOUR, STHREE, STWO = self.SFOUR, self.STHREE, self.STWO
check = {}
# 分别对白棋黑棋计算:FIVE, FOUR, THREE, TWO等出现的次数
for c in (FIVE, FOUR, SFOUR, THREE, STHREE, TWO, STWO):
check[c] = 1
for i in range(15):
for j in range(15):
stone = board[i][j]
if stone != 0:
for k in range(4):
ch = record[i][j][k]
if ch in check:
count[stone][ch] += 1
# 如果有五连则马上返回分数
BLACK, WHITE = 1, 2
if turn == WHITE: # 当前是白棋
if count[BLACK][FIVE]:
return -9999
if count[WHITE][FIVE]:
return 9999
else: # 当前是黑棋
if count[WHITE][FIVE]:
return -9999
if count[BLACK][FIVE]:
return 9999
# 如果存在两个冲四,则相当于有一个活四
if count[WHITE][SFOUR] >= 2:
count[WHITE][FOUR] += 1
if count[BLACK][SFOUR] >= 2:
count[BLACK][FOUR] += 1
# 具体打分
wvalue, bvalue, win = 0, 0, 0
if turn == WHITE:
if count[WHITE][FOUR] > 0: return 9990
if count[WHITE][SFOUR] > 0: return 9980
if count[BLACK][FOUR] > 0: return -9970
if count[BLACK][SFOUR] and count[BLACK][THREE]:
return -9960
if count[WHITE][THREE] and count[BLACK][SFOUR] == 0:
return 9950
if count[BLACK][THREE] > 1 and \
count[WHITE][SFOUR] == 0 and \
count[WHITE][THREE] == 0 and \
count[WHITE][STHREE] == 0:
return -9940
if count[WHITE][THREE] > 1:
wvalue += 2000
elif count[WHITE][THREE]:
wvalue += 200
if count[BLACK][THREE] > 1:
bvalue += 500
elif count[BLACK][THREE]:
bvalue += 100
if count[WHITE][STHREE]:
wvalue += count[WHITE][STHREE] * 10
if count[BLACK][STHREE]:
bvalue += count[BLACK][STHREE] * 10
if count[WHITE][TWO]:
wvalue += count[WHITE][TWO] * 4
if count[BLACK][TWO]:
bvalue += count[BLACK][TWO] * 4
if count[WHITE][STWO]:
wvalue += count[WHITE][STWO]
if count[BLACK][STWO]:
bvalue += count[BLACK][STWO]
else:
if count[BLACK][FOUR] > 0: return 9990
if count[BLACK][SFOUR] > 0: return 9980
if count[WHITE][FOUR] > 0: return -9970
if count[WHITE][SFOUR] and count[WHITE][THREE]:
return -9960
if count[BLACK][THREE] and count[WHITE][SFOUR] == 0:
return 9950
if count[WHITE][THREE] > 1 and \
count[BLACK][SFOUR] == 0 and \
count[BLACK][THREE] == 0 and \
count[BLACK][STHREE] == 0:
return -9940
if count[BLACK][THREE] > 1:
bvalue += 2000
elif count[BLACK][THREE]:
bvalue += 200
if count[WHITE][THREE] > 1:
wvalue += 500
elif count[WHITE][THREE]:
wvalue += 100
if count[BLACK][STHREE]:
bvalue += count[BLACK][STHREE] * 10
if count[WHITE][STHREE]:
wvalue += count[WHITE][STHREE] * 10
if count[BLACK][TWO]:
bvalue += count[BLACK][TWO] * 4
if count[WHITE][TWO]:
wvalue += count[WHITE][TWO] * 4
if count[BLACK][STWO]:
bvalue += count[BLACK][STWO]
if count[WHITE][STWO]:
wvalue += count[WHITE][STWO]
# 加上位置权值,棋盘最中心点权值是7,往外一格-1,最外圈是0
wc, bc = 0, 0
for i in range(15):
for j in range(15):
stone = board[i][j]
if stone != 0: