python五子棋算法_python五子棋

from functools importwrapsimporttimeimportcsv'''五子棋 Gobang

作者:hhh5460

时间:20181213'''

#1.初始化棋盘#------------

definit_board():'''初始化棋盘

棋盘规格 15*15

如下所示:

board = [[. . . . . . . . . . . . . . .],

[. . . . . . . . . . . . . . .],

[. . . . . . . . . . . . . . .],

[. . . . . . . . . . . . . . .],

[. . . . . . . . . . . . . . .],

[. . . . . . . . . . . . . . .],

[. . . . . . . . . . . . . . .],

[. . . . . . . . . . . . . . .],

[. . . . . . . . . . . . . . .],

[. . . . . . . . . . . . . . .],

[. . . . . . . . . . . . . . .],

[. . . . . . . . . . . . . . .],

[. . . . . . . . . . . . . . .],

[. . . . . . . . . . . . . . .],

[. . . . . . . . . . . . . . .]]

其中:

. – 未被占用

X – 被黑棋占用

O – 被白棋占用'''

print('Init board...')

time.sleep(0.5)

n= 15board= [['.' for _ in range(n)] for _ inrange(n)]returnboard#2.确定玩家,执黑先走#--------------------

defget_player():'''人类玩家选择棋子颜色(黑'X'先走)'''humancolor= input("Enter your color. (ex. 'X' or 'O'):").upper()

computercolor= ['X', 'O'][humancolor == 'X']returncomputercolor, humancolor#3.进入循环#----------

#4.打印棋盘、提示走子#------------------------------

def print_board(board): #ok

'''打印棋盘、比分

开局:

1 2 3 4 5 6 7 8 9 a b c d e f

1 . . . . . . . . . . . . . . .

2 . . . . . . . . . . . . . . .

3 . . . . . . . . . . . . . . .

4 . . . . . . . . . . . . . . .

5 . . . . . . . . . . . . . . .

6 . . . . . . . . . . . . . . .

7 . . . . . . . . . . . . . . .

8 . . . . . . . . . . . . . . .

9 . . . . . . . . . . . . . . .

a . . . . . . . . . . . . . . .

b . . . . . . . . . . . . . . .

c . . . . . . . . . . . . . . .

d . . . . . . . . . . . . . . .

e . . . . . . . . . . . . . . .

f . . . . . . . . . . . . . . .'''axises= list('123456789abcdef')print(' ', ' '.join(axises))for i, v inenumerate(axises):print(v, ' '.join(board[i]))#5.思考走法、放弃终止#--------------------

def get_human_move(board, color): #ok

'''取人类玩家走法'''giveup= True #放弃标志

legal_moves=_get_legal_moves(board, color)#print(','.join([translate_move(move) for move in legal_moves]), len(legal_moves))

whileTrue:

_move= input("Enter your move.(ex.'cd' means row=c col=d):").lower()

move=translate_move(_move)if move inlegal_moves:

giveup= False #不放弃

break

returnmove, giveupdef _get_all_lianxin(board, move, color): #ok

'''取当前点位落子后连星

1.按照棋盘两连、三连、四连的个数 double triple quadra penta'''n=len(board)

uncolor= ['X', 'O'][color == 'X'] #反色

lianxin= [] #连星数,len(lianxin) == 4

directions= ((0,1),(1,0),(1,1),(1,-1)) #东, 南, 东南, 西南

for direction indirections:

dr, dc= direction #步幅

#r, c = move # 起点

count= 1 #连星数,算上起点(落子位置)

jump_count = [0, 0] #顺、反方向跳开一个空格之后的连星数

jump_flag = [False, False] #顺、反方向跳开一个空格的标志

block = [False, False] #顺、反方向是否堵死

#name = ['','']

for i,v in enumerate([1, -1]): #顺、反方向分别用1、-1表示

dr, dc = v*dr, v*dc #步幅

r, c = move[0]+dr, move[1]+dc #先走一步

whileTrue:if not _is_on_board(board, [r, c]) or board[r][c] == uncolor: #不在棋盘内,或对方棋子

block[i] = True #被堵死

break

if board[r][c] == '.': #为空

if not _is_on_board(board, [r+dr, c+dc]) or board[r+dr][c+dc] != color: #且下一格,不在棋盘内、或者非己方棋子

break

if jump_flag[i] == True: #前面已经跳了一格了,则终止

break #能力所限,不考虑又跳一格的情况!!!

