【基于机器视觉与深度学习的人机对弈机器人——决策篇】
文章目錄
- 前言
- 一、中國象棋云庫
- 二、網頁URL程序編寫
- 1.引入庫
- 2.代碼實現
- 總結
前言
棋盤識別部分已經在上一篇博客講過了,這篇主要講如何進行決策。
決策,即讓程序、機器人自行決策下一步走什么棋,我這邊想到的方法有三種。第一,使用強化學習,消耗的資源較多;第二,手動編程,對于這樣娛樂、沒有工資的項目,妥妥的不可能;第三,直接調用中國象棋云庫,這也是我要介紹的方法。
工程代碼:https://github.com/darkfan-cheese/Chinese-chess-robot
一、中國象棋云庫
先放地址:中國象棋云庫
https://www.chessdb.cn/query/
其實這網頁不僅僅能夠玩中國象棋,國際象棋也可以,基本操作都差不多。
我們的目的是使用代碼,讓這個云庫幫助我們進行決策。
二、網頁URL程序編寫
1.引入庫
在python中,使用的庫是requests,直接導入
import requests2.代碼實現
網頁api使用的格式為:
http://www.chessdb.cn/chessdb.php?action=[ACTION]{&[OPTION1]=[VALUE1]…&[OPTIONn]=[VALUEn]}
具體的見官方網頁:中國象棋云庫接口說明
但是,在我多次嘗試下發(fā)現,這個api使用有點問題,當然,也可能是我的打開方式不對。我發(fā)現,這個api不能在棋局編碼(FEN碼)后面直接添加多個行棋信息(moves 后面的是行棋信息),這樣:
rnbakabnr/9/1c5c1/p1p1p1p1p/9/9/P1P1P1P1P/1C5C1/9/RNBAKABNR w moves g3g4 h7g7 b2e2 g9e7 f0e1
一步兩步還行,但是多了之后就有bug或者計算不出來,實在是無奈。
不過我們可以通過每次的行棋信息,來更新我們的棋局編碼,這樣我們每次傳入的api只有一步行棋,例如:
rnbakabnr/9/1c4c2/p1p1p3p/9/2P3p2/P3P3P/1CN4CB/9/R1BAKA1NR b moves h9i7
這樣在每次使用api獲得結果后對棋局編碼和行棋編碼進行解碼,解碼完成后,機器人走棋,再更新了棋局,對棋局重新編碼,識別了玩家(人類)的行棋信息后,再向云庫傳輸完整的api,獲取下一步行棋方法。
發(fā)送api命令代碼如下:
def sendw(api_open):api_0 = "http://www.chessdb.cn/chessdb.php?action=querybest&board="url = api_0 + api_open + ' w'print(url+'\n')ret = requests.post(url=url)a = ret.content.decode('utf-8')if 'search' in a:d = a.split('|')c = d[-1]b = c[7:11]print(b)else:b = (a[5:])print(b)return burl變量就是向網頁輸出的命令,字符串的組合而已,在云庫的說明里面有解釋,之后就是使用post發(fā)送命令,ret接受,再解碼,解碼之后,使用判斷來提取我們需要的返回數據,存在b中。
而這段代碼的上級如下:
def compute_walk(api_open='9/9/3k5/9/2b6/4N4/9/1c2B4/4K4/3A5'):result = sendw(api_open=api_open)org = result[:2]tar = result[2:4]dictorg[tar]=dictorg[org]dictorg[org] = '0'return result這段代碼就是對上個函數結果的處理,解析行棋信息(起點與終點)。dictorg是一個棋盤映射字典,存儲的棋局信息。
此外,還有對棋局編碼(FEN)的解碼(fen轉python字典)代碼,由于是我同門完成的,這里只貼代碼。
def inver_list_to_fen(self, ax_i_new):self.stri = ''count = 0inti = 0count_i = []for i in ax_i_new:count += 1inti += 1if i.isdigit():count_i.append(i)else:count_i.append(i)if count_i[inti - 2].isdigit():self.stri += str(count - 1)self.stri += ielse:self.stri += icount = 0self.stri += str(count)if self.stri[-1] == '0':self.stri = self.stri[:-1]return self.stri另外還有棋局編碼轉化為python字典的代碼:
def fen_to_the_dict(self, org_gen):self.ax_9, self.ax_8, self.ax_7, self.ax_6, self.ax_5, self.ax_4, self.ax_3, self.ax_2, self.ax_1, self.ax_0 = org_gen.split('/')self.ax_list_key = ['ax_9', 'ax_8', 'ax_7', 'ax_6','ax_5', 'ax_4', 'ax_3', 'ax_2', 'ax_1', 'ax_0']self.ax_list_value = [self.ax_9, self.ax_8, self.ax_7, self.ax_6,self.ax_5, self.ax_4, self.ax_3, self.ax_2, self.ax_1, self.ax_0]self.ax_dict = dict(zip(self.ax_list_key, self.ax_list_value))dict_key = []non = '0'for j in self.latter_table:for i in range(10):dict_key.append(j + str(i))dictvalue = [non for i in range(0, 90)]self.dictorg = dict(zip(dict_key, dictvalue))self.cal_chess('self.ax_9')self.cal_chess('self.ax_8')self.cal_chess('self.ax_7')self.cal_chess('self.ax_6')self.cal_chess('self.ax_5')self.cal_chess('self.ax_4')self.cal_chess('self.ax_3')self.cal_chess('self.ax_2')self.cal_chess('self.ax_1')self.cal_chess('self.ax_0')return self.dictorg總結
總的來說,實現決策的步驟就是:
1.解析棋局信息,轉換成FEN碼。
2.學習中國象棋云庫api的使用方法
3.將棋局編碼填入api命令,獲取返回值
4.根據返回值操縱機械臂行棋落子
5.更新棋局信息,等待下一步行棋
總結
以上是生活随笔為你收集整理的【基于机器视觉与深度学习的人机对弈机器人——决策篇】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1034. 有理数四则运算(20)
- 下一篇: 第5章 Python 数字图像处理(DI