婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 我用Python做個AI出牌器斗地主把把贏

我用Python做個AI出牌器斗地主把把贏

熱門標簽:鶴壁手機自動外呼系統違法嗎 B52系統電梯外呼顯示E7 高德地圖標注收入咋樣 企業微信地圖標注 地圖標注多個 沈陽防封電銷電話卡 銀川電話機器人電話 怎么辦理400客服電話 萊蕪電信外呼系統

前言

最近在網上看到一個有意思的開源項目,基于快手團隊開發的開源AI斗地主——DouZero做的一個“成熟”的AI,項目開源地址【https://github.com/tianqiraf/DouZero_For_HappyDouDiZhu – tianqiraf】。

今天我們就一起來學習下是如何制作一個基于DouZero的出牌器,看看AI是如何來幫助斗地主的!

一、核心功能設計

首先這款出牌器是基于DouZero開發的,核心是需要利用訓練好的AI模型來幫住我們,給出最優出牌方案。

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

我們還要將每一輪其他兩人的出牌輸入,這樣出牌器就可以根據出牌數據,及時提供給我們最優出牌決策,帶領我們取得勝利!

那么如何獲取三者之間的關系呢?誰是地主?誰是農民?是自己一人作戰還是農民合作?自己玩家的手牌是什么?三張底牌是什么?這些也都需要在開局后確認好。

大致可以整理出要實現的核心功能如下:

UI設計排版布局

  • 顯示三張底牌
  • 顯示AI角色出牌數據區域,上家出牌數據區域,下家出牌數據區域,本局勝率區域
  • AI玩家手牌區域
  • AI出牌器開始停止

手牌和出牌數據識別

  • 游戲剛開始根據屏幕位置,截圖識別AI玩家手牌及三張底牌
  • 確認三者之間的關系,識別地主和農民角色,確認隊友及對手關系
  • 識別每輪三位玩家依次出了什么牌,刷新顯示對應區域

AI出牌方案輸出

  • 加載訓練好的AI模型,初始化游戲環境
  • 每輪出牌判斷,根據上家出牌數據給出最優出牌決策
  • 自動刷新玩家剩余手牌和本局勝率預測

二、實現步驟

1. UI設計排版布局

根據上述功能,首先考慮進行簡單的UI布局設計,使用的是pyqt5。核心設計代碼如下:

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歡樂斗地主--Dragon少年"))
    self.WinRate.setText(_translate("Form", "勝率:--%"))
    self.InitCard.setText(_translate("Form", "開始"))
    self.UserHandCards.setText(_translate("Form", "手牌"))
    self.LPlayedCard.setText(_translate("Form", "上家出牌區域"))
    self.RPlayedCard.setText(_translate("Form", "下家出牌區域"))
    self.PredictedCard.setText(_translate("Form", "AI出牌區域"))
    self.ThreeLandlordCards.setText(_translate("Form", "三張底牌"))
    self.Stop.setText(_translate("Form", "停止"))

2. 手牌和出牌數據識別

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

識別AI玩家手牌及三張底牌:

我們可以截取游戲屏幕,根據固定位置來識別當前AI玩家的手牌和三張底牌。核心代碼如下:

# 牌檢測結果濾波
def cards_filter(self, location, distance):  
    if len(location) == 0:
        return 0
    locList = [location[0][0]]
    count = 1
    for e in location:
        flag = 1  # “是新的”標志
        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

效果如下所示:

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

同理我們可以根據游戲屏幕截圖,識別地主的圖標,確認地主角色。核心代碼如下:

# 查找地主角色
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手牌,其他玩家手牌(預測),地主三張底牌,三者角色關系,出牌順序。核心代碼如下:

# 坐標
self.MyHandCardsPos = (414, 804, 1041, 59)  # AI玩家截圖區域
self.LPlayedCardsPos = (530, 470, 380, 160)  # 左側玩家截圖區域
self.RPlayedCardsPos = (1010, 470, 380, 160)  # 右側玩家截圖區域
self.LandlordFlagPos = [(1320, 300, 110, 140), (320, 720, 110, 140), (500, 300, 110, 140)]  # 地主標志截圖區域(右-我-左)
self.ThreeLandlordCardsPos = (817, 36, 287, 136)      # 地主底牌截圖區域,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 = []
    # 其他玩家手牌(整副牌減去玩家手牌,后續再減掉歷史出牌)
    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 = ""
    # 開局時三個玩家的手牌
    self.card_play_data_list = {}
    # 出牌順序:0-玩家出牌, 1-玩家下家出牌, 2-玩家上家出牌
    self.play_order = 0
    self.env = None
    # 識別玩家手牌
    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)]
    # 識別三張底牌
    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)]
    # 識別玩家的角色
    self.user_position_code = self.find_landlord(self.LandlordFlagPos)
    if self.user_position_code is None:
        items = ("地主上家", "地主", "地主下家")
        item, okPressed = QInputDialog.getItem(self, "選擇角色", "未識別到地主,請手動選擇角色:", 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);')

    # 整副牌減去玩家手上的牌,就是其他人的手牌,再分配給另外兩個角色(如何分配對AI判斷沒有影響)
    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)
    # 生成手牌結束,校驗手牌數量
    if len(self.card_play_data_list["three_landlord_cards"]) != 3:
        QMessageBox.critical(self, "底牌識別出錯", "底牌必須是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, "手牌識別出錯", "初始手牌數目有誤", 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開源的AI斗地主了。DouZero項目地址:https://github.com/kwai/DouZero。我們需要將該開源項目下載并導入項目中。

創建一個AI玩家角色,初始化游戲環境,加載模型,進行每輪的出牌判斷,控制一局游戲流程的進行和結束。核心代碼如下:

# 創建一個代表玩家的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])
# 初始化游戲環境
self.env = GameEnv(ai_players)
# 游戲開始
self.start()

def start(self):
    self.env.card_play_init(self.card_play_data_list)
    print("開始出牌\n")
    while not self.env.game_over:
        # 玩家出牌時就通過智能體獲取action,否則通過識別獲取其他玩家出牌
        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:
                # 識別下家出牌
                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:
                # 識別上家出牌
                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("{}勝,本局結束!\n".format("農民" if self.env.winner == "farmer" else "地主"))
    QMessageBox.information(self, "本局結束", "{}勝!".format("農民" if self.env.winner == "farmer" else "地主"),
                            QMessageBox.Yes, QMessageBox.Yes)
    self.env.reset()
    self.init_display()

到這里,整個AI斗地主出牌流程基本已經完成了。

三、出牌器用法

按照上述過程,這款AI出牌器已經制作完成了。后面應該如何使用呢?如果不想研究源碼,只想使用這款AI斗地主出牌器,驗證下效果,該怎么配置環境運行這個AI出牌器呢?下面就開始介紹。

1. 環境配置

首先我們需要安裝這些第三方庫,配置相關環境,如下所示:

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. 坐標調整確認

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

其次我們要確認屏幕截圖獲取的各個區域是否正確。如果有問題需要進行區域位置坐標調整。

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

3. 運行測試

當所有環境配置完成,各區域坐標位置確認無誤之后,下面我們就可以直接運行程序,測試效果啦~

首先我們運行AI出牌器程序,打開游戲界面,進入游戲。當玩家就位,手牌分發完畢,地主身份確認之后,我們就可以點擊畫面中開始按鈕,讓AI來幫助我們斗地主了。

基于這個DouZero項目做一個“成熟”的AI,項目開源地址【https://github.com/tianqiraf/DouZero_For_HappyDouDiZhu – tianqiraf】。

今天我們就到這里,明天繼續努力!

如果本篇博客有任何錯誤,請批評指教,不勝感激 !

到此這篇關于我用Python做個AI出牌器斗地主把把贏的文章就介紹到這了,更多相關Python自動出牌器內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • python對驗證碼降噪的實現示例代碼
  • 爬蟲Python驗證碼識別入門
  • Python機器學習入門(一)序章
  • 6個Python辦公黑科技,助你提升工作效率
  • Python機器學習入門(三)之Python數據準備
  • 用python寫個顏值評分器篩選最美主播
  • Python反射機制實例講解
  • Python代碼實現粒子群算法圖文詳解
  • python通過PyQt5實現登錄界面的示例代碼
  • Python圖片驗證碼降噪和8鄰域降噪

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

巨人網絡通訊聲明:本文標題《我用Python做個AI出牌器斗地主把把贏》,本文關鍵詞  我用,Python,做個,出牌,器,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《我用Python做個AI出牌器斗地主把把贏》相關的同類信息!
  • 本頁收集關于我用Python做個AI出牌器斗地主把把贏的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产乱淫av一区二区三区| 一区二区成人在线| 91首页免费视频| 国产iv一区二区三区| 麻豆91小视频| 加勒比av一区二区| 国产福利一区二区| www.日韩av| 欧美高清视频www夜色资源网| 色婷婷综合久久久久中文一区二区| 国产高清不卡二三区| 粗大黑人巨茎大战欧美成人| 久久伊99综合婷婷久久伊| 精品国产一二三| 亚洲欧美综合网| 日本中文字幕一区二区有限公司| 日日夜夜免费精品| 国产一区福利在线| 色呦呦日韩精品| 精品三级av在线| 亚洲欧洲精品一区二区三区| 亚洲一区二区三区四区在线观看| 奇米影视一区二区三区| 国产一区在线精品| av电影天堂一区二区在线观看| 色老汉一区二区三区| 欧美一卡二卡在线| 自拍偷自拍亚洲精品播放| 蜜桃在线一区二区三区| 91在线观看免费视频| 国产馆精品极品| 欧美日韩综合一区| 国产亚洲成aⅴ人片在线观看| 久久久精品蜜桃| 亚洲第一福利视频在线| 亚洲欧美日韩久久精品| 国产一区不卡视频| 日韩欧美激情一区| 丝袜美腿亚洲一区| 欧美日韩国产123区| 亚洲黄色性网站| 99久久er热在这里只有精品66| 3d成人动漫网站| 亚洲成人精品影院| 色综合中文字幕| 亚洲欧洲无码一区二区三区| 国产乱码精品1区2区3区| 精品国产乱码久久久久久夜甘婷婷 | 亚洲图片有声小说| 91成人国产精品| 国产精品美女久久久久aⅴ国产馆| 亚洲18色成人| 日韩精品影音先锋| 成人一区二区三区| 最近中文字幕一区二区三区| 成人视屏免费看| 亚州成人在线电影| 日韩精品最新网址| www.亚洲色图| 精品一区二区三区免费| 国产精品免费aⅴ片在线观看| 欧美性大战久久久久久久| 蜜桃91丨九色丨蝌蚪91桃色| 国产精品久久久久aaaa樱花 | 日韩欧美在线不卡| 东方aⅴ免费观看久久av| 日韩一区欧美二区| 亚洲日本在线a| 日韩欧美一级片| www.亚洲色图| 国产大片一区二区| 一区二区三区在线播| 91精品国产免费| 国内精品在线播放| 日韩在线一二三区| 中文字幕一区在线观看视频| 日韩一区二区三免费高清| 丁香一区二区三区| 久久91精品国产91久久小草| 日韩高清一区在线| 天堂成人免费av电影一区| 亚洲卡通欧美制服中文| 中文字幕成人av| 国产嫩草影院久久久久| 日韩欧美视频一区| 日韩一区二区不卡| 欧美日韩1区2区| 欧美成人女星排行榜| 欧美人牲a欧美精品| 欧美mv和日韩mv国产网站| 精品福利视频一区二区三区| 日韩午夜激情免费电影| 日韩欧美一级二级| 亚洲欧洲精品一区二区三区不卡| 亚洲乱码国产乱码精品精可以看 | 亚洲激情网站免费观看| 亚洲高清免费一级二级三级| 久久精品久久精品| 成人a区在线观看| 欧美电影在线免费观看| 久久久久国色av免费看影院| 一区二区视频在线看| 亚洲电影你懂得| 暴力调教一区二区三区| 精品欧美一区二区三区精品久久| 欧美国产欧美综合| 日本va欧美va欧美va精品| 成人黄色片在线观看| 欧美一区二区女人| 亚洲一区二区三区四区在线免费观看 | 精品1区2区3区| 日韩精品一区二区三区在线观看| 亚洲国产精品二十页| 日韩高清一区二区| 欧美日韩黄色影视| 亚洲与欧洲av电影| 91污片在线观看| 中文字幕中文字幕一区| 精品一区二区久久| 欧美电影免费观看高清完整版在 | 日韩精品一区二区三区视频| 亚洲国产精品久久一线不卡| 91亚洲国产成人精品一区二三| 久久毛片高清国产| 国产91色综合久久免费分享| 精品国产99国产精品| 国产一区二区三区在线观看免费视频| 中文在线一区二区| 色诱亚洲精品久久久久久| 国产精品网友自拍| 97se狠狠狠综合亚洲狠狠| 亚洲欧美日本在线| 欧美无乱码久久久免费午夜一区| 一区二区三区在线观看欧美| 欧美日韩一区在线观看| 狂野欧美性猛交blacked| 国产亚洲精品7777| 一本一本久久a久久精品综合麻豆| 亚洲柠檬福利资源导航| 日韩一区二区精品葵司在线| 国产麻豆午夜三级精品| 樱花影视一区二区| 欧美精品一区二| 91久久精品午夜一区二区| 国产suv精品一区二区883| 亚洲第一成年网| 国产精品欧美极品| 欧美日韩成人激情| 91免费在线视频观看| 天天综合网 天天综合色| 国产精品久久久久久户外露出| www国产成人免费观看视频 深夜成人网| 狠狠色狠狠色综合系列| 亚洲综合在线第一页| 国产偷国产偷亚洲高清人白洁 | 国产suv精品一区二区三区| 一区二区三区色| 国产亚洲精品免费| 欧美人狂配大交3d怪物一区 | 国产精品国产馆在线真实露脸| 欧美福利一区二区| 在线观看亚洲一区| www.激情成人| 成人不卡免费av| 国产激情精品久久久第一区二区| 免费的国产精品| 午夜视黄欧洲亚洲| 亚洲自拍偷拍麻豆| 亚洲精品国产视频| 亚洲精品免费一二三区| 亚洲日本成人在线观看| 亚洲欧洲www| 亚洲视频一区二区在线| 亚洲色欲色欲www| 亚洲欧美另类综合偷拍| 亚洲欧美偷拍卡通变态| 亚洲人成伊人成综合网小说| 亚洲精品久久久蜜桃| 亚洲人成在线观看一区二区| 亚洲激情男女视频| 亚洲综合色婷婷| 亚洲成人免费看| 日本大胆欧美人术艺术动态| 日韩中文字幕亚洲一区二区va在线| 日韩精品视频网站| 麻豆免费精品视频| 韩国欧美国产1区| 国产不卡视频一区| 99re免费视频精品全部| 色网综合在线观看| 欧美丝袜丝nylons| 337p亚洲精品色噜噜狠狠| 蜜桃视频在线一区| 日韩色视频在线观看| 91精品久久久久久久99蜜桃| 69精品人人人人| 精品福利av导航| 日本一区二区视频在线| 国产精品成人免费精品自在线观看 | 亚洲欧美日韩一区二区|