成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁(yè) > 知識(shí)庫(kù) > 我用Python做個(gè)AI出牌器斗地主把把贏

我用Python做個(gè)AI出牌器斗地主把把贏

熱門(mén)標(biāo)簽:鶴壁手機(jī)自動(dòng)外呼系統(tǒng)違法嗎 B52系統(tǒng)電梯外呼顯示E7 高德地圖標(biāo)注收入咋樣 企業(yè)微信地圖標(biāo)注 地圖標(biāo)注多個(gè) 沈陽(yáng)防封電銷(xiāo)電話(huà)卡 銀川電話(huà)機(jī)器人電話(huà) 怎么辦理400客服電話(huà) 萊蕪電信外呼系統(tǒng)

前言

最近在網(wǎng)上看到一個(gè)有意思的開(kāi)源項(xiàng)目,基于快手團(tuán)隊(duì)開(kāi)發(fā)的開(kāi)源AI斗地主——DouZero做的一個(gè)“成熟”的AI,項(xiàng)目開(kāi)源地址【https://github.com/tianqiraf/DouZero_For_HappyDouDiZhu – tianqiraf】。

今天我們就一起來(lái)學(xué)習(xí)下是如何制作一個(gè)基于DouZero的出牌器,看看AI是如何來(lái)幫助斗地主的!

一、核心功能設(shè)計(jì)

首先這款出牌器是基于DouZero開(kāi)發(fā)的,核心是需要利用訓(xùn)練好的AI模型來(lái)幫住我們,給出最優(yōu)出牌方案。

其次關(guān)于出牌器,先要需要確認(rèn)一個(gè)AI出牌角色,代表我們玩家自己。我們只要給這個(gè)AI輸入玩家手牌和三張底牌。確認(rèn)好地主和農(nóng)民的各個(gè)角色,告訴它三個(gè)人對(duì)應(yīng)的關(guān)系,這樣就可以確定隊(duì)友和對(duì)手。

我們還要將每一輪其他兩人的出牌輸入,這樣出牌器就可以根據(jù)出牌數(shù)據(jù),及時(shí)提供給我們最優(yōu)出牌決策,帶領(lǐng)我們?nèi)〉脛倮?/p>

那么如何獲取三者之間的關(guān)系呢?誰(shuí)是地主?誰(shuí)是農(nóng)民?是自己一人作戰(zhàn)還是農(nóng)民合作?自己玩家的手牌是什么?三張底牌是什么?這些也都需要在開(kāi)局后確認(rèn)好。

大致可以整理出要實(shí)現(xiàn)的核心功能如下:

UI設(shè)計(jì)排版布局

  • 顯示三張底牌
  • 顯示AI角色出牌數(shù)據(jù)區(qū)域,上家出牌數(shù)據(jù)區(qū)域,下家出牌數(shù)據(jù)區(qū)域,本局勝率區(qū)域
  • AI玩家手牌區(qū)域
  • AI出牌器開(kāi)始停止

手牌和出牌數(shù)據(jù)識(shí)別

  • 游戲剛開(kāi)始根據(jù)屏幕位置,截圖識(shí)別AI玩家手牌及三張底牌
  • 確認(rèn)三者之間的關(guān)系,識(shí)別地主和農(nóng)民角色,確認(rèn)隊(duì)友及對(duì)手關(guān)系
  • 識(shí)別每輪三位玩家依次出了什么牌,刷新顯示對(duì)應(yīng)區(qū)域

AI出牌方案輸出

  • 加載訓(xùn)練好的AI模型,初始化游戲環(huán)境
  • 每輪出牌判斷,根據(jù)上家出牌數(shù)據(jù)給出最優(yōu)出牌決策
  • 自動(dòng)刷新玩家剩余手牌和本局勝率預(yù)測(cè)

二、實(shí)現(xiàn)步驟

1. UI設(shè)計(jì)排版布局

根據(jù)上述功能,首先考慮進(jìn)行簡(jiǎn)單的UI布局設(shè)計(jì),使用的是pyqt5。核心設(shè)計(jì)代碼如下:

