#! /usr/bin/env python# -*- coding: utf-8 -*-import sys, time
import itertools
#----------------------------------------------------------------------# chessboard: 棋盘类,简单从字符串加载棋局或者导出字符串,判断输赢等#----------------------------------------------------------------------classchessboard(object):def__init__(self, forbidden = 0):
self.__board = [ [ 0for n in range(15) ] for m in range(15) ]
self.__forbidden = forbidden
self.__dirs = ( (-1, 0), (-1, 1), (0, 1), (1, 1), (1, 0), \
(1, -1), (0, -1), (-1, -1) )
self.DIRS = self.__dirs
self.won = {}
# 清空棋盘defreset(self):for j in range(15):
for i in range(15):
self.__board[i][j] = 0return0# 索引器->返回第i行def__getitem__(self, row):return self.__board[row]
# 将棋盘转换成字符串def__str__(self):
text = ' A B C D E F G H I J K L M N O\n'
mark = ('. ', 'O ', 'X ')
nrow = 0for row in self.__board:
line = ''.join([ mark[n] for n in row ])
text += chr(ord('A') + nrow) + ' ' + line
nrow += 1if nrow < 15: text += '\n'return text
# 转成字符串def__repr__(self):return self.__str__()
defget(self, row, col):if row < 0or row >= 15or col < 0or col >= 15:
return0return self.__board[row][col]
defput(self, row, col, x):if row >= 0and row < 15and col >= 0and col < 15:
self.__board[row][col] = x
return0#----------------------------------------------------------------------# 判断输赢,返回0(无输赢),1(白棋赢),2(黑棋赢)# #----------------------------------------------------------------------defcheck(self):
board = self.__board
dirs = ((1, -1), (1, 0), (1, 1), (0, 1))
for i in range(15):
for j in range(15):
if board[i][j] == 0: continue
id = board[i][j]
for d in dirs:#8个方向开始遍历,但是只需要4个
x, y = j, i
count = 0for k in range(5):
if self.get(y, x) != id: break
y += d[0]
x += d[1]
count += 1if count == 5:
self.won = {}
r, c = i, j
for z in range(5):
self.won[(r, c)] = 1
r += d[0]
c += d[1]
return id
return0defis_full(self):return len([1for j in range(15) for i in range(15) if self.__board[i][j]!=0])==0# 返回数组对象defboard(self):return self.__board
# 导出棋局到字符串defdumps(self):import json
board = self.__board
return json.dumps(board)
# 从字符串加载棋局defloads(self, text):import json
print(text)
self.__board = json.loads(text)
return0defload_board(self,other):
self.__board = other
# 输出defshow(self):import os
#os.system('cls')print (' A B C D E F G H I J K L M N O')
mark = ('. ', 'O ', 'X ')
nrow = 0
self.check()
for row in range(15):
print (chr(ord('A') + row),end=' ')
for col in range(15):
ch = self.__board[row][col]
print (mark[ch],end='')
print ()
return0#----------------------------------------------------------------------# evaluation: 棋盘评估类,给当前棋盘打分用#----------------------------------------------------------------------classevaluation(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.last = None
self.STWO = 1# 冲二
self.CSTWO = 12#连冲二
self.CSTHREE = 13#连冲三
self.STHREE = 2# 冲三
self.SFOUR = 3# 冲四
self.TWO = 4# 活二
self.THREE = 5# 活三
self.FOUR = 6# 活四
self.FIVE = 7# 活五
self.NOTYPE = 11
self.ANALYSED = 255# 已经分析过
self.TODO = 0