自从上次写了一个h5版本的自动代打,识别准确度非常高,就有了想写一个手机app版本的试试,最近刚好碰上了疫情被困,闲来无事,ny就做出了一个跑得快自动代打程序,效果非常好,先睹为快。视频效果在这https://live.csdn.net/v/192063

      说到自动代打就谈到图像识别问题,以前尝试过用按钮精灵进行图像识别处理,效果非常之差,首先就要用到蹩脚的易语言,识别的准确率就只有80%左右,准确率就算是90%对于代打程序来说都是致命的,没法使用。后来得知python的图像识别准确率达99%,那真的是太好了。我就用pc版本的h5程序测试了一下,果真好用,但可惜人工智能部分的训练一直是个迷,其智能效果并不理想,于是就有了采用C++算法处理的非人工智能版本。

      主要分为两部分设计,识别是采用python来做,C++做出牌算法处理,为什么采用C++,是因为python性能上吃不消,而且本来算法也是C++现成的,所以也是顺其自然的事,这里插一句,采用python的好处相当多,功能模块之多如天上牛毛,还有易于使用学习,方便将来扩展,唯一的缺点就是性能低效。关于python如何调用C++这一部分也是进行了两天的学习和测试,才能正常使用,请看代码示例

        from ctypes import *
def dllCall(self,HandCardData,TurnCardData,DiscardData,bPass):

        class tagInPyhonNew(Structure):
            _fields_ = [("cbHandCardData", c_ubyte* 20),
                        ("cbHandCardCount", c_ubyte),
                        ("cbTurnCardData", c_ubyte* 20),
                        ("cbTurnCardCount", c_ubyte ),
                        ("DiscardCard", c_ubyte * 54),
                        ("cbDiscardCardCount", c_ubyte),
                        ("cbRangCardCount", c_ubyte ),
                        ("cbOthreRangCardCount", c_ubyte),
                        ("cbCardCount", c_ubyte),
                        ("cbResultCard", c_ubyte * 20)
                        ]
        pDll = CDLL("./testC++.dll")
        arg1 = tagInPyhonNew()
        tmpHandCard=self.changeDataOut(HandCardData)
        tmpTurnCard=self.changeDataOut(TurnCardData)
        tmpDiscard=self.changeDataOut(DiscardData)
        tmparray=c_ubyte * MAX_COUNT
        tmparray2 = c_ubyte * FULL_COUNT
        arg1.cbHandCardData=tmparray()
        arg1.cbTurnCardData = tmparray()
        arg1.cbResultCard = tmparray()

        arg1.DiscardCard = tmparray2()

        arg1.cbCardCount=0
        arg1.cbOthreRangCardCount=0
        if bPass :
            arg1.cbRangCardCount = 1
        else:
            arg1.cbRangCardCount = 0

        func=pDll.fntestPython2
        result = func(byref(arg1))
        print("action:")
        returnCardData=[]
        for i in range(0,arg1.cbCardCount):
            returnCardData.append(arg1.cbResultCard[i])
            print(arg1.cbResultCard[i])

        return self.changeDataIn(returnCardData)

以上是关于python如何传递结构体和数组的调用C++dll的经典实战代码。

关于识别部分功能,采用的是雷电模拟器下载手机app来进行使用,根据我的使用经验,雷电要比夜神更加稳定好用。这里就采用了4.0版本的雷电模拟器来进行游戏,效果如下

识别的代码细节,看上一篇人工智能跑得快程序代打里面有谈及,这里不再重复。这个版本的识别效果和代打效果都比以往的更上一层楼

       基于这个原理,无论你是扑克,麻将,捕鱼,或者是记牌器,都可以通过这样的方式去实现。这里还有遗憾的地方就是不能在手机上安装使用,只能在pc上使用,不是很方便。关于如何打包到手机上使用也还需要去学习研究,希望懂得将python程序打包成apk供手机使用的朋友私信我,共同交流学习进步。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