else:

jump_flag[i]=Trueelif board[r][c] ==color:if jump_flag[i] ==True:

jump_count[i]+= 1

else:

count+= 1r, c= r + dr, c + dc #步进

lianxin.append([count, jump_count, block])returnlianxindef _move_score(board, move): #ok

'''对该落子位置“打分”

这个逻辑太复杂了,代码又长又臭!!暂时不考虑简化

棋型分值:

0.活五 +100000

1.死五 +100000

2.活四 +10000

3.死四 +1000

4.活三 +1000

5.死三 +100

6.活二 +100

7.死二 +10

8.活一 +10

9.死一 +2

特别说明:

10.跳N 两边棋型分相加 * 上一级分值的20% ?商榷

lianxin == [[2,[0,0],[True,False]],

[1,[0,0],[True,False]],

[3,[1,0],[False,False]],

[3,[2,1],[True,False]]]'''

#死一, 活一, 死二, 活二, 死三, 活三, 死四, 活四, 死五, 活五

scores = [ 2, 10, 10, 100, 100, 1000, 1000, 10000,100000,100000]

sum_score=0for color in ['X','O']:for lianxin in_get_all_lianxin(board, move, color):

count, jump_count, block=lianxinif jump_count[0] > 0 and jump_count[1] > 0: #情况一:两边跳

if block[0] == True and block[1] ==True:if count + jump_count[0] + jump_count[1] + 2 < 5: continue

else:#这边跳了

if block[0] == True: #有跳的,先把分数加了再说(查表加分)

sum_score += scores[jump_count[0]*2-2] #加死的分

sum_score += min(scores[(jump_count[0]+count)*2-2] * 0.2, 200) #上一级的20%

else:

sum_score+= scores[jump_count[0]*2-1] #加活的分

sum_score += min(scores[(jump_count[0]+count)*2-1] * 0.2, 200) #上一级的20%

#这边也跳了

if block[1] == True: #有跳的,先把分数加了再说(查表加分)

sum_score += scores[jump_count[1]*2-2] #加死的分

sum_score += min(scores[(jump_count[1]+count)*2-2] * 0.2, 200) #上一级的20%

else:

sum_score+= scores[jump_count[1]*2-1] #加活的分

sum_score += min(scores[(jump_count[1]+count)*2-1] * 0.2, 200) #上一级的20%

#中间

sum_score += scores[count*2-1] #中间加活的分

elif jump_count[0] > 0 and jump_count[1] == 0: #情况二:有一边跳

if block[0] == True and block[1] ==True:if count + jump_count[0] + jump_count[1] + 1 < 5: continue

else:#跳的这边

if block[0] == True: #先把跳那边的分数加了再说(查表加分)

sum_score += scores[jump_count[0]*2-2] #加死的分

sum_score += min(scores[(jump_count[0]+count)*2-2] * 0.2, 200) #上一级的20%

else:

sum_score+= scores[jump_count[0]*2-1] #加活的分

sum_score += min(scores[(jump_count[0]+count)*2-1] * 0.2, 200) #上一级的20%

#没跳的那边

if block[1] ==True:

sum_score+= scores[count*2-2] #加死的分

else:

sum_score+= scores[count*2-1] #加活的分

elif jump_count[1] > 0 and jump_count[0] == 0: #情况三:另一边跳

if block[0] == True and block[1] ==True:if count + jump_count[0] + jump_count[1] + 1 < 5: continue

else:#跳的这边

if block[1] == True: #先把跳那边的分数加了再说(查表加分)

sum_score += scores[jump_count[1]*2-2] #加死的分

sum_score += min(scores[(jump_count[1]+count)*2-2] * 0.2, 200) #上一级的20%

else:

sum_score+= scores[jump_count[1]*2-1] #加活的分

sum_score += min(scores[(jump_count[1]+count)*2-1] * 0.2, 200) #上一级的20%

#没跳的那边

if block[0] ==True:

sum_score+= scores[count*2-2] #加死的分

else:

sum_score+= scores[count*2-1] #加活的分

elif jump_count[0] == 0 and jump_count[1] == 0: #情况四:两边都没跳

if block[0] and block[1]: #两边都堵死了

if count == 5: #等于5才加,否则不加

sum_score += scores[count*2-2] #-1,-2一样

elif block[0] or block[1]: #只堵死一边

sum_score += scores[count*2-2] #加死的分

else:

