python使用minimax算法实现五子棋
这是一个命令行环境的五子棋程序。使用了minimax算法。
除了百度各个棋型的打分方式,所有代码皆为本人所撸。本程序结构与之前的井字棋、黑白棋一模一样。
有一点小问题,没时间弄了,就这样吧。
一、效果图
(略)
二、完整代码
fromfunctoolsimportwraps
importtime
importcsv
'''
五子棋Gobang
作者:hhh5460
时间:20181213
'''
#1.初始化棋盘
#------------
definit_board():
'''
初始化棋盘
棋盘规格15*15
如下所示:
board=[[...............],
[...............],
[...............],
[...............],
[...............],
[...............],
[...............],
[...............],
[...............],
[...............],
[...............],
[...............],
[...............],
[...............],
[...............]]
其中:
.–未被占用
X–被黑棋占用
O–被白棋占用
'''
print('Initboard...')
time.sleep(0.5)
n=15
board=[['.'for_inrange(n)]for_inrange(n)]
returnboard
#2.确定玩家,执黑先走
#--------------------
defget_player():
'''
人类玩家选择棋子颜色(黑'X'先走)
'''
humancolor=input("Enteryourcolor.(ex.'X'or'O'):").upper()
computercolor=['X','O'][humancolor=='X']
returncomputercolor,humancolor
#3.进入循环
#----------
#4.打印棋盘、提示走子
#------------------------------
defprint_board(board):#ok
'''
打印棋盘、比分
开局:
123456789abcdef
1...............
2...............
3...............
4...............
5...............
6...............
7...............
8...............
9...............
a...............
b...............
c...............
d...............
e...............
f...............
'''
axises=list('123456789abcdef')
print('',''.join(axises))
fori,vinenumerate(axises):
print(v,''.join(board[i]))
#5.思考走法、放弃终止
#--------------------
defget_human_move(board,color):#ok
'''
取人类玩家走法
'''
giveup=True#放弃标志
legal_moves=_get_legal_moves(board,color)
#print(','.join([translate_move(move)formoveinlegal_moves]),len(legal_moves))
whileTrue:
_move=input("Enteryourmove.(ex.'cd'meansrow=ccol=d):").lower()
move=translate_move(_move)
ifmoveinlegal_moves:
giveup=False#不放弃
break
returnmove,giveup
def_get_all_lianxin(board,move,color):#ok
'''
取当前点位落子后连星
1.按照棋盘两连、三连、四连的个数doubletriplequadrapenta
'''
n=len(board)
uncolor=['X','O'][color=='X']#反色
lianxin=[]#连星数,len(lianxin)==4
directions=((0,1),(1,0),(1,1),(1,-1))#东,南,东南,西南
fordirectionindirections:
dr,dc=direction#步幅
#r,c=move#起点
count=1#连星数,算上起点(落子位置)
jump_count=[0,0]#顺、反方向跳开一个空格之后的连星数
jump_flag=[False,False]#顺、反方向跳开一个空格的标志
block=[False,False]#顺、反方向是否堵死
#name=['','']
fori,vinenumerate([1,-1]):#顺、反方向分别用1、-1表示
dr,dc=v*dr,v*dc#步幅
r,c=move[0]+dr,move[1]+dc#先走一步
whileTrue:
ifnot_is_on_board(board,[r,c])orboard[r][c]==uncolor:#不在棋盘内,或对方棋子
block[i]=True#被堵死
break
ifboard[r][c]=='.':#为空
ifnot_is_on_board(board,[r+dr,c+dc])orboard[r+dr][c+dc]!=color:#且下一格,不在棋盘内、或者非己方棋子
break
ifjump_flag[i]==True:#前面已经跳了一格了,则终止
break#能力所限,不考虑又跳一格的情况!!!
else:
jump_flag[i]=True
elifboard[r][c]==color:
ifjump_flag[i]==True:
jump_count[i]+=1
else:
count+=1
r,c=r+dr,c+dc#步进
lianxin.append([count,jump_count,block])
returnlianxin
def_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=0
forcolorin['X','O']:
forlianxinin_get_all_lianxin(board,move,color):
count,jump_count,block=lianxin
ifjump_count[0]>0andjump_count[1]>0:#情况一:两边跳
ifblock[0]==Trueandblock[1]==True:
ifcount+jump_count[0]+jump_count[1]+2<5:continue
else:
#这边跳了
ifblock[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%
#这边也跳了
ifblock[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]#中间加活的分
elifjump_count[0]>0andjump_count[1]==0:#情况二:有一边跳
ifblock[0]==Trueandblock[1]==True:
ifcount+jump_count[0]+jump_count[1]+1<5:continue
else:
#跳的这边
ifblock[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%
#没跳的那边
ifblock[1]==True:
sum_score+=scores[count*2-2]#加死的分
else:
sum_score+=scores[count*2-1]#加活的分
elifjump_count[1]>0andjump_count[0]==0:#情况三:另一边跳
ifblock[0]==Trueandblock[1]==True:
ifcount+jump_count[0]+jump_count[1]+1<5:continue
else:
#跳的这边
ifblock[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%
#没跳的那边
ifblock[0]==True:
sum_score+=scores[count*2-2]#加死的分
else:
sum_score+=scores[count*2-1]#加活的分
elifjump_count[0]==0andjump_count[1]==0:#情况四:两边都没跳
ifblock[0]andblock[1]:#两边都堵死了
ifcount==5:#等于5才加,否则不加
sum_score+=scores[count*2-2]#-1,-2一样
elifblock[0]orblock[1]:#只堵死一边
sum_score+=scores[count*2-2]#加死的分
else:
sum_score+=scores[count*2-1]#加活的分
returnsum_score
def_get_center_enmpty_points(board):#ok
'''
取中心点附近的空位
从中心点逐圈顺时针扫描,若连续两圈未有棋子,则停止
'''
n=len(board)
center_point=[n//2,n//2]#中心点[7,7],即'88'
c1=0#空圈计数
legal_moves=[]#保存空位
foriinrange(8):#从内到外扫描8圈
c2=True#空圈标志
ifi==0:
points=[[n//2,n//2]]
else:
#points=[第7-i行]+[第7+i列]+[第7+i行]+[第7-i列]#从左上开始,顺时针一圈
points=[[7-i,c]forcinrange(7-i,7+i)]+\
[[r,7+i]forrinrange(7-i,7+i)]+\
[[7+i,c]forcinrange(7+i,7-i,-1)]+\
[[r,7-i]forrinrange(7+i,7-i,-1)]
forpointinpoints:
ifboard[point[0]][point[1]]=='.':#遇到空位,则
legal_moves.append(point)#保存点位
else:
c2=False#此圈非空
ifc2==True:#若此圈为空,空圈计数器加1
c1+=1
ifc1==2:break
else:#否则,清零
c1=0
returnlegal_moves#越前,棋盘点位分值越高!
defminimax(board,color,maximizingPlayer,depth):
'''
极大极小算法
其中:
maximizingPlayer=True#己方
用例:
_,move=minimax(board,'X',True,4)#假设计算机执黑'X'
#参见:https://en.wikipedia.org/wiki/Minimax
functionminimax(node,depth,maximizingPlayer)is
ifdepth=0ornodeisaterminalnodethen
returntheheuristicvalueofnode
ifmaximizingPlayerthen
value:=−∞
foreachchildofnodedo
value:=max(value,minimax(child,depth−1,FALSE))
returnvalue
else(*minimizingplayer*)
value:=+∞
foreachchildofnodedo
value:=min(value,minimax(child,depth−1,TRUE))
returnvalue
(*Initialcall*)
minimax(origin,depth,TRUE)
'''
pass
defget_computer_move(board,color):
'''
取计算机玩家走法
计算机走子策略:
1.对所有合法的落子位置逐个“打分”(如何“打分”,决定了计算机下棋的水平)
2.取所有分值最高的落子位置
'''
print('Computeristhinking...',end='')
legal_moves=_get_legal_moves(board,color)
scores=[_move_score(board,move)formoveinlegal_moves]
max_score=max(scores)#最高分值
best_move=legal_moves[scores.index(max_score)]
print("'{}'".format(translate_move(best_move)))
returnbest_move
def_is_legal_move(board,move):#ok
'''
判断落子位置是否合法
说明:只要在棋盘内,且为空,即合法
'''
if_is_on_board(board,move)andboard[move[0]][move[1]]=='.':
returnTrue
returnFalse
def_get_legal_moves(board,color):#ok
'''
取当前颜色棋子所有的合法走法
返回格式:[[x1,y1],[x2,y2],...]
'''
legal_moves=_get_center_enmpty_points(board)
returnlegal_moves
def_is_on_board(board,move):#ok
'''
判断点位是否在棋盘范围内
'''
n=len(board)
returnmove[0]inrange(n)andmove[1]inrange(n)
deftranslate_move(move):#ok
'''
转换坐标
如'1a'可转换为[0,9];又如[9,10]转换为'ab'
此函数,只是为了方便,不是必要的
'''
axises=list('123456789abcdef')
iftype(move)isstr:#如'cd'
row=axises.index(move[0])
col=axises.index(move[1])
_move=[row,col]#得[2,3]
eliftype(move)islist:#如[2,3]
row=axises[move[0]]
col=axises[move[1]]
_move='{}{}'.format(row,col)#得'cd'
return_move
#6.落子
#----------
defdo_move(board,move,color):#ok
'''
在当前位置落子
'''
assertboard[move[0]][move[1]]=='.'
board[move[0]][move[1]]=color
#7.判断局面、是否终止
#------------------------------
defcheck_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]foriinrange(n)],
[[0,j]forjinrange(n)],
[[i,0]foriinrange(n-4)]+[[0,j]forjinrange(1,n-4)],#排除了长度小于5,及重复的情况
[[0,j]forjinrange(4,n)]+[[i,n-1]foriinrange(1,n-4)]]
fordirection,start_pointsinzip(directions,all_start_points):
dr,dc=direction#步幅
forstart_pointinstart_points:
r,c=start_point#起点
count=0
while_is_on_board(board,[r,c]):
ifboard[r][c]==color:
count+=1
ifcount==5:
returnTrue
else:
count=0
r,c=r+dr,c+dc#步进
returnFalse
defcheck_board__(board,color):#废弃!
'''
检查棋盘(不如上面的方式简洁)
返回是否胜利
'''
n=len(board)
uncolor=['X','O'][color=='X']#反色
#1.行搜索
foriinrange(n):
count=0
forjinrange(n):
ifboard[i][j]==color:
count+=1
ifcount==5:
returnTrue#'Winneris'+color
elifboard[i][j]==uncolor:
count=0
#2.列搜索
forjinrange(n):
count=0
foriinrange(n):
ifboard[i][j]==color:
count+=1
ifcount==5:
returnTrue#'Winneris'+color
elifboard[i][j]==uncolor:
count=0
#3.斜搜索k=1左上右下
#3.a.k=1对角线上方
forjinrange(n-4):#终止列n-4
count=0
foriinrange(n-j):#终止行n-j
ifboard[i][j+i]==color:
count+=1
ifcount==5:
returnTrue
elifboard[i][j+i]==uncolor:
count=0
#3.b.k=1对角线下方
foriinrange(1,n-4):#终止行n-4
count=0
forjinrange(n-i):#终止列n-i
ifboard[i+j][j]==color:
count+=1
ifcount==5:
returnTrue
elifboard[i+j][j]==uncolor:
count=0
#4.斜搜索k=-1左下右上
#4.a.k=-1对角线下方
forjinrange(n-4):#终止列n-4
count=0
foriinrange(n-j):#终止行n-j
ifboard[n-i-1][j+i]==color:
count+=1
ifcount==5:
returnTrue
elifboard[n-i-1][j+i]==uncolor:
count=0
#4.b.k=-1对角线上方
forjinrange(4,n):
count=0
foriinrange(n-1):
ifboard[i][j-i]==color:
count+=1
ifcount==5:
returnTrue
elifboard[i][j-i]==uncolor:
count=0
returnFalse
#8.游戏结束,返回信息
#--------------------
deflogging(func):#ok
'''
记录游戏相关信息(装饰器)
包括:
开始时间、比赛耗时、棋盘大小、黑棋玩家、白棋玩家、游戏比分、本局棋谱
保存到reversi.csv文件
'''
@wraps(func)
defwrap(*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]
withopen('gobang.csv','a')asf:
writer=csv.writer(f,lineterminator='\n')
writer.writerow(line)#写入
exceptExceptionase:
pass
returnwrap
#==========================================
#主函数
#==========================================
#@logging
defmain():#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:abO:aaX:ba...'
#3.进入循环
whileTrue:
#4.打印棋盘、提示走子
print_board(board)
print("Nowturnto'{}'...".format(current_color))
#5.思考走法,记录棋谱
ifcurrent_color==computer_color:
move=get_computer_move(board,current_color)
elifcurrent_color==human_color:
move,giveup=get_human_move(board,current_color)
ifgiveup==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.终止
ifdone==True:
print_board(board)
print("Gameover!Winneris'{}'".format(current_color))
break
#8.切换棋手
current_color=['X','O'][current_color=='X']
#测试
deftest_get_center_enmpty_points():
'''
#123456789abcdef
board=[[...............],#1
[...............],#2
[...............],#3
[...............],#4
[...............],#5
[...............],#6
[...............],#7
[...............],#8
[...............],#9
[...............],#a
[...............],#b
[...............],#c
[...............],#d
[...............],#e
[...............]]#f
#123456789abcdef
board=[[...............],#1
[...............],#2
[...............],#3
[...............],#4
[.........X.....],#5
[......X........],#6
[.....O..XO.....],#7
[.....XXOX......],#8
[.....XOX.......],#9
[..........X....],#a
[...X...........],#b
[..X............],#c
[.O.............],#d
[...............],#e
[...............]]#f
'''
print('Testing_get_center_enmpty_points()...')
#123456789abcdef
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)formoveinempty_points]
#print(translate_points)
asserttranslate_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']
#123456789abcdef
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)formoveinempty_points]
print(translate_points)
assert'11'intranslate_points
#123456789abcdef
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)formoveinempty_points]
print(translate_points)
assert'11'intranslate_points
print('ok')
deftest_move_score():
'''
_move_score(board,move,color)
#123456789abcdef
board=[[...............],#1
[...............],#2
[...............],#3
[...............],#4
[...............],#5
[...............],#6
[...............],#7
[...............],#8
[...............],#9
[...............],#a
[...............],#b
[...............],#c
[...............],#d
[...............],#e
[...............]]#f
#123456789abcdef
board=[[...............],#1
[...............],#2
[...............],#3
[...............],#4
[.........X.....],#5
[......X........],#6
[.....O..XO.....],#7
[.....XXOX......],#8
[.....XOX.......],#9
[..........X....],#a
[...X...........],#b
[..X............],#c
[.O.............],#d
[...............],#e
[...............]]#f
'''
print('Testing_move_score()...')
#123456789abcdef
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)
assertlianxin==[[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)
#123456789abcdef
board=[[...............],#1
[...............],#2
[...............],#3
[...............],#4
[...............],#5
[...............],#6
[...............],#7
[...............],#8
[...............],#9
[...............],#a
[...............],#b
[...............],#c
[...............],#d
[...............],#e
[...............]]#f
#123456789abcdef
board=[[...............],#1
[...............],#2
[...............],#3
[...............],#4
[.........X.....],#5
[......X........],#6
[.....O..XO.....],#7
[.....XXOX......],#8
[.....XOX.......],#9
[..........X....],#a
[...X...........],#b
[..X............],#c
[.O.............],#d
[...............],#e
[...............]]#f
'''
print('Testing_get_all_lianxin()...')
#123456789abcdef
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)
assertlianxin==[[2,[0,0],[True,False]],
[1,[0,0],[True,False]],
[3,[1,0],[False,False]],
[3,[2,1],[True,False]]]
#123456789abcdef
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)
assertlianxin==[[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('Testingcheck_board()...')
board=[['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.']]
assertcheck_board(board,'X')==False
board=[['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['X','X','X','X','X','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.']]
assertcheck_board(board,'X')==True
board=[['X','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['X','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['X','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['X','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['X','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.']]
assertcheck_board(board,'X')==True
board=[['.','.','.','.','.','.','.','.','.','.','X','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','X','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','X','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','X','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','X'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.']]
assertcheck_board(board,'X')==True
board=[['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['X','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','X','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','X','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','X','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','X','.','.','.','.','.','.','.','.','.','.']]
assertcheck_board(board,'X')==True
board=[['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','X'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','X','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','X','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','X','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','X','.','.','.','.']]
assertcheck_board(board,'X')==True
board=[['.','.','.','.','X','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','X','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','X','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','X','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['X','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.'],
['.','.','.','.','.','.','.','.','.','.','.','.','.','.','.']]
assertcheck_board(board,'X')==True
print('ok')
if__name__=='__main__':
main()
#test_check_board()
#test_get_all_lianxin()
#test_move_score()
#test_get_center_enmpty_points()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。