Python控制手机下欢乐五子棋,半天时间1段到9段,90%+的胜率,就无敌

博主利用Python结合Yixin引擎,通过adb控制手机截图和OpenCV分析,实现自动玩欢乐五子棋,半天内从1段升至9段,胜率超过90%。项目包括前期准备、Yixin引擎的使用、图片处理、ADB模块和游戏系统模块的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

国庆节闲来无事,突然想到儿时玩的五子棋于是打开手机-小程序-欢乐五子棋。下了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使用帮助

苦练技术是不可能的,这辈子都练不会,学技术又太枯燥,就只有靠辅助才能维持的生活这样子。

简述

需要的工具主要分为以下三类:

  1. Yixin 奕心引擎,这个引擎是国人所作,可以说是非商用版里面最强的五子棋AI

    一开始我想使用奕心的界面+引擎那款,因为可定制性足够强,结果发现Python 不好与GUI程序交互,所以就选择了引擎。然而尴尬的一点是,把官方文档翻了个遍都没有找到引擎的使用方法。不过后来在 世界五子棋锦标赛 找到了参加比赛的AI 必备的两种接口。

    • http://petr.lastovicka.sweb.cz/protocl2en.htm 使用输入输出流,本文选择的就是这种方式

    • http://petr.lastovicka.sweb.cz/protocl1en.htm 使用文件

  2. Python 简单图片处理

  3. Python adb 操作手机

思路
image-20200329134722139

整个思路顺下来程序其实是比较好写的,就是前期需要手动的截取匹配图片,设置查找区域像素点位置比较麻烦,不过新添加自适配功能,这些都不需要做。

实现
前期准备

你需要预先掌握的知识:

  1. 会运行python 文件,并且安装文中的库
  2. 安装Adb无线连接成功
  3. 在开发者选项里,打开 USB 调试 和 USB允许模拟点击
  4. 修改mVars 里的address 和 ip

这个是需要进行适配的参数,除前两项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()

图片处理

这个模块需要做的事就是处理跟图片相关的,包括比较图片,转换坐标等

关于识别对手落子位置,有两种实现思路:

  1. 每隔一段时间获取截一张图,对比两张图不同的地方,从而获取对手落点位置。
  2. 每隔一段时间截一张图,识别图上的所有有棋的位置并保存,然后通过比较,得到对手落子位置。

目前只实现第一种方法,不过使用第二种方法可以从半局开始。

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
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值