sum_score+= scores[count*2-1] #加活的分

returnsum_scoredef _get_center_enmpty_points(board): #ok

'''取中心点附近的空位

从中心点逐圈顺时针扫描,若连续两圈未有棋子,则停止'''n=len(board)

center_point= [n//2, n//2] #中心点[7,7],即'88'

c1= 0 #空圈计数

legal_moves = [] #保存空位

for i in range(8): #从内到外扫描8圈

c2 = True #空圈标志

if i ==0:

points= [[n//2, n//2]]else:#points = [第7-i行] + [第7+i列] + [第7+i行] + [第7-i列] # 从左上开始,顺时针一圈

points = [[7-i,c] for c in range(7-i,7+i)] +\

[[r,7+i] for r in range(7-i,7+i)] +\

[[7+i,c] for c in range(7+i,7-i,-1)] +\

[[r,7-i] for r in range(7+i,7-i,-1)]for point inpoints:if board[point[0]][point[1]] == '.': #遇到空位,则

legal_moves.append(point) #保存点位

else:

c2= False #此圈非空

if c2 == True: #若此圈为空,空圈计数器加1

c1 += 1

if c1 == 2: break

else: #否则,清零

c1 =0return legal_moves #越前,棋盘点位分值越高!

defminimax(board, color, maximizingPlayer, depth):'''极大极小算法

其中:

maximizingPlayer = True #己方

用例:

_, move = minimax(board, 'X', True, 4) # 假设计算机执黑'X'

#参见: https://en.wikipedia.org/wiki/Minimax

function minimax(node, depth, maximizingPlayer) is

if depth = 0 or node is a terminal node then

return the heuristic value of node

if maximizingPlayer then

value := −∞

for each child of node do

value := max(value, minimax(child, depth − 1, FALSE))

return value

else (* minimizing player *)

value := +∞

for each child of node do

value := min(value, minimax(child, depth − 1, TRUE))

return value

(* Initial call *)

minimax(origin, depth, TRUE)'''

pass

defget_computer_move(board, color):'''取计算机玩家走法

计算机走子策略:

1.对所有合法的落子位置逐个“打分”(如何“打分”,决定了计算机下棋的水平)

2.取所有分值最高的落子位置'''

print('Computer is thinking...', end='')

legal_moves=_get_legal_moves(board, color)

scores= [_move_score(board, move) for move inlegal_moves]

max_score= max(scores) #最高分值

best_move =legal_moves[scores.index(max_score)]print("'{}'".format(translate_move(best_move)))returnbest_movedef _is_legal_move(board, move): #ok

'''判断落子位置是否合法

说明:只要在棋盘内,且为空,即合法'''

if _is_on_board(board, move) and board[move[0]][move[1]] == '.':returnTruereturnFalsedef _get_legal_moves(board, color): #ok

'''取当前颜色棋子所有的合法走法

返回格式:[[x1,y1], [x2,y2], ...]'''legal_moves=_get_center_enmpty_points(board)returnlegal_movesdef _is_on_board(board, move): #ok

'''判断点位是否在棋盘范围内'''n=len(board)return move[0] in range(n) and move[1] inrange(n)def translate_move(move): #ok

'''转换坐标

如'1a'可转换为[0,9];又如[9,10]转换为'ab'

此函数,只是为了方便,不是必要的'''axises= list('123456789abcdef')if type(move) is str: #如'cd'

row =axises.index(move[0])

col= axises.index(move[1])

_move= [row, col] #得[2,3]

elif type(move) is list: #如[2,3]

row =axises[move[0]]

col= axises[move[1]]

_move= '{}{}'.format(row, col) #得'cd'

return_move#6.落子#----------

def do_move(board, move, color): #ok

'''在当前位置落子'''

assert board[move[0]][move[1]] == '.'board[move[0]][move[1]] =color#7.判断局面、是否终止#------------------------------

def check_board(board, color): #ok

'''检查棋盘

返回:是否胜利'''n=len(board)

directions= ((0,1),(1,0),(1,1),(1,-1)) #东, 南, 东南, 西南

#四个搜索方向的起点(坐标),分四组。

#形如:[[第1列的点], [第1行的点], [第1列+第1行的点], [第1行+第n列的点]]

all_start_points = [[[i, 0] for i inrange(n)],

[[0, j]for j inrange(n)],

[[i, 0]for i in range(n-4)] + [[0, j] for j in range(1,n-4)], #排除了长度小于5,及重复的情况

[[0, j] for j in range(4,n)] + [[i, n-1] for i in range(1,n-4)]]for direction, start_points inzip(directions, all_start_points):

dr, dc= direction #步幅

for start_point instart_points:

r, c= start_point #起点

count =0while_is_on_board(board, [r, c]):if board[r][c] ==color:

count+= 1

if count == 5:returnTrueelse:

count=0

r, c= r + dr, c + dc #步进

returnFalsedef check_board__(board, color): #废弃!

'''检查棋盘 (不如上面的方式简洁)

返回 是否胜利'''n=len(board)

uncolor= ['X', 'O'][color == 'X'] #反色

#1.行搜索

for i inrange(n):

count=0for j inrange(n):if board[i][j] ==color:

count+= 1

if count == 5:return True #'Winner is ' + color

elif board[i][j] ==uncolor:

count=0#2.列搜索

for j inrange(n):

count=0for i inrange(n):if board[i][j] ==color:

count+= 1

if count == 5:return True #'Winner is ' + color

elif board[i][j] ==uncolor:

count=0#3.斜搜索k=1左上右下

#3.a.k=1对角线上方

for j in range(n-4): #终止列n-4

count =0for i in range(n-j): #终止行n-j

if board[i][j+i] ==color:

count+= 1

if count == 5:returnTrueelif board[i][j+i] ==uncolor:

count=0#3.b.k=1对角线下方

for i in range(1, n-4): #终止行n-4

count =0for j in range(n-i): #终止列n-i

if board[i+j][j] ==color:

count+= 1

if count == 5:returnTrueelif board[i+j][j] ==uncolor:

count=0#4.斜搜索k=-1左下右上

#4.a.k=-1对角线下方

for j in range(n-4): #终止列n-4

count =0for i in range(n-j): #终止行n-j

if board[n-i-1][j+i] ==color:

count+= 1

if count == 5:returnTrueelif board[n-i-1][j+i] ==uncolor:

count=0#4.b.k=-1对角线上方

for j in range(4, n):

count=0for i in range(n-1):if board[i][j-i] ==color:

count+= 1

if count == 5:returnTrueelif board[i][j-i] ==uncolor:

count=0returnFalse#8.游戏结束,返回信息#--------------------

def logging(func): #ok

'''记录游戏相关信息 (装饰器)

包括:

开始时间、比赛耗时、棋盘大小、黑棋玩家、白棋玩家、游戏比分、本局棋谱

保存到reversi.csv文件'''@wraps(func)def wrap(*args, **kwargs):try:

start= time.strftime("%Y%m%d %H:%M:%S", time.localtime()) #开始时间

t1=time.time()

info= func(*args,**kwargs) #棋盘大小、黑棋玩家、白棋玩家、游戏比分、本局棋谱(主程序)

t2 =time.time()

t= int(t2 - t1) #比赛耗时

line= [start, t, *info]

with open('gobang.csv', 'a') as f:

writer= csv.writer(f, lineterminator='\n')

writer.writerow(line)#写入

exceptException as e:pass

returnwrap#==========================================#主函数#==========================================#@logging

def main(): #ok

'''主程序

人机对战

流程:

1.初始化棋盘

2.确定棋手,黑先

3.进入循环

4.打印棋盘,提示走子

5.思考走法,放弃终止

6.落子

7.检查棋盘,是否终止

8.切换棋手

9.游戏结束,返回信息'''

#1.初始化棋盘

board =init_board()#2.确定玩家,执黑先走

computer_color, human_color =get_player()

current_color= 'X'record= '' #棋谱,如'X:ab O:aa X:ba ...'

#3.进入循环

whileTrue:#4.打印棋盘、提示走子

print_board(board)print("Now turn to '{}'...".format(current_color))#5.思考走法,记录棋谱

if current_color ==computer_color:

move=get_computer_move(board, current_color)elif current_color ==human_color:

move, giveup=get_human_move(board, current_color)if giveup == True: break #放弃则终止

record= record + '{}:{}'.format(current_color, translate_move(move)) #录入棋谱

#6.落子

do_move(board, move, current_color)#7.判断局面

done = check_board(board, current_color) #返回终止标志

#7_1.终止

if done ==True:

print_board(board)print("Game over! Winner is '{}'".format(current_color))break

#8.切换棋手

current_color = ['X', 'O'][current_color == 'X']#测试

deftest_get_center_enmpty_points():'''# 1 2 3 4 5 6 7 8 9 a b c d e f

board = [[. . . . . . . . . . . . . . .],#1

[. . . . . . . . . . . . . . .],#2

[. . . . . . . . . . . . . . .],#3

[. . . . . . . . . . . . . . .],#4

[. . . . . . . . . . . . . . .],#5

[. . . . . . . . . . . . . . .],#6

[. . . . . . . . . . . . . . .],#7

[. . . . . . . . . . . . . . .],#8

[. . . . . . . . . . . . . . .],#9

[. . . . . . . . . . . . . . .],#a

[. . . . . . . . . . . . . . .],#b

[. . . . . . . . . . . . . . .],#c

[. . . . . . . . . . . . . . .],#d

[. . . . . . . . . . . . . . .],#e

[. . . . . . . . . . . . . . .]]#f

# 1 2 3 4 5 6 7 8 9 a b c d e f

board = [[. . . . . . . . . . . . . . .],#1

[. . . . . . . . . . . . . . .],#2

[. . . . . . . . . . . . . . .],#3

[. . . . . . . . . . . . . . .],#4

[. . . . . . . . . X . . . . .],#5

[. . . . . . X . . . . . . . .],#6

[. . . . . O . . X O . . . . .],#7

[. . . . . X X O X . . . . . .],#8

[. . . . . X O X . . . . . . .],#9

[. . . . . . . . . . X . . . .],#a

[. . . X . . . . . . . . . . .],#b

[. . X . . . . . . . . . . . .],#c

[. O . . . . . . . . . . . . .],#d

[. . . . . . . . . . . . . . .],#e

[. . . . . . . . . . . . . . .]]#f'''

print('Testing _get_center_enmpty_points()...')#1 2 3 4 5 6 7 8 9 a b c d e f

board = [['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],#1

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],#2

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],#3

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],#4

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],#5

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],#6

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],#7

