ハッピーバックギャモンの援助

働いていたハード技術は、この生活の中で良い練習することはできませんことはできません。彼らは行かない学ぶ技術は、我々はこのような生活を維持するための支援に依存しています。

ブリーフ

最近、マイクロ文字のアプレット演奏 - ハッピーバックギャモンを、結果は常に虐待、良好なガスああです。私は非常に人気のジャンプジャンプオンラインアシスタンス前にいくつかの時間にヒット。援助のアイデアを実現するために、発見ツールは、現在、十分に持っているために必要な瞬間のための簡単な思考。

必要な工具は、次の3つのカテゴリに分類されます。

  1. 一新李心臓エンジンは、このエンジンは、人々によって作られ、それは最強のバックギャモンAIの非商用版の内側に言うことができます

    これは、公式ウェブサイトですhttps://www.aiexp.info/pages/yixin-cn.html

    カスタマイズが強い十分であり、我々はエンジンを選んだので、プログラムは、バンドと対話するための良いPythonインタフェースではないことがわかったので、最初に私は、使用インタフェース+エンジン李心その段落にしたいと思います。しかし、恥ずかしい、私は公式文書を裏返しにしてエンジンの使用を介して検出されないということです。しかし、その後の世界バックギャモン選手権でhttps://gomocup.org/競争に参加するために必要なAI二つのインターフェースを発見しました。

    http://petr.lastovicka.sweb.cz/protocl2en.htm入力および出力ストリームを使用して、本明細書このように選択されます

    http://petr.lastovicka.sweb.cz/protocl1en.htm使用ファイル

  2. Pythonの簡単な画像処理

  3. PythonのADBは、携帯電話を操作します

思考

以下の全体的なアイデアは、我々は単純なものから複雑なものに上記の順序に従って、各モジュールを導入し始めました。手順ダウンに沿って全体的なアイデアは、書き込み、前に実際に優れて手動で対応する画素位置を参照して、撮影した画像と一致する必要

実現

予備的

私の携帯電話* 1080 1920に、次のエリアパラメータは、例えば、異なる画面の適応は、自分自身を喜ば

class mVars:
    address='C:/Users/EA/Desktop/yixin/' # 使用到的文件所存放地址
    boradOne = 67 #一个相邻落子点的像素间隔
    borad = (65,480) #用来将图片像素坐标和棋盘坐标互转
    confirmBW = (820,1590,820+45,1590+60)#用来确定己方是黑棋还是白棋的区域
    confirmWin = (660,1780,660+46,1780+46)#用来确定是否胜利的区域

これらは、これらの画像を取得する方法のように、絵に準備を事前にすることが必要であるので、時間の背中にテキストの末尾に追加する必要があります、実際には、これらの準備を行い、全体のスケジュールは30%完了しています

画像-20200329105705796
一新エンジン

このエンジンは、公式サイト一新からダウンロードすることができますhttp://gomocup.org/static/download-ai/YIXIN18.zip

組み合わせhttp://petr.lastovicka.sweb.cz/protocl2en.htmエンジンと対話する方法を知っています

私は、このモジュールは、エンジンと、サブプロセスの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 300000')
        self.input('INFO timeout_turn 10000')

        self.output()
        print("YiXin ready!!")

    def input(self,str): #向Yixin 输入对手落子指令
        print('Human: '+str)
        self.mYixin.stdin.write((str+'\n').encode())
        self.mYixin.stdin.flush()

    def output(self):   #获取Yixin 的输出
        #一直获取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()
画像処理

このモジュールは、実行する必要の座標変換、画像関連、比較画像などに対処することです

最初に、2つのアイデアはしばらくライバル配置位置を取得するためのさまざまな場所の二つの絵を比較した断面図を、取得するごとに1つたら、そこにあります。2.すべてのマップ上のチェスのポジションを持っているし、保存を識別し、随時画像をカットしていませんでした、そして比較することによって、相手はLazi位置を取得します。効率上の理由から、私は最初の方法を選択しました。

class ImageProcess:
    #如果匹配成功,则返回中心像素点
    def matchImg(self,imgsrc,imgobj,confidence=0.8):
        coord = None
        res = ac.find_template(imgsrc,imgobj,confidence)
        if res != None:
            coord = (int(res['result'][0]),int(res['result'][1]))
        return coord
    
    #将像素坐标转化为棋盘坐标
    def transformBoard(self,coord):
        x = coord[0]
        y = coord[1]
        xcoord = ycoord = 0
        while x>=mVars.borad[0]:
            x-=mVars.boradOne
            xcoord+=1
        while y>=mVars.borad[1]:
            y-=mVars.boradOne
            ycoord+=1

        return xcoord-1,ycoord-1

    #将棋盘坐标转化为像素坐标
    def transfromScreen(self,coord):
        return (coord[0]*mVars.boradOne+mVars.borad[0],coord[1]*mVars.boradOne+mVars.borad[1])
    
    #对比两张图片的差异
    def difference(self,img1,img2):
        return img1-img2

ADBモジュール

携帯電話でこのモジュールの相互作用が、私は、もちろん、また、有線接続でADBのワイヤレス接続の一片を使用ADB接続のチュートリアルを参照してくださいhttps://github.com/mzlogin/awesome-adb

import os
import time
class Adb:
    #无线连接手机
    def __init__(self):
        os.system('adb connect 1.1.1.1:5555')#ip 示例
        os.system('adb devices')
    #捕获截图
    def capture(self):
        os.system('adb exec-out screencap -p > '+mVars.address+'sc.jpg')
        return ac.imread(mVars.address+'sc.jpg')
    #点击特定位置
    def click(self,piexl):
        os.system('adb shell input tap %d %d'%(piexl[0],piexl[1]))
        time.sleep(0.1)
        os.system('adb shell input tap %d %d'%(piexl[0],piexl[1]))
ゲームシステムモジュール
class System:
    Yixin = YiXin() 
    ImageP = ImageProcess()
    Adb = Adb()
    imgobj = None #用来检测对手落子的图片
    certain = 0 #1表示己方为白,2表示己方为黑
    
    #确认是否胜利
    def confirmWin(self,imgsrc):
        x0,y0,x1,y1 = mVars.confirmWin
        imgsrc = imgsrc[y0:y1,x0:x1]
        imgobj = ac.imread(mVars.address+'confirmwin.jpg')
        return self.ImageP.matchImg(imgsrc,imgobj,0.9)
    
    #确认己方是黑棋还是白棋
    def confirmBW(self,imgsrc):
        x0,y0,x1,y1 = mVars.confirmBW
        imgsrc = imgsrc[y0:y1,x0:x1]

        imgobjw = ac.imread(mVars.address+'confirmw.jpg')
        imgobjb = ac.imread(mVars.address+'confirmb.jpg')
        
        if (self.ImageP.matchImg(imgsrc,imgobjw,0.8) != None):
            self.certain = 1
            self.imgobj=ac.imread(mVars.address+'objb.jpg')
        elif (self.ImageP.matchImg(imgsrc,imgobjb,0.8)!= None):
            self.certain = 2
            self.imgobj=ac.imread(mVars.address+'objw.jpg')
    
    #做好比赛前准备,
    def ready(self):
        while True:
            imgsrc = self.Adb.capture()
            self.confirmBW(imgsrc)
            if(self.certain != 0):
                break;
            print('UnCertain')
            time.sleep(1)
        
        if self.certain == 2:
            self.runCommand('BEGIN')
            return imgsrc
        elif self.certain == 1:
            return ac.imread(mVars.address+'None.jpg')
    
    #向Yixin 输入对方落点,获得Yixin 落点并点击屏幕
    def runCommand(self,COMMAND):
        self.Yixin.input(COMMAND)
        str = self.Yixin.output()
        a = str.find(',')
        b = str.find('\r')

        piexl = self.ImageP.transfromScreen((int(str[0:a]),int(str[a+1:b])))
        # print(piexl)
        self.Adb.click(piexl)
        
    #开始游戏
    def play(self,imgsrc):
        flag=False
        imagep = self.ImageP
        oldimg = newimg = imgsrc
        while self.confirmWin(newimg) == None:
            imgdif = imagep.difference(oldimg,newimg)
            ac.cv2.imwrite(mVars.address+'diff.jpg',imgdif)
            coord = imagep.matchImg(imgdif,self.imgobj)
            # print(coord)
            if(coord != None):
                x, y = imagep.transformBoard(coord)
                COMMAND = "TURN %d,%d"%(x,y)
                self.runCommand(COMMAND)
            
            oldimg,newimg = newimg,self.Adb.capture()
            time.sleep(0.8)
        
    #新一轮游戏
    def newGame(self):
        time.sleep(4)
        os.system('cls')
        os.system('adb shell input tap %d %d'%(100,1820))
        time.sleep(0.5)
        os.system('adb shell input tap %d %d'%(540,940))
        
        self.Yixin.restart()
        self.certain = 0
        self.imgobj = None

主な機能
msys = System()
# n = input("请输入你想玩的局数:")
# for i in range(1,int(n)+1):
while True:
    imgBegin = msys.ready()
    msys.play(imgBegin)
    print("You Win !! Next Game Will Begin After 4sec")
    msys.newGame()

追伸

ここで最後までのすべてのコードは、後でアップロードする前に、リソースを整理するために使用されます。
最高レベルで成功している、手には何の喜びバックギャモンの禁止がないので受賞は、100%ではないので、プレイヤーは時折失う使用した場合、しかしZhiheiを獲得します

おすすめ

転載: www.cnblogs.com/starrys/p/12591415.html