def setupUi(self, Form):
    Form.setObjectName("Form")
    Form.resize(440, 395)
    font = QtGui.QFont()
    font.setFamily("Arial")
    font.setPointSize(9)
    font.setBold(True)
    font.setItalic(False)
    font.setWeight(75)
    Form.setFont(font)
    self.WinRate = QtWidgets.QLabel(Form)
    self.WinRate.setGeometry(QtCore.QRect(240, 180, 171, 61))
    font = QtGui.QFont()
    font.setPointSize(14)
    self.WinRate.setFont(font)
    self.WinRate.setAlignment(QtCore.Qt.AlignCenter)
    self.WinRate.setObjectName("WinRate")
    self.InitCard = QtWidgets.QPushButton(Form)
    self.InitCard.setGeometry(QtCore.QRect(60, 330, 121, 41))
    font = QtGui.QFont()
    font.setFamily("Arial")
    font.setPointSize(14)
    font.setBold(True)
    font.setWeight(75)
    self.InitCard.setFont(font)
    self.InitCard.setStyleSheet("")
    self.InitCard.setObjectName("InitCard")
    self.UserHandCards = QtWidgets.QLabel(Form)
    self.UserHandCards.setGeometry(QtCore.QRect(10, 260, 421, 41))
    font = QtGui.QFont()
    font.setPointSize(14)
    self.UserHandCards.setFont(font)
    self.UserHandCards.setAlignment(QtCore.Qt.AlignCenter)
    self.UserHandCards.setObjectName("UserHandCards")
    self.LPlayer = QtWidgets.QFrame(Form)
    self.LPlayer.setGeometry(QtCore.QRect(10, 80, 201, 61))
    self.LPlayer.setFrameShape(QtWidgets.QFrame.StyledPanel)
    self.LPlayer.setFrameShadow(QtWidgets.QFrame.Raised)
    self.LPlayer.setObjectName("LPlayer")
    self.LPlayedCard = QtWidgets.QLabel(self.LPlayer)
    self.LPlayedCard.setGeometry(QtCore.QRect(0, 0, 201, 61))
    font = QtGui.QFont()
    font.setPointSize(14)
    self.LPlayedCard.setFont(font)
    self.LPlayedCard.setAlignment(QtCore.Qt.AlignCenter)
    self.LPlayedCard.setObjectName("LPlayedCard")
    self.RPlayer = QtWidgets.QFrame(Form)
    self.RPlayer.setGeometry(QtCore.QRect(230, 80, 201, 61))
    font = QtGui.QFont()
    font.setPointSize(16)
    self.RPlayer.setFont(font)
    self.RPlayer.setFrameShape(QtWidgets.QFrame.StyledPanel)
    self.RPlayer.setFrameShadow(QtWidgets.QFrame.Raised)
    self.RPlayer.setObjectName("RPlayer")
    self.RPlayedCard = QtWidgets.QLabel(self.RPlayer)
    self.RPlayedCard.setGeometry(QtCore.QRect(0, 0, 201, 61))
    font = QtGui.QFont()
    font.setPointSize(14)
    self.RPlayedCard.setFont(font)
    self.RPlayedCard.setAlignment(QtCore.Qt.AlignCenter)
    self.RPlayedCard.setObjectName("RPlayedCard")
    self.Player = QtWidgets.QFrame(Form)
    self.Player.setGeometry(QtCore.QRect(40, 180, 171, 61))
    self.Player.setFrameShape(QtWidgets.QFrame.StyledPanel)
    self.Player.setFrameShadow(QtWidgets.QFrame.Raised)
    self.Player.setObjectName("Player")
    self.PredictedCard = QtWidgets.QLabel(self.Player)
    self.PredictedCard.setGeometry(QtCore.QRect(0, 0, 171, 61))
    font = QtGui.QFont()
    font.setPointSize(14)
    self.PredictedCard.setFont(font)
    self.PredictedCard.setAlignment(QtCore.Qt.AlignCenter)
    self.PredictedCard.setObjectName("PredictedCard")
    self.ThreeLandlordCards = QtWidgets.QLabel(Form)
    self.ThreeLandlordCards.setGeometry(QtCore.QRect(140, 10, 161, 41))
    font = QtGui.QFont()
    font.setPointSize(16)
    self.ThreeLandlordCards.setFont(font)
    self.ThreeLandlordCards.setAlignment(QtCore.Qt.AlignCenter)
    self.ThreeLandlordCards.setObjectName("ThreeLandlordCards")
    self.Stop = QtWidgets.QPushButton(Form)
    self.Stop.setGeometry(QtCore.QRect(260, 330, 111, 41))
    font = QtGui.QFont()
    font.setFamily("Arial")
    font.setPointSize(14)
    font.setBold(True)
    font.setWeight(75)
    self.Stop.setFont(font)
    self.Stop.setStyleSheet("")
    self.Stop.setObjectName("Stop")

    self.retranslateUi(Form)
    self.InitCard.clicked.connect(Form.init_cards)
    self.Stop.clicked.connect(Form.stop)
    QtCore.QMetaObject.connectSlotsByName(Form)

def retranslateUi(self, Form):
    _translate = QtCore.QCoreApplication.translate
    Form.setWindowTitle(_translate("Form", "AI歡樂(lè)斗地主--Dragon少年"))
    self.WinRate.setText(_translate("Form", "勝率:--%"))
    self.InitCard.setText(_translate("Form", "開(kāi)始"))
    self.UserHandCards.setText(_translate("Form", "手牌"))
    self.LPlayedCard.setText(_translate("Form", "上家出牌區(qū)域"))
    self.RPlayedCard.setText(_translate("Form", "下家出牌區(qū)域"))
    self.PredictedCard.setText(_translate("Form", "AI出牌區(qū)域"))
    self.ThreeLandlordCards.setText(_translate("Form", "三張底牌"))
    self.Stop.setText(_translate("Form", "停止"))

