如何使用Python在2秒內(nèi)評估國際象棋位置詳解_第1頁
如何使用Python在2秒內(nèi)評估國際象棋位置詳解_第2頁
如何使用Python在2秒內(nèi)評估國際象棋位置詳解_第3頁
如何使用Python在2秒內(nèi)評估國際象棋位置詳解_第4頁
如何使用Python在2秒內(nèi)評估國際象棋位置詳解_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第如何使用Python在2秒內(nèi)評估國際象棋位置詳解#Cropeachsqureofthechessboardandsavethe64grayscaleimages.Eachimage

#willalignwithaspecificsquareonthechessboard.

foriinrange(8):

forjinrange(8):

im1=im.crop(

(j*(box_width),

i*(box_width),

(j+1)*(box_width-0),

(i+1)*(box_width-0)))

im1.save('pieces//'+str(nn)+'.png')

n+=1

n=myList[i][j]

image=cv2.imread('pieces//'+str(nn)+'.png')

#countthenumberofblackpixelsperimage

BlackPiece=np.sum(image==0)

BlackPixelList.append(BlackPiece)

#countthenumberofwhitepixelsperimage

WhitePiece=np.sum(image==255)

WhitePixelList.append(WhitePiece)

nn+=1

下面的代碼旨在識別每個棋子的黑白像素數(shù)。我已經(jīng)從上面創(chuàng)建了一個包含黑白像素數(shù)量的列表。

對于每種顏色,我執(zhí)行以下操作:

保留唯一的像素值以升序?qū)α斜磉M行排序,并保留六個最大的像素值每個像素值將與BPieces/Wpieces中指定的部分對齊

#Filteroutvaluesequal0andkeepuniquepixelvalues

#sortthelistinascendingorder

#keepthesixlargestpixelvalues

BlackPixelList=set(list(filter(lambdax:x0,BlackPixelList)))

BlackPixelList=list(BlackPixelList)

BlackPixelList.sort()

BlackPixelList=BlackPixelList[-6:]

WhitePixelList=set(list(filter(lambdax:x0,WhitePixelList)))

WhitePixelList=list(WhitePixelList)

WhitePixelList.sort()

WhitePixelList=WhitePixelList[-6:]

#Createadictionaryforeachcolorandassign

#pixelvaluetoeachchesspiece,piecetype,

#andpiececolor(False=Black,True=White).

BlackPieces={}

fori,valinenumerate(BPieces):

BlackPieces[val]=(BlackPixelList[i],BPieceType[i],False)

WhitePieces={}

fori,valinenumerate(WPieces):

WhitePieces[val]=(WhitePixelList[i],WPieceType[i],True)

第7步:為每個棋子分配像素數(shù)。

如果這是第一次運行代碼,請使用步驟6輸出為BlackPieces分配黑色像素數(shù),為WhitePieces分配白色像素數(shù)。下面的代碼以我的顯示器為例。

BlackPieces=\

{'BlackKing':(5028,6,False),

'BlackBishop':(5052,3,False),

'BlackPawn':(5679,1,False),

'BlackRook':(6489,4,False),

'BlackQueen':(6495,5,False),

'BlackKnight':(7623,2,False)}

WhitePieces=\

{'WhiteBishop':(2520,3,True),

'WhiteQueen':(3039,5,True),

'WhiteRook':(3741,4,True),

'WhitePawn':(3933,1,True),

'WhiteKing':(4410,6,True),

'WhiteKnight':(6057,2,True)}

BlackPixelValues=[i[0]foriinlist(BlackPieces.values())]

WhitePixelValues=[i[0]foriinlist(WhitePieces.values())]

第8步:設(shè)置評估棋盤的函數(shù)。

我們已經(jīng)完成了所有的設(shè)置步驟。我們首先將stockfish的等級設(shè)置為3000ELO,并將深度設(shè)置為15。你可以將深度設(shè)置為26,但這會顯著增加處理時間。然后我們創(chuàng)建evaluate_position函數(shù)。該函數(shù)將:

截屏將彩色圖像轉(zhuǎn)換為灰度并保存圖像確定每個棋子在棋盤上的位置,并使用國際象棋庫將這些棋子放置在棋盤上的適當位置將該回合分配給指定的顏色。默認是輪到白棋。根據(jù)國際象棋庫中的位置分配stockfish中的FEN位置生成請求的輸出

stockfish.set_elo_rating(3000)

stockfish.set_depth(15)

defevaluate_position(white_turn=True,board_flipped=is_board_flipped):

start_time=time.time()

#takeascreenshotoftheboard

take_screenshot('image1.png')

image=cv2.imread('image1.png')

gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)

cv2.imwrite('grayimage.png',gray)

im=Image.open('grayimage.png')

#SetuptheboardfromtheChesslibrary

board=chess.Board()

#Removeallthepiecesbecausetheywillbespecifiedinthenextstep

board.clear()

#SettheturntoWhitetoplay,unlessotherwisespecified

board.turn=white_turn

nn=0;

foriinrange(8):

forjinrange(8):

im1=im.crop((j*(box_width),i*(box_width),(j+1)*(box_width-0),(i+1)*(box_width-0)))

im1.save('pieces//'+str(nn)+'.png')

n+=1

n=myList[i][j]

#Readeachcroppedchesssquareandidentifythechesspieceandcolor.

image=cv2.imread('pieces//'+str(nn)+'.png')

BlackPiece=np.sum(image==0)

WhitePiece=np.sum(image==255)

res_val=(0,0,True)

ifBlackPiecemin(BlackPixelValues)-50:

#Identifythechesspiecebasedonhenumberofblackpixelsclosesttothe

#valuesfromtheBlackPiecesdictionary.

col_key,res_val=min(BlackPieces.items(),key=lambdax:abs(BlackPiece-x[1][0]))

ifWhitePiecemin(WhitePixelValues)-50:

#Identifythechesspiecebasedonhenumberofwhitepixelsclosesttothe

#valuesfromtheBlackPiecesdictionary.

col_key,res_val=min(WhitePieces.items(),key=lambdax:abs(WhitePiece-x[1][0]))

#setthechesspieceontheboardbasedonitposition,piecetype,andcolor.

board.set_piece_at(n,piece=chess.Piece(piece_type=res_val[1],color=res_val[2]))

nn+=1

#createtheFENbasedonthecurrentposition

turn_fen='w--10'ifboard.turn==Trueelse'b--01'

current_fen=board.board_fen()+turn_fen

#AssignthepostioninStockfishbasedonFEN

stockfish.set_fen_position(current_fen)

#Getthetopmoves

top_moves=stockfish.get_top_moves()

#Getthebestmove

my_move=top_moves[0]['Move']

#Movethechesspiecebasedonthebestmove

board.push(chess.Move.from_uci(my_move))

#Createoutput

print('Time:',time.time()-start_time)

print('BestMove:',my_move)

print('Evaluation:',stockfish.get_evaluation())

print('Topmoves:')

foriintop_moves:

print(i)

ifboard_flipped:

board.apply_transform(chess.flip_vertical)

board.apply_transform(chess.flip_horizontal)

display(board)

else:

display(board)

第9步:運行棋盤評估。

恭喜,你完成了!指定是輪到白(設(shè)置white_turn=True)還是輪到黑(white_turn=False)并運行評估函數(shù)。該函數(shù)將輸出:

Time:運行函數(shù)所花費的時間BestMo

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論