['.','.','.','.','.','.','.','X','.','.','.','.','.','.','.'],#8

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],#9

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],#a

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],#b

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],#c

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],#d

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],#e

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.']]#f

empty_points =_get_center_enmpty_points(board)

translate_points= [translate_move(move) for move inempty_points]#print(translate_points)

assert translate_points == ['77','78','79','89','99','98','97','87', '66','67','68','69','6a','7a','8a','9a','aa','a9','a8','a7','a6','96','86','76']#1 2 3 4 5 6 7 8 9 a b c d e f

board = [['.','.','.','.','.','.','.','X','.','.','.','.','.','.','.'],#1

['.','.','.','.','.','.','.','X','.','.','.','.','.','.','.'],#2

['.','.','.','.','.','.','.','X','.','.','.','.','.','.','.'],#3

['.','.','.','.','.','.','.','X','.','.','.','.','.','.','.'],#4

['.','.','.','.','.','.','.','X','.','.','.','.','.','.','.'],#5

['.','.','.','.','.','.','.','X','.','.','.','.','.','.','.'],#6

['.','.','.','.','.','.','.','X','.','.','.','.','.','.','.'],#7

['.','.','.','.','.','.','.','X','.','.','.','.','.','.','.'],#8

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],#9

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],#a

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],#b

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],#c

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],#d

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],#e

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.']]#f