2. 手牌和出牌數(shù)據(jù)識(shí)別

接下來(lái)需要所有撲克牌的模板圖片與游戲屏幕特定區(qū)域的截圖進(jìn)行對(duì)比,這樣才能獲取AI玩家手牌、底牌、每一輪出牌、三者關(guān)系(地主、地主上家、地主下家)。

識(shí)別AI玩家手牌及三張底牌:

我們可以截取游戲屏幕,根據(jù)固定位置來(lái)識(shí)別當(dāng)前AI玩家的手牌和三張底牌。核心代碼如下:

# 牌檢測(cè)結(jié)果濾波
def cards_filter(self, location, distance):  
    if len(location) == 0:
        return 0
    locList = [location[0][0]]
    count = 1
    for e in location:
        flag = 1  # “是新的”標(biāo)志
        for have in locList:
            if abs(e[0] - have) = distance:
                flag = 0
                break
        if flag:
            count += 1
            locList.append(e[0])
    return count

# 獲取玩家AI手牌
def find_my_cards(self, pos):
    user_hand_cards_real = ""
    img = pyautogui.screenshot(region=pos)
    for card in AllCards:
        result = pyautogui.locateAll(needleImage='pics/m' + card + '.png', haystackImage=img, confidence=self.MyConfidence)
        user_hand_cards_real += card[1] * self.cards_filter(list(result), self.MyFilter)
    return user_hand_cards_real

# 獲取地主三張底牌
def find_three_landlord_cards(self, pos):
    three_landlord_cards_real = ""
    img = pyautogui.screenshot(region=pos)
    img = img.resize((349, 168))
    for card in AllCards:
        result = pyautogui.locateAll(needleImage='pics/o' + card + '.png', haystackImage=img,
                                     confidence=self.ThreeLandlordCardsConfidence)
        three_landlord_cards_real += card[1] * self.cards_filter(list(result), self.OtherFilter)
    return three_landlord_cards_real

效果如下所示:

地主、地主上家、地主下家:

同理我們可以根據(jù)游戲屏幕截圖,識(shí)別地主的圖標(biāo),確認(rèn)地主角色。核心代碼如下:

# 查找地主角色
def find_landlord(self, landlord_flag_pos):
    for pos in landlord_flag_pos:
        result = pyautogui.locateOnScreen('pics/landlord_words.png', region=pos, confidence=self.LandlordFlagConfidence)
        if result is not None:
            return landlord_flag_pos.index(pos)
    return None

這樣我們就可以得到玩家AI手牌,其他玩家手牌(預(yù)測(cè)),地主三張底牌,三者角色關(guān)系,出牌順序。核心代碼如下:

# 坐標(biāo)
self.MyHandCardsPos = (414, 804, 1041, 59)  # AI玩家截圖區(qū)域
self.LPlayedCardsPos = (530, 470, 380, 160)  # 左側(cè)玩家截圖區(qū)域
self.RPlayedCardsPos = (1010, 470, 380, 160)  # 右側(cè)玩家截圖區(qū)域
self.LandlordFlagPos = [(1320, 300, 110, 140), (320, 720, 110, 140), (500, 300, 110, 140)]  # 地主標(biāo)志截圖區(qū)域(右-我-左)
self.ThreeLandlordCardsPos = (817, 36, 287, 136)      # 地主底牌截圖區(qū)域,resize成349x168

