日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

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

瀏覽:104日期:2022-08-06 17:24:00
目錄前言一、核心功能設計UI設計排版布局手牌和出牌數據識別AI出牌方案輸出二、實現步驟1. UI設計排版布局2. 手牌和出牌數據識別3. AI出牌方案輸出三、出牌器用法1. 環境配置2. 坐標調整確認3. 運行測試前言

最近在網上看到一個有意思的開源項目,基于快手團隊開發的開源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 = 0breakif 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

效果如下所示:

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

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

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

# 查找地主角色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成349x168def 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

效果如下:

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

3. AI出牌方案輸出

下面我們就需要用到DouZero開源的AI斗地主了。DouZero項目地址:https://github.com/kwai/DouZero。我們需要將該開源項目下載并導入項目中。

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

# 創建一個代表玩家的AIai_players = [0, 0]ai_players[0] = self.user_positionai_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 = 1elif 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 = 2elif 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: passself.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斗地主出牌流程基本已經完成了。

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

三、出牌器用法

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

1. 環境配置

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

torch==1.9.0GitPython==3.0.5gitdb2==2.0.6PyAutoGUI==0.9.50PyQt5==5.13.0PyQt5-sip==12.8.1Pillow>=5.2.0opencv-pythonrlcard2. 坐標調整確認

我們可以打開游戲界面,將游戲窗口模式下最大化運行,把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

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

3. 運行測試

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

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

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

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

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

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

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

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
奇米777国产一区国产二区| 中文字幕一区二区av| 亚洲视频二区| 免费视频国产一区| 免费精品国产的网站免费观看| 久久国产亚洲| 午夜国产欧美理论在线播放| 丝袜脚交一区二区| 亚洲aa在线| 国产精选一区| 成人在线视频免费看| 中文另类视频| 亚洲视频播放| 日韩激情一区二区| 久久久精品国产**网站| 青青青免费在线视频| 欧美精品一线| 国产亚洲精品精品国产亚洲综合| 日韩成人精品一区二区三区 | 青青国产91久久久久久| 国产日产一区| 国产资源在线观看入口av| 久久国产日韩| 亚洲一区二区三区在线免费| 国产九九精品| 色老板在线视频一区二区| 亚洲欧美日韩专区| 国产剧情一区二区在线观看| 久久久夜夜夜| 欧美综合精品| 999久久久国产精品| 久久国产精品毛片| 欧美aⅴ一区二区三区视频| 久久久夜夜夜| 综合亚洲视频| 中文在线а√在线8| 视频一区国产视频| 激情综合婷婷| 亚洲精品极品| 女生影院久久| 亚洲精品亚洲人成在线观看| 精品久久久久久久| 亚洲欧美日韩国产综合精品二区 | 国产精品日韩久久久| 日本亚洲视频| 免费高潮视频95在线观看网站| 亚洲精品裸体| 天堂av在线| 国产亚洲欧美日韩在线观看一区二区 | 日本国产精品| 日本一不卡视频| 亚洲va在线| 国产日产一区| 亚洲一区av| 日韩免费小视频| 国产欧美日韩综合一区在线播放| 久久中文字幕av| 国产精品国码视频| 蜜臀av一区二区三区| 成人久久一区| 精品视频高潮| 日本少妇一区二区| 欧美日韩国产免费观看| 国产suv精品一区二区四区视频| 蜜桃免费网站一区二区三区| 亚洲h色精品| 国产精品成人a在线观看| 亚洲三级观看| 黄色亚洲大片免费在线观看| 国产精品久久国产愉拍| 免播放器亚洲一区| 一区二区亚洲精品| 成人羞羞在线观看网站| 久久av偷拍| 久久国产尿小便嘘嘘| 亚洲专区视频| 亚洲尤物在线| 日韩午夜高潮| 久久久影院免费| 国产精品99视频| 麻豆成人综合网| 国产亚洲欧美日韩精品一区二区三区| 亚洲网址在线观看| 日本 国产 欧美色综合| 香蕉人人精品| 免费污视频在线一区| 国产中文在线播放| 中文字幕在线看片| 日韩国产一区| 日韩免费看片| 久久国产毛片| 欧美在线资源| 免费视频久久| 蜜桃av一区二区在线观看| 男女性色大片免费观看一区二区 | 麻豆成人综合网| 国产精品一区三区在线观看| 亚洲精品裸体| 日本成人在线网站| 日韩在线观看中文字幕| 日本欧美韩国一区三区| 日韩av午夜在线观看| 日韩不卡一区二区三区| 日韩精品社区| 国产精选久久| 国产a亚洲精品| 久久麻豆精品| 日本欧美在线看| 欧美日韩91| 国产美女亚洲精品7777| 精品国产乱码久久久| 97精品国产| 久久网站免费观看| 在线视频亚洲欧美中文| 国产日韩精品视频一区二区三区| 美女久久精品| 亚洲网站视频| 综合日韩在线| 久久一区国产| 国内精品福利| 日韩一区网站| 国产不卡一区| 不卡一区综合视频| 中文字幕日韩亚洲| 欧美自拍一区| 国产美女高潮在线| 午夜亚洲一区| 国产精品极品国产中出| 成人午夜国产| 亚洲精品无吗| 精品国产一区二区三区2021| 久久久国产精品一区二区中文| 伊人久久成人| 国产精品日本一区二区三区在线| 日本а中文在线天堂| 中文日韩在线| 免费观看亚洲天堂| 午夜国产欧美理论在线播放| 欧美一区自拍| 国产va免费精品观看精品视频| 红桃视频欧美| 国产精品1区在线| 亚洲婷婷在线| 国产精品一区二区精品| 欧美日韩一区二区三区视频播放| 亚洲精品福利| 日韩精品91| 日韩激情综合| 久久国产直播| 国产精品中文字幕亚洲欧美 | 日韩av成人高清| 青青青免费在线视频| 视频在线观看国产精品| 久久久久久亚洲精品美女| 91久久亚洲| 久久久久伊人| 三级一区在线视频先锋| 国产伊人久久| 四虎在线精品| 久久国产中文字幕| 欧美午夜三级| 日韩午夜黄色| 日韩精品专区| 国产精品a久久久久| 在线亚洲免费| 国产成人免费| 日本视频一区二区| 91精品福利| 极品av在线| 日韩中文字幕一区二区高清99| 99视频精品视频高清免费| 久久不见久久见免费视频7 | 国产精品啊v在线| 日韩精品一区第一页| 日韩中文在线电影| 国产丝袜一区| 亚洲免费在线| 久久精品影视| 久久亚洲人体| 青青国产精品| 在线看片一区| 天堂成人免费av电影一区| www成人在线视频| 精品久久视频| 久久99久久人婷婷精品综合| 日韩高清一区| 伊人精品久久| 久久亚洲国产精品一区二区| 免费精品国产| 亚洲午夜黄色| 99久久精品国产亚洲精品| 国产高潮在线| 精品三区视频| 久久国产生活片100| 中文字幕日本一区二区| 亚洲一区二区三区四区五区午夜 | 成人小电影网站| 成人影视亚洲图片在线| 国产精品黄网站| 国产乱码精品一区二区三区四区|