empty_points =_get_center_enmpty_points(board)

translate_points= [translate_move(move) for move inempty_points]print(translate_points)assert '11' intranslate_points#1 2 3 4 5 6 7 8 9 a b c d e f

board = [['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],#1

['.','.','.','.','.','.','.','X','.','.','.','.','.','.','.'],#2

['.','.','.','.','.','.','.','X','.','.','.','.','.','.','.'],#3

['.','.','.','.','.','.','.','X','.','.','.','.','.','.','.'],#4

['.','.','.','.','.','.','.','X','.','.','.','.','.','.','.'],#5

['.','.','.','.','.','.','.','X','.','.','.','.','.','.','.'],#6

['.','.','.','.','.','.','.','X','.','.','.','.','.','.','.'],#7

['.','.','.','.','.','.','.','X','.','.','.','.','.','.','.'],#8

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],#9

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],#a

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],#b

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],#c

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],#d

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],#e

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.']]#f

empty_points =_get_center_enmpty_points(board)

translate_points= [translate_move(move) for move inempty_points]print(translate_points)assert '11' intranslate_pointsprint('ok')deftest_move_score():'''_move_score(board, move, color)

# 1 2 3 4 5 6 7 8 9 a b c d e f

board = [[. . . . . . . . . . . . . . .],#1

[. . . . . . . . . . . . . . .],#2

[. . . . . . . . . . . . . . .],#3

[. . . . . . . . . . . . . . .],#4

[. . . . . . . . . . . . . . .],#5

[. . . . . . . . . . . . . . .],#6

[. . . . . . . . . . . . . . .],#7

[. . . . . . . . . . . . . . .],#8

[. . . . . . . . . . . . . . .],#9

[. . . . . . . . . . . . . . .],#a

[. . . . . . . . . . . . . . .],#b

[. . . . . . . . . . . . . . .],#c

[. . . . . . . . . . . . . . .],#d

[. . . . . . . . . . . . . . .],#e

[. . . . . . . . . . . . . . .]]#f

# 1 2 3 4 5 6 7 8 9 a b c d e f

board = [[. . . . . . . . . . . . . . .],#1

[. . . . . . . . . . . . . . .],#2

[. . . . . . . . . . . . . . .],#3

[. . . . . . . . . . . . . . .],#4

[. . . . . . . . . X . . . . .],#5

[. . . . . . X . . . . . . . .],#6

[. . . . . O . . X O . . . . .],#7

[. . . . . X X O X . . . . . .],#8

[. . . . . X O X . . . . . . .],#9

[. . . . . . . . . . X . . . .],#a

[. . . X . . . . . . . . . . .],#b

[. . X . . . . . . . . . . . .],#c

[. O . . . . . . . . . . . . .],#d

[. . . . . . . . . . . . . . .],#e

[. . . . . . . . . . . . . . .]]#f'''