def init_cards(self):
    # 玩家手牌
    self.user_hand_cards_real = ""
    self.user_hand_cards_env = []
    # 其他玩家出牌
    self.other_played_cards_real = ""
    self.other_played_cards_env = []
    # 其他玩家手牌(整副牌減去玩家手牌,后續(xù)再減掉歷史出牌)
    self.other_hand_cards = []
    # 三張底牌
    self.three_landlord_cards_real = ""
    self.three_landlord_cards_env = []
    # 玩家角色代碼:0-地主上家, 1-地主, 2-地主下家
    self.user_position_code = None
    self.user_position = ""
    # 開(kāi)局時(shí)三個(gè)玩家的手牌
    self.card_play_data_list = {}
    # 出牌順序:0-玩家出牌, 1-玩家下家出牌, 2-玩家上家出牌
    self.play_order = 0
    self.env = None
    # 識(shí)別玩家手牌
    self.user_hand_cards_real = self.find_my_cards(self.MyHandCardsPos)
    self.UserHandCards.setText(self.user_hand_cards_real)
    self.user_hand_cards_env = [RealCard2EnvCard[c] for c in list(self.user_hand_cards_real)]
    # 識(shí)別三張底牌
    self.three_landlord_cards_real = self.find_three_landlord_cards(self.ThreeLandlordCardsPos)
    self.ThreeLandlordCards.setText("底牌:" + self.three_landlord_cards_real)
    self.three_landlord_cards_env = [RealCard2EnvCard[c] for c in list(self.three_landlord_cards_real)]
    # 識(shí)別玩家的角色
    self.user_position_code = self.find_landlord(self.LandlordFlagPos)
    if self.user_position_code is None:
        items = ("地主上家", "地主", "地主下家")
        item, okPressed = QInputDialog.getItem(self, "選擇角色", "未識(shí)別到地主,請(qǐng)手動(dòng)選擇角色:", items, 0, False)
        if okPressed and item:
            self.user_position_code = items.index(item)
        else:
            return
    self.user_position = ['landlord_up', 'landlord', 'landlord_down'][self.user_position_code]
    for player in self.Players:
        player.setStyleSheet('background-color: rgba(255, 0, 0, 0);')
    self.Players[self.user_position_code].setStyleSheet('background-color: rgba(255, 0, 0, 0.1);')

    # 整副牌減去玩家手上的牌,就是其他人的手牌,再分配給另外兩個(gè)角色(如何分配對(duì)AI判斷沒(méi)有影響)
    for i in set(AllEnvCard):
        self.other_hand_cards.extend([i] * (AllEnvCard.count(i) - self.user_hand_cards_env.count(i)))
    self.card_play_data_list.update({
        'three_landlord_cards': self.three_landlord_cards_env,
        ['landlord_up', 'landlord', 'landlord_down'][(self.user_position_code + 0) % 3]:
            self.user_hand_cards_env,
        ['landlord_up', 'landlord', 'landlord_down'][(self.user_position_code + 1) % 3]:
            self.other_hand_cards[0:17] if (self.user_position_code + 1) % 3 != 1 else self.other_hand_cards[17:],
        ['landlord_up', 'landlord', 'landlord_down'][(self.user_position_code + 2) % 3]:
            self.other_hand_cards[0:17] if (self.user_position_code + 1) % 3 == 1 else self.other_hand_cards[17:]
    })
    print(self.card_play_data_list)
    # 生成手牌結(jié)束,校驗(yàn)手牌數(shù)量
    if len(self.card_play_data_list["three_landlord_cards"]) != 3:
        QMessageBox.critical(self, "底牌識(shí)別出錯(cuò)", "底牌必須是3張!", QMessageBox.Yes, QMessageBox.Yes)
        self.init_display()
        return
    if len(self.card_play_data_list["landlord_up"]) != 17 or \

        len(self.card_play_data_list["landlord_down"]) != 17 or \

        len(self.card_play_data_list["landlord"]) != 20:
        QMessageBox.critical(self, "手牌識(shí)別出錯(cuò)", "初始手牌數(shù)目有誤", QMessageBox.Yes, QMessageBox.Yes)
        self.init_display()
        return
    # 得到出牌順序
    self.play_order = 0 if self.user_position == "landlord" else 1 if self.user_position == "landlord_up" else 2

效果如下:

3. AI出牌方案輸出

下面我們就需要用到DouZero開(kāi)源的AI斗地主了。DouZero項(xiàng)目地址:https://github.com/kwai/DouZero。我們需要將該開(kāi)源項(xiàng)目下載并導(dǎo)入項(xiàng)目中。

創(chuàng)建一個(gè)AI玩家角色,初始化游戲環(huán)境,加載模型,進(jìn)行每輪的出牌判斷,控制一局游戲流程的進(jìn)行和結(jié)束。核心代碼如下:

# 創(chuàng)建一個(gè)代表玩家的AI
ai_players = [0, 0]
ai_players[0] = self.user_position
ai_players[1] = DeepAgent(self.user_position, self.card_play_model_path_dict[self.user_position])
# 初始化游戲環(huán)境
self.env = GameEnv(ai_players)
# 游戲開(kāi)始
self.start()

