国庆节闲来无事,突然想到儿时玩的五子棋于是打开手机-小程序-欢乐五子棋。下了2把感觉太费脑子了。想到之前有个五子棋引擎,叫羿心。然后开始找官网,找到了尼玛居然官网挂了。于是就上GitHub上面去找,居然有现成的Python开源项目。果断开整,还可以用。这个项目的整体思路是:Python控制adb截图–>OpenCV分析截图–>结果传给YiXin引擎–>Python获取YiXin数据结果在通过adb回传给手机。先上几张图
这是我挂机一下午从1-1段升到9-1段中间测试调整输了2把,遇到几个九段的高手输了几把。
有一个悔棋的截图名字叫regret.jpg
坐着可能忘记放了,随便搞张图片弄成这个名字放进去就行了。项目直接Git下来。打开模拟器或者手机就可以开始了
标题觉得好用可以给原作者的GitHub点个Star吧
GitHub:https://github.com/ChenYun4164/WeChat_GoBang
下面是Randme使用帮助
苦练技术是不可能的,这辈子都练不会,学技术又太枯燥,就只有靠辅助才能维持的生活这样子。
简述
需要的工具主要分为以下三类:
-
Yixin 奕心引擎,这个引擎是国人所作,可以说是非商用版里面最强的五子棋AI
一开始我想使用奕心的界面+引擎那款,因为可定制性足够强,结果发现Python 不好与GUI程序交互,所以就选择了引擎。然而尴尬的一点是,把官方文档翻了个遍都没有找到引擎的使用方法。不过后来在 世界五子棋锦标赛 找到了参加比赛的AI 必备的两种接口。
-
http://petr.lastovicka.sweb.cz/protocl2en.htm 使用输入输出流,本文选择的就是这种方式
-
http://petr.lastovicka.sweb.cz/protocl1en.htm 使用文件
-
-
Python 简单图片处理
-
Python adb 操作手机
思路

整个思路顺下来程序其实是比较好写的,就是前期需要手动的截取匹配图片,设置查找区域像素点位置比较麻烦,不过新添加自适配功能,这些都不需要做。
实现
前期准备
你需要预先掌握的知识:
这个是需要进行适配的参数,除前两项address 和 ip 外,其它在分辨率适配正常的情况下都不需要更改
class mVars:
address='C:/Users/EA/Desktop/yixin/' # 使用到的文件所存放地址
ip = '10.224.133.140:5555' #ip 地址,详见adb模块中adb连接教程
boradOne = 67 #一个相邻落子点的像素间隔
borad = (65,480) #棋盘的初始像素点,用来将图片像素坐标和棋盘坐标互转
confirmBW = (820,1590,820+55,1590+60) #用来确定己方是黑棋还是白棋的区域
confirmWin = (660,1780,660+46,1780+46) #用来确定是否胜利的区域
chickBack = (100,1820) #胜利后 返回图标 的位置
chickBegin = (540,940) #开始匹配 的位置
Yixin 引擎
从官网上可以下载Yixin 引擎,结合 协议 可以知道如何与引擎交互
使用 subprocess 让 python 与 引擎交互
import subprocess as sub
class YiXin:
mYixin = sub.Popen(mVars.address+"Yixin.exe", stdin=sub.PIPE, stdout=sub.PIPE, stderr=sub.PIPE)
#设定参数
def __init__(self):
self.input('START 15')
self.input('INFO timeout_match 200000')
self.input('INFO timeout_turn 7500') #控制思考快慢
self.output()
print("YiXin ready!!")
#向Yixin 输入对手落子指令
def input(self,str):
print('Human: '+str)
self.mYixin.stdin.write((str+'\n').encode())
self.mYixin.stdin.flush()
#获取Yixin 的输出
def output(self):
#一直获取Yixin 输出,直到落子的指令或其它
while True:
str = bytes.decode(self.mYixin.stdout.readline())
print('YiXin: '+ str,end='')
if ((',' in str) or ('OK' in str)):
break;
self.mYixin.stdout.flush()
if(',' in str):
return str
#新的一局
def restart(self):
self.input('RESTART 15')
self.output()
图片处理
这个模块需要做的事就是处理跟图片相关的,包括比较图片,转换坐标等
关于识别对手落子位置,有两种实现思路:
- 每隔一段时间获取截一张图,对比两张图不同的地方,从而获取对手落点位置。
- 每隔一段时间截一张图,识别图上的所有有棋的位置并保存,然后通过比较,得到对手落子位置。
目前只实现第一种方法,不过使用第二种方法可以从半局开始。
import aircv as ac
class ImageProcess:
#缩放检测的图片
def zoomImage(self,zoom):
img = ac.imread(mVars.address+"confirmb.jpg")
img = ac.cv2.resize(img,(0,0),fx = zoom[0],fy = zoom[1])
ac.cv2.imwrite(mVars.address+'confirmb.jpg',img)
img = ac.imread(mVars.address