print('Testing _move_score()...')#1 2 3 4 5 6 7 8 9 a b c d e f

board = [['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],#1

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],#2

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],#3

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],#4

['.','.','.','.','.','.','.','.','.','X','.','.','.','.','.'],#5

['.','.','.','.','.','.','X','.','.','.','.','.','.','.','.'],#6

['.','.','.','.','.','O','.','.','X','O','.','.','.','.','.'],#7

['.','.','.','.','.','X','X','O','X','.','.','.','.','.','.'],#8

['.','.','.','.','.','X','O','X','.','.','.','.','.','.','.'],#9

['.','.','.','.','.','.','.','.','.','.','X','.','.','.','.'],#a

['.','.','.','X','.','.','.','.','.','.','.','.','.','.','.'],#b

['.','.','X','.','.','.','.','.','.','.','.','.','.','.','.'],#c

['.','O','.','.','.','.','.','.','.','.','.','.','.','.','.'],#d

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],#e

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.']]#f

#[count, jump_count, block] # 东, 南, 东南, 西南

lianxin = _get_all_lianxin(board, [6,7], 'X')#print(lianxin)

assert lianxin == [[2,[0,0],[True,False]],

[1,[0,0],[True,False]],

[3,[1,0],[False,False]],

[3,[2,1],[True,False]]]#死一, 活一, 死二, 活二, 死三, 活三, 死四, 活四, 死五, 活五

scores = [ 2, 10, 10, 100, 100, 1000, 1000, 10000,100000,100000]assert _move_score(board, [6,7], 'X') == 10 + 2 + (1000 + 10 + 200) + (1000 + 10 + 10 + 200 + 200)print('ok')deftest_get_all_lianxin():'''get_all_lianxin(board, move, color)

# 1 2 3 4 5 6 7 8 9 a b c d e f

board = [[. . . . . . . . . . . . . . .],#1

[. . . . . . . . . . . . . . .],#2

[. . . . . . . . . . . . . . .],#3

[. . . . . . . . . . . . . . .],#4

[. . . . . . . . . . . . . . .],#5

[. . . . . . . . . . . . . . .],#6

[. . . . . . . . . . . . . . .],#7

[. . . . . . . . . . . . . . .],#8

[. . . . . . . . . . . . . . .],#9

[. . . . . . . . . . . . . . .],#a

[. . . . . . . . . . . . . . .],#b

[. . . . . . . . . . . . . . .],#c

[. . . . . . . . . . . . . . .],#d

[. . . . . . . . . . . . . . .],#e

[. . . . . . . . . . . . . . .]]#f

# 1 2 3 4 5 6 7 8 9 a b c d e f

board = [[. . . . . . . . . . . . . . .],#1

[. . . . . . . . . . . . . . .],#2

[. . . . . . . . . . . . . . .],#3

[. . . . . . . . . . . . . . .],#4

[. . . . . . . . . X . . . . .],#5

[. . . . . . X . . . . . . . .],#6

[. . . . . O . . X O . . . . .],#7

[. . . . . X X O X . . . . . .],#8

[. . . . . X O X . . . . . . .],#9

[. . . . . . . . . . X . . . .],#a

[. . . X . . . . . . . . . . .],#b

[. . X . . . . . . . . . . . .],#c

[. O . . . . . . . . . . . . .],#d

[. . . . . . . . . . . . . . .],#e

[. . . . . . . . . . . . . . .]]#f'''

print('Testing _get_all_lianxin()...')#1 2 3 4 5 6 7 8 9 a b c d e f

board = [['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],#1

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],#2

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],#3

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],#4

['.','.','.','.','.','.','.','.','.','X','.','.','.','.','.'],#5

['.','.','.','.','.','.','X','.','.','.','.','.','.','.','.'],#6

['.','.','.','.','.','O','.','.','X','O','.','.','.','.','.'],#7

['.','.','.','.','.','X','X','O','X','.','.','.','.','.','.'],#8

['.','.','.','.','.','X','O','X','.','.','.','.','.','.','.'],#9

['.','.','.','.','.','.','.','.','.','.','X','.','.','.','.'],#a

['.','.','.','X','.','.','.','.','.','.','.','.','.','.','.'],#b

['.','.','X','.','.','.','.','.','.','.','.','.','.','.','.'],#c

['.','O','.','.','.','.','.','.','.','.','.','.','.','.','.'],#d

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],#e

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.']]#f

#[count, jump_count, block] # 东, 南, 东南, 西南

lianxin = _get_all_lianxin(board, [6,7], 'X')#print(lianxin)

assert lianxin == [[2,[0,0],[True,False]],

[1,[0,0],[True,False]],

[3,[1,0],[False,False]],

[3,[2,1],[True,False]]]#1 2 3 4 5 6 7 8 9 a b c d e f

board = [['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'], #1

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'], #2

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'], #3

['.','.','.','.','.','.','.','.','.','X','.','.','.','.','.'], #4

['.','.','.','.','.','.','X','.','.','.','.','.','.','.','.'], #5

['.','.','.','.','.','O','.','.','X','O','.','.','.','.','.'], #6

['.','.','.','.','.','X','X','O','X','.','.','.','.','.','.'], #7

['.','.','.','.','.','X','O','X','.','.','.','.','.','.','.'], #8

['.','.','.','.','.','.','.','.','.','.','X','.','.','.','.'], #9

['.','.','.','X','.','.','.','.','.','.','.','.','.','.','.'], #a

['.','.','X','.','.','.','.','.','.','.','.','.','.','.','.'], #b

['.','O','.','.','.','.','.','.','.','.','.','.','.','.','.'], #c

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'], #d

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'], #e

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.']] #f

#[count, jump_count, block] # 东, 南, 东南, 西南

lianxin = _get_all_lianxin(board, [5,7], 'X')#print(lianxin)

assert lianxin == [[2,[0,0],[True,False]],

[1,[0,0],[True,False]],

[3,[1,0],[False,False]],

[3,[2,1],[True,False]]]print('ok')deftest_check_board():'''

'''

print('Testing check_board()...')

board= [['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.']]assert check_board(board, 'X') ==False

board= [['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['X','X','X','X','X','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.']]assert check_board(board, 'X') ==True

board= [['X','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['X','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['X','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['X','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['X','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.']]assert check_board(board, 'X') ==True

board= [['.','.','.','.','.','.','.','.','.','.','X','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','X','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','X','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','X','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','X'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.']]assert check_board(board, 'X') ==True

board= [['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['X','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','X','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','X','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','X','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','X','.','.','.','.','.','.','.','.','.','.']]assert check_board(board, 'X') ==True

board= [['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','X'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','X','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','X','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','X','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','X','.','.','.','.']]assert check_board(board, 'X') ==True

board= [['.','.','.','.','X','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','X','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','X','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','X','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['X','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],

['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.']]assert check_board(board, 'X') ==Trueprint('ok')if __name__ == '__main__':

main()#test_check_board()

#test_get_all_lianxin()

#test_move_score()

#test_get_center_enmpty_points()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值