def start(self):
    self.env.card_play_init(self.card_play_data_list)
    print("開(kāi)始出牌\n")
    while not self.env.game_over:
        # 玩家出牌時(shí)就通過(guò)智能體獲取action,否則通過(guò)識(shí)別獲取其他玩家出牌
        if self.play_order == 0:
            self.PredictedCard.setText("...")
            action_message = self.env.step(self.user_position)
            # 更新界面
            self.UserHandCards.setText("手牌:" + str(''.join(
                [EnvCard2RealCard[c] for c in self.env.info_sets[self.user_position].player_hand_cards]))[::-1])

            self.PredictedCard.setText(action_message["action"] if action_message["action"] else "不出")
            self.WinRate.setText("勝率:" + action_message["win_rate"])
            print("\n手牌:", str(''.join(
                    [EnvCard2RealCard[c] for c in self.env.info_sets[self.user_position].player_hand_cards])))
            print("出牌:", action_message["action"] if action_message["action"] else "不出", ", 勝率:",
                  action_message["win_rate"])
            while self.have_white(self.RPlayedCardsPos) == 1 or \

                    pyautogui.locateOnScreen('pics/pass.png',
                                             region=self.RPlayedCardsPos,
                                             confidence=self.LandlordFlagConfidence):
                print("等待玩家出牌")
                self.counter.restart()
                while self.counter.elapsed()  100:
                    QtWidgets.QApplication.processEvents(QEventLoop.AllEvents, 50)
            self.play_order = 1
        elif self.play_order == 1:
            self.RPlayedCard.setText("...")
            pass_flag = None
            while self.have_white(self.RPlayedCardsPos) == 0 and \

                    not pyautogui.locateOnScreen('pics/pass.png',
                                                 region=self.RPlayedCardsPos,
                                                 confidence=self.LandlordFlagConfidence):
                print("等待下家出牌")
                self.counter.restart()
                while self.counter.elapsed()  500:
                    QtWidgets.QApplication.processEvents(QEventLoop.AllEvents, 50)
            self.counter.restart()
            while self.counter.elapsed()  500:
                QtWidgets.QApplication.processEvents(QEventLoop.AllEvents, 50)
            # 不出
            pass_flag = pyautogui.locateOnScreen('pics/pass.png',
                                                 region=self.RPlayedCardsPos,
                                                 confidence=self.LandlordFlagConfidence)
            # 未找到"不出"
            if pass_flag is None:
                # 識(shí)別下家出牌
                self.other_played_cards_real = self.find_other_cards(self.RPlayedCardsPos)
            # 找到"不出"
            else:
                self.other_played_cards_real = ""
            print("\n下家出牌:", self.other_played_cards_real)
            self.other_played_cards_env = [RealCard2EnvCard[c] for c in list(self.other_played_cards_real)]
            self.env.step(self.user_position, self.other_played_cards_env)
            # 更新界面
            self.RPlayedCard.setText(self.other_played_cards_real if self.other_played_cards_real else "不出")
            self.play_order = 2
        elif self.play_order == 2:
            self.LPlayedCard.setText("...")
            while self.have_white(self.LPlayedCardsPos) == 0 and \

                    not pyautogui.locateOnScreen('pics/pass.png',
                                                region=self.LPlayedCardsPos,
                                                confidence=self.LandlordFlagConfidence):
                print("等待上家出牌")
                self.counter.restart()
                while self.counter.elapsed()  500:
                    QtWidgets.QApplication.processEvents(QEventLoop.AllEvents, 50)
            self.counter.restart()
            while self.counter.elapsed()  500:
                QtWidgets.QApplication.processEvents(QEventLoop.AllEvents, 50)
            # 不出
            pass_flag = pyautogui.locateOnScreen('pics/pass.png',
                                                 region=self.LPlayedCardsPos,
                                                 confidence=self.LandlordFlagConfidence)
            # 未找到"不出"
            if pass_flag is None:
                # 識(shí)別上家出牌
                self.other_played_cards_real = self.find_other_cards(self.LPlayedCardsPos)
            # 找到"不出"
            else:
                self.other_played_cards_real = ""
            print("\n上家出牌:", self.other_played_cards_real)
            self.other_played_cards_env = [RealCard2EnvCard[c] for c in list(self.other_played_cards_real)]
            self.env.step(self.user_position, self.other_played_cards_env)
            self.play_order = 0
            # 更新界面
            self.LPlayedCard.setText(self.other_played_cards_real if self.other_played_cards_real else "不出")
        else:
            pass

        self.counter.restart()
        while self.counter.elapsed()  100:
            QtWidgets.QApplication.processEvents(QEventLoop.AllEvents, 50)

    print("{}勝,本局結(jié)束!\n".format("農(nóng)民" if self.env.winner == "farmer" else "地主"))
    QMessageBox.information(self, "本局結(jié)束", "{}勝!".format("農(nóng)民" if self.env.winner == "farmer" else "地主"),
                            QMessageBox.Yes, QMessageBox.Yes)
    self.env.reset()
    self.init_display()

到這里,整個(gè)AI斗地主出牌流程基本已經(jīng)完成了。

三、出牌器用法

按照上述過(guò)程,這款A(yù)I出牌器已經(jīng)制作完成了。后面應(yīng)該如何使用呢?如果不想研究源碼,只想使用這款A(yù)I斗地主出牌器,驗(yàn)證下效果,該怎么配置環(huán)境運(yùn)行這個(gè)AI出牌器呢?下面就開(kāi)始介紹。

1. 環(huán)境配置

首先我們需要安裝這些第三方庫(kù),配置相關(guān)環(huán)境,如下所示:

torch==1.9.0
GitPython==3.0.5
gitdb2==2.0.6
PyAutoGUI==0.9.50
PyQt5==5.13.0
PyQt5-sip==12.8.1
Pillow>=5.2.0
opencv-python
rlcard

2. 坐標(biāo)調(diào)整確認(rèn)

我們可以打開(kāi)游戲界面,將游戲窗口模式下最大化運(yùn)行,把AI出牌器程序窗口需要移至右下角,不能遮擋手牌、地主標(biāo)志、底牌、歷史出牌這些關(guān)鍵位置。

其次我們要確認(rèn)屏幕截圖獲取的各個(gè)區(qū)域是否正確。如果有問(wèn)題需要進(jìn)行區(qū)域位置坐標(biāo)調(diào)整。

# 坐標(biāo)
self.MyHandCardsPos = (414, 804, 1041, 59)  # 我的截圖區(qū)域
self.LPlayedCardsPos = (530, 470, 380, 160)  # 左邊截圖區(qū)域
self.RPlayedCardsPos = (1010, 470, 380, 160)  # 右邊截圖區(qū)域
self.LandlordFlagPos = [(1320, 300, 110, 140), (320, 720, 110, 140), (500, 300, 110, 140)]  # 地主標(biāo)志截圖區(qū)域(右-我-左)
self.ThreeLandlordCardsPos = (817, 36, 287, 136)      # 地主底牌截圖區(qū)域,resize成349x168

3. 運(yùn)行測(cè)試

當(dāng)所有環(huán)境配置完成,各區(qū)域坐標(biāo)位置確認(rèn)無(wú)誤之后,下面我們就可以直接運(yùn)行程序,測(cè)試效果啦~

首先我們運(yùn)行AI出牌器程序,打開(kāi)游戲界面,進(jìn)入游戲。當(dāng)玩家就位,手牌分發(fā)完畢,地主身份確認(rèn)之后,我們就可以點(diǎn)擊畫(huà)面中開(kāi)始按鈕,讓AI來(lái)幫助我們斗地主了。

基于這個(gè)DouZero項(xiàng)目做一個(gè)“成熟”的AI,項(xiàng)目開(kāi)源地址【https://github.com/tianqiraf/DouZero_For_HappyDouDiZhu – tianqiraf】。

今天我們就到這里,明天繼續(xù)努力!

如果本篇博客有任何錯(cuò)誤,請(qǐng)批評(píng)指教,不勝感激 !

到此這篇關(guān)于我用Python做個(gè)AI出牌器斗地主把把贏的文章就介紹到這了,更多相關(guān)Python自動(dòng)出牌器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • python對(duì)驗(yàn)證碼降噪的實(shí)現(xiàn)示例代碼
  • 爬蟲(chóng)Python驗(yàn)證碼識(shí)別入門(mén)
  • Python機(jī)器學(xué)習(xí)入門(mén)(一)序章
  • 6個(gè)Python辦公黑科技,助你提升工作效率
  • Python機(jī)器學(xué)習(xí)入門(mén)(三)之Python數(shù)據(jù)準(zhǔn)備
  • 用python寫(xiě)個(gè)顏值評(píng)分器篩選最美主播
  • Python反射機(jī)制實(shí)例講解
  • Python代碼實(shí)現(xiàn)粒子群算法圖文詳解
  • python通過(guò)PyQt5實(shí)現(xiàn)登錄界面的示例代碼
  • Python圖片驗(yàn)證碼降噪和8鄰域降噪

標(biāo)簽:烏魯木齊 呼倫貝爾 安慶 呼倫貝爾 葫蘆島 湘西 銀川 三亞

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《我用Python做個(gè)AI出牌器斗地主把把贏》,本文關(guān)鍵詞  我用,Python,做個(gè),出牌,器,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《我用Python做個(gè)AI出牌器斗地主把把贏》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于我用Python做個(gè)AI出牌器斗地主把把贏的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    唐人社导航福利精品| 国产对白国语对白| wwww在线观看免费视频| 中国男女全黄大片| 国产精品丝袜久久久久久消防器材| 黑人一级大毛片| 久久av秘一区二区三区| 蜜桃成人在线视频| 日韩www在线| jizzjizz中国精品麻豆| 日韩高清欧美高清| 91精品国产一区二区三区动漫| 国产亚洲精品久久久久久豆腐| 成人欧美一区二区三区白人| 国产精品久久久久久久av| 久久成人在线视频| 亚洲天堂1区| 亚洲视频第二页| 欧美国产亚洲精品久久久8v| 91精品天堂| 日韩欧美高清dvd碟片| 婷婷色综合网| 成人亚洲欧美激情在线电影| 妞干网免费在线视频| 欧美亚洲综合在线| 91精品天堂福利在线观看| 日韩黄色免费网站| 黄漫在线播放| 欧美一区=区三区| 日韩国产欧美亚洲| av一区在线| 亚洲电影成人av99爱色| 激情小说 在线视频| 成人18视频| 午夜视频一区二区| 欧美人与物videos另类xxxxx| 2019天天干夜夜操| 欧美性猛交xxxx乱大交少妇| www.黄色av| 亚洲 欧美 综合 另类 中字| 午夜免费电影一区在线观看| 在线欧美亚洲| 91av毛片| 欧美视频日韩视频在线观看| 久青草视频在线播放| www.17c.com喷水少妇| 欧美尤物巨大精品爽| 99久久免费视频.com| 欧美黄色片免费观看| 精品国产视频在线| 玖玖爱在线精品视频| 全黄性性激高免费视频| 欧洲一区二区日韩在线视频观看免费| 第四色播日韩| 天天在线免费视频| 亚洲一区二区三区| jizzjizzxxxx| 欧美日韩激情一区| 中文字幕日韩一区二区不卡| 人妻少妇精品无码专区久久| 国产精品1000| 亚洲一区精彩视频| 你懂得影院夜精品a| 国产农村妇女毛片精品久久麻豆| 欧美日韩亚洲综合一区二区三区激情在线| 热99久久精品| 亚洲视频在线二区| 四虎在线精品| 精品国产自在久精品国产| 大吊一区二区三区| 日本在线视频一区二区三区| 久久久久无码国产精品| 国偷自产av一区二区三区| 精品人在线二区三区| 欧美在线va视频| 亚洲国产精品一区在线观看不卡| 99免费在线观看| av片在线观看永久免费| 久久综合激情| 麻豆一区二区麻豆免费观看| 免费一二一二在线视频| 激情丁香综合| 91麻豆精品国产91久久久久久| 在线黄色国产视频| 成人无码www在线看免费| 91久久久免费一区二区| 亚洲色图 在线视频| 成人在线亚洲| 欧美少妇一区| 中文字幕在线中文字幕日亚韩一区| 香蕉精品999视频一区二区| 日本午夜在线观看| 亚洲第一视频区| 欧美一区二区三区四区视频| 51精品国产人成在线观看| 亚洲色图视频网| 4438x亚洲最大成人网| 欧美日韩精品| 人人妻人人澡人人爽精品欧美一区| 国产成人精品免费视频网站| 日韩精品一区二区av| 亚洲女在线观看| 久久久噜噜噜久久人人看| 一边摸一边做爽的视频17国产| 国产精品乱码一区二区三区| jizz免费看| 香蕉加勒比综合久久| 2018高清国产日本一道国产| 欧美久久久久久久久久久久久| 欧美国产一二三区| 色噜噜狠狠色综合中国| 国产真实乱对白精彩久久| 欧美色综合一区二区三区| 久久福利小视频| 极品美女扒开粉嫩小泬| 精久久久久久| 女人色在线免费视频| 日韩欧美二区三区| 97婷婷涩涩精品一区| 国产精品毛片无遮挡高清| 精品97人妻无码中文永久在线| 欧美亚洲免费高清在线观看| 成人拍拍拍免费视频网站| 丝袜熟女一区二区三区| 男女无套免费视频网站动漫| 天堂网视频在线| 精品少妇v888av| 亚洲一区二区三区网站| 国产xxxx振车| 亚洲午夜久久久影院伊人| 成人午夜视频精品一区| 国产盗摄视频一区二区三区| 91超薄肉色丝袜交足高跟凉鞋| 日本夜爽爽一二区| 91精品国产自产在线老师啪| 刘亦菲久久免费一区二区| 国产精品一区二区小说| 国产一区二区自拍视频| 97在线视频免费看| 国产精品超碰| 亚洲人成在线播放网站岛国| 咪咪网在线视频| 一本色道久久88亚洲综合88| aaa毛片在线观看| 高清国语自产拍免费视频国产| 天堂资源在线视频| 粉嫩欧美一区二区三区高清影视| 黄色一级片在线免费观看| 在线免费观看黄色av| 国产在线www| 免费福利在线视频| 国产精品乱子乱xxxx| 亚洲视频在线播放| 被男同事摸的水好多| 免费看精品久久片| 国产精品久久精品视| 国产成人无码精品久久久性色| 国产综合久久久久久鬼色| 日韩成人免费观看| 国产精品自偷自拍| 成人免费观看视频在线观看| 再深点灬舒服灬太大了添少妇视频| 东京热加勒比无码少妇| 欧美精品成人一区二区三区四区| 欧美性猛片aaaaaaa做受| 亚洲日韩视频| 成年人视频在线免费观看| 亚洲精品中文综合第一页| 日本一区二区三区dvd视频在线| 一本色道久久综合亚洲精品不卡| 欧美专区福利在线| 黄色av日韩| 欧美极品欧美精品欧美图片| 成人性生交大片免费看中文网站| 香蕉成人app免费看片| 国产做受高潮69| 中文字幕av一区二区三区人妻少妇| 久操视频免费在线观看| 国产精品视频一区二区三区| 日本韩国在线视频爽| 无码人妻精品一区二区三区蜜桃91| 久久久久久99久久久精品网站| 亚洲二区视频在线| 国产精品亚洲视频在线观看| 欧美色婷婷久久99精品红桃| 亚洲肉体裸体xxxx137| 欧美日韩国产影院| 国产麻豆91精品| 搡老女人一区二区三区视频tv| 99久久婷婷国产综合精品电影√| 亚洲欧美综合国产精品一区| 成年网站在线看| 国产精品性做久久久久久| 韩国三级在线播放| 亚洲va国产天堂va久久en| 色猫猫成人app| 午夜影院免费看| 一区二区不卡在线视频 午夜欧美不卡在| 超薄肉色丝袜足j调教99| 国内一区在线| 亚洲一区二区久久久久久| 国产成人毛毛毛片| 男人天堂综合网| 成人av午夜电影| 欧美一区二区视频观看视频| 欧美 日韩 国产 一区二区三区| 亚洲无线码一区二区三区| 亚洲区国产区| av在线天堂播放| 精品久久久久久中文字幕| 日本理论片午伦夜理片在线观看| 亚洲熟女乱色一区二区三区久久久| 午夜一区二区三区在线观看| 噜噜噜久久亚洲精品国产品麻豆| 国产精品人成电影在线观看| 男男电影完整版在线观看| 激情av中文字幕| 国产又大又粗又长| 国产亚洲精品一区二区在线观看| 每日更新av在线播放| 成人爱爱网址| 国产在线国偷精品产拍免费yy| 久久大香伊蕉在人线观看热2| 精品电影在线| 精品一区二区三| 久久久久久香蕉网| 自拍偷拍欧美亚洲| 日韩国产精品毛片| 一本久道久久久| 91蝌蚪porny九色| 亚洲伊人伊色伊影伊综合网| 秋霞在线午夜| 丁香花高清视频完整版在线观看| 亚洲小说欧美另类激情| avav在线播放| 最新国产在线观看| 亚洲我射av| 国内露脸中年夫妇交换精品| 国产在线拍揄自揄拍无码| 香港经典三级在线| 欧美人xxxx| 国产精品变态另类虐交| 亚洲欧美日韩在线综合| 亚洲人成人99网站| 亚洲最新在线| 九色porny丨国产首页在线| 亚洲AV无码久久精品国产一区| 最新中文字幕亚洲| 亚洲风情在线资源站| 亚洲精品v欧美精品v日韩精品| 亚洲va欧美va在线观看| 国产亚洲一级高清| 一区二区日韩视频| 菠萝菠萝蜜在线观看| 在线成人免费视频| 一级黄色片在线免费观看| 性欧美xxxx视频在线观看| 夜夜春很很躁夜夜躁| 国产老头和老头xxxx×| 成人免费电影视频| 麻豆精品视频| av网站免费大全| 女囚岛在线观看| 亚洲午夜精品一区二区国产| 国产精品高潮在线| 中文字幕第99页| 欧美成人日韩| 精品国产31久久久久久| 91极品美女在线| xxxxx性欧美特大| 激情国产一区二区| 看成年女人免费午夜视频| 黑人狂躁日本妞一区二区三区| 激情亚洲综合在线| 国产精品v亚洲精品v日韩精品| 日本黄色一区二区| 自拍日韩欧美| 成人激情视频免费在线| 日韩 欧美 精品| 蜜桃视频m3u8在线观看| 国产一区二区三区视频免费观看| 在线不卡欧美精品一区二区三区| 日韩网址在线观看| 欧美激情导航| 激情文学综合插| 欧美极品jizzhd欧美18| 一区在线观看视频| 久久99久久99精品免视看婷婷| 日韩亚洲在线| 香蕉视频网页版| 欧美亚视频在线中文字幕免费| 一色桃子久久精品亚洲| 天天干天天草天天射| 亚洲欧美激情另类校园| 国产成人禁片在线观看| 超碰超碰超碰超碰超碰| 2019年中文字幕| 激情婷婷综合| 日韩欧美在线免费观看视频| 亚洲国产美女视频| 亚洲午夜av在线| 黄瓜视频免费观看在线观看www| 又紧又大又爽精品一区二区| 国内精品免费**视频| 国产一区二区三区自拍| 国产日韩在线一区| 日韩av高清在线播放| 亚洲做受高潮无遮挡| 57pao国产一区二区| 天天操夜夜操免费视频| 亚洲精品中文字幕在线播放| wwwav在线| 黄色在线网站噜噜噜| 九色视频九色自拍| 午夜精品久久久99热福利| 欧美精品videosex| 国产欧美韩国高清| 国产一区中文字幕| 欧美激情亚洲另类| 人成福利视频在线观看| 狠狠躁夜夜躁久久躁别揉| 亚洲一区二区三区香蕉| 中文字幕人妻精品一区| 日韩一级大片在线观看| 6080午夜| 青青草国产精品亚洲专区无| 尤物国产在线观看| 99久久婷婷国产综合精品电影√|