日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

用python写一个有AI的斗地主游戏(二)——简述后端代码和思路

發布時間:2023/12/14 python 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用python写一个有AI的斗地主游戏(二)——简述后端代码和思路 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

源碼請看我的Github頁面。
這是我一個課程的學術項目,請不要抄襲,引用時請注明出處。
本專欄系列旨在幫助小白從零開始開發一個項目,同時分享自己寫代碼時的感想。
請大佬們為我的拙見留情,有不規范之處煩請多多包涵!

文章目錄

  • 開場白
  • 邏輯
  • 后端代碼和思路
    • gameEngine.py
    • utils.py
  • 結束語

開場白

在上一篇博客里,已經介紹了開始前的一些準備。這篇博客講簡要介紹游戲開發中后端代碼結構的思路。當然,也是博主自己琢磨的,有遺漏或不足之處請指教!

邏輯

游戲的實現大概可以分為兩層(就像網頁開發一樣):前端和后端。后端負責儲存和管理游戲的邏輯(比如現在是誰的回合,誰手里都有什么牌,我能不能出這個對子等等),而前端負責與用戶的交互(比如在窗口里顯示自己的手牌,獲取輸入并更新游戲數據等等)。用類來表示前端和后端有種種好處,其中對新手最有幫助的就是能夠以更加“人類”的方式來組織和看待程序內容。比如,用類的你可以這樣想:“我想要游戲里玩家1打出這些牌然后玩家2出牌,那么我可以調用Game這個游戲邏輯類里的makePlay這個出牌的函數。”以這種方式思考和解決問題需要一些時間磨合,但是對長遠的開發習慣和效率都有極大好處。以下是游戲后端大致邏輯:

步驟人類邏輯/游戲流程程序邏輯
1三名玩家進入房間/上桌初始化游戲類,包括玩家名稱,場上順序,等等
2洗牌并給每個玩家發初始的17張牌(留出3張地主牌)用游戲類給每個玩家類添加手牌,并在游戲類里維持地主牌的記錄
3叫地主按照順序給每個玩家叫地主的機會,安排出牌順序、給地主牌、改變玩家身份
4按照順序和規則出牌或過牌按照出牌順序,玩家出牌時調用相關函數進行可行性檢測和模擬出牌
5如果有人出完了牌,結束游戲在每一次出牌后檢查游戲是否結束,沒結束的話繼續上一步

這些游戲邏輯將在前端被構造和模擬,這里的后端代碼只是提供實現這些邏輯的基本工具。還有AI出牌的部分也會放到前端部分詳細講解。

后端代碼和思路

斗地主的后端邏輯和井字棋比起來還是有一定復雜度的。博主設計的游戲后端邏輯主要放到了gameEngine.py里,其中各包含更加細分的類。思來想去,我們需要實現以下功能:

''' GameEngine.py描述 Game Class: 一個用來表達游戲狀態的類(保存所有游戲信息)__init__: 用來構造類,需要游玩的三個玩家的id,初始化類sortHelper: 目前不重要,用來幫助排序卡的大小(因為卡的表達方式機器不易讀)shuffleDeck: 創建并打亂初始排隊dealCard: 將每個玩家17張卡隨機分發,并選擇3張隨機地主牌chooseLandlord: 把一個玩家的身份變為地主assignPlayOrder: 根據玩家身份調整出牌順序whichPattern: 返回選擇牌的種類(比如單張,對子,順子,三代二等等)以及它們的大小isValidPlay: 返回選擇的牌是否為可以按照規則打的牌makePlay: 模擬現實中的玩家出牌,即出牌后輪到下一家checkWin: 檢查游戲狀態(返回0代表游戲繼續,1代表地主獲勝,2代表農民獲勝)createAI: 用AI玩家代替人類玩家AIMakePlay: AI出牌 player Class: 一個用來表達玩家狀態的類(包括玩家名字/id,手牌,和是否為地主)__init__: 用玩家id構造類playCard: 從玩家手牌中移除選擇的卡 AI Class:__init__: 用AI玩家id構造類,繼承player類的方法getAllMoves: AI根據手牌生成所有可以出的牌 '''

接下來我們就一個一個實現了。

gameEngine.py

首先是Game類。構建它的時候用到了以下內容:

class Game:def __init__(self, p1id, p2id, p3id):# 用來生成和表達卡的一些常量self.colors = ['heart', 'spade', 'diamond', 'club'] # 撲克牌的四個色self.nums = ['A', '2', '3', '4', '5', '6','7', '8', '9', '10', 'J', 'Q', 'K'] # 撲克牌的數字大小self.specials = ['X', 'D'] # 小王和大王self.cardOrder = {'3': 1, '4': 2, '5': 3, '6': 4, '7': 5, '8': 6, '9': 7, '10': 8,'J': 9, 'Q': 10, 'K': 11, 'A': 12, '2': 13, 'X': 14, 'D': 15} # 用來比較牌大小的字典# 創建游戲內的玩家(player類)和一個用玩家名稱指向player對象的字典self.p1 = player(p1id)self.p2 = player(p2id)self.p3 = player(p3id)self.playerDict = {p1id: self.p1, p2id: self.p2, p3id: self.p3}# 一些重要的游戲狀態self.currentPlayer = '' # 當前玩家idself.prevPlayer = '' # 上一個玩家idself.prevPlay = ['', []] # 上一次出牌,包括出牌者id和出的牌self.playOrder = [] # 出牌順序,包含三個玩家的idself.landLordCards = [] # 地主牌

在我們完成構造函數后,就要開始寫功能性函數了。由于部分比較多,請小伙伴們挑選自己感興趣的部分閱讀,比如“欸這個whichPattern好像有點技術含量,了解了解”。具體如下:

# 幫助給卡排序的函數,輸入卡的名稱如‘club 2’,根據之前定義的self.cardOrder返回它的虛擬大小/排名def sortHelper(self, x):if x[-1] == '0': # 如果卡以0結尾,那么它是個10return self.cardOrder['10']return self.cardOrder[x[-1]]# 創建牌堆并洗牌,放到self.deck即游戲牌堆里def shuffleDeck(self):self.deck = []for i in self.colors: # 生成所有排列組合for j in self.nums:self.deck.append(i+' '+j) # “花色 數字”self.deck.append(self.specials[0]) # 放入小王和大王self.deck.append(self.specials[1])random.shuffle(self.deck) # 打亂列表元素順序(洗牌),別忘了先import random# 發每個玩家初始的17張手牌和3張地主牌def dealCard(self):# 這里介紹下,如果牌堆是完全隨機的,發牌順序對游戲公平性和體驗不會有影響# 我們自己洗牌一般都不會洗的太散,所以要一個人一個人發避免炸彈太多self.landLordCards = [] # 發地主牌for i in range(3):choice = random.choice(self.deck) # 隨機選一張self.landLordCards.append(choice) # 放到地主牌里self.deck.remove(choice) # 從牌堆里移除它self.p1Card = [] # 發玩家1的牌for i in range(17):choice = random.choice(self.deck) # 隨機選一張self.p1Card.append(choice) # 放到該玩家手牌中self.deck.remove(choice) # 從牌堆里移除它self.p2Card = [] # 發玩家2的牌for i in range(17):choice = random.choice(self.deck)self.p2Card.append(choice)self.deck.remove(choice)self.p3Card = [] # 發玩家3的牌for i in range(17):choice = random.choice(self.deck)self.p3Card.append(choice)self.deck.remove(choice)self.p1.cards = self.p1Card # 把每個玩家的牌放到他們的類里self.p2.cards = self.p2Cardself.p3.cards = self.p3Cardself.p1.cards.sort(key=lambda x: self.sortHelper(x)) # 給他們排序,模擬了玩的時候自己理牌self.p2.cards.sort(key=lambda x: self.sortHelper(x))self.p3.cards.sort(key=lambda x: self.sortHelper(x))# 根據輸入的玩家名稱/id,選擇地主身份def chooseLandlord(self, name):self.playerDict[name].identity = 'p' # 把這個玩家身份改為p,農民為sfor card in self.landLordCards: # 把地主牌放到這個玩家手牌里self.playerDict[name].cards.append(card)self.playerDict[name].cards.sort(key=lambda x: self.sortHelper(x)) # 給手牌排序# 出牌順序def assignPlayOrder(self):if self.p1.identity == 'p': # 地主第一個出,剩下兩個玩家隨機打亂self.playOrder = [self.p2.name, self.p3.name]random.shuffle(self.playOrder)self.playOrder.insert(0, self.p1.name)elif self.p2.identity == 'p':self.playOrder = [self.p1.name, self.p3.name]random.shuffle(self.playOrder)self.playOrder.insert(0, self.p2.name)elif self.p3.identity == 'p':self.playOrder = [self.p1.name, self.p2.name]random.shuffle(self.playOrder)self.playOrder.insert(0, self.p3.name)else: # 還沒選地主的情況,三個玩家順序隨機(等待叫地主)self.playOrder = [self.p1.name, self.p2.name, self.p3.name]random.shuffle(self.playOrder)self.currentPlayer = self.playOrder[0] # 當前玩家為第一個玩家# 獲取選擇卡的種類和大小def whichPattern(self, selectedCards):cardValues = []for i in selectedCards: # 把所有選擇的卡的值放到列表里if i[-1] == '0': # 如果0結尾那么它是個10cardValues.append(self.cardOrder['10'])else:cardValues.append(self.cardOrder[i[-1]])# 這里獲取卡的種類和大小。utils是我寫的另一個文件,借鑒了DouZero的utils庫# DouZero的項目很有趣,AI打斗地主很智能,感興趣的話請看https://github.com/kwai/DouZero# 我代碼里的utils.py里有著各種各樣的工具,為了方便管理就都放到了一個文件里,后面會展開介紹# get_move_type(cardValues)輸入選擇的卡(的值),返回整數代表的卡的種類和卡的大小pattern = utils.get_move_type(cardValues)return pattern # 返回一個字典{type: 1, value: 5},有卡的種類和大小# 檢查是否為可以打的牌def isValidPlay(self, selected):selectedCards = sorted(selected, key=lambda x: self.sortHelper(x)) # 先排序,方便比較if self.prevPlay[0] == self.currentPlayer:return True # 即上兩家都過牌,又輪到自己了,出啥都行pattern1 = self.whichPattern(self.prevPlay[1]) # 上一個出牌的種類和大小pattern2 = self.whichPattern(selectedCards) # 當前選擇牌的種類和大小if pattern2['type'] == 15 or pattern1['type'] == 5:return False # 即上家出牌是王炸或者當前選擇牌非法elif pattern2['type'] == 5 or pattern1['type'] == 0:return True # 即當前出牌是王炸或者前一家過牌else:if pattern1['type'] == pattern2['type'] and\pattern1['rank'] < pattern2['rank']:try: # 看看是不是三帶一if pattern1['len'] == pattern2['len']:return Truereturn Falseexcept:return True # 如果種類一樣并且選擇的要更大,可以出else:return False# 模擬游戲出牌def makePlay(self, selectedCards):if selectedCards == [] and self.prevPlay != []:pass # 過牌,什么都不做else: # 有牌打的話那就打牌self.playerDict[self.currentPlayer].playCard(selectedCards) # 當前玩家出牌self.prevPlay = [self.currentPlayer, selectedCards] # 記錄本次出牌self.prevPlayer = self.currentPlayer # 順序輪換playerIndex = self.playOrder.index(self.currentPlayer) # 當前玩家位置if playerIndex == 2: # 如果是列表里最后一個,循環到第一個self.currentPlayer = self.playOrder[0]else: # 否則轉到下一個玩家self.currentPlayer = self.playOrder[playerIndex+1]# 檢查游戲是否結束def checkWin(self):if self.playerDict[self.prevPlayer].cards == []: # 游戲在當前玩家出完牌后沒有手牌時結束if self.playerDict[self.prevPlayer].identity == 'p':return 1 # 地主贏else:return 2 # 農民贏else:return 0 # 游戲還在進行

Game類里還有個很重要的部分,那就是用AI出牌。具體如下:

# 創建AI玩家def createAI(self, name2, name3):self.p2 = AI(name2) # AI是player的子類self.p3 = AI(name3)self.playerDict[name2] = self.p2 # 把對應的玩家改成AIself.playerDict[name3] = self.p3# AI出牌。這里的邏輯很簡單,即從能出的牌里隨便選一個出。之后可以進行提升def AIMakePlay(self, name, chosenLandLord):AIplayer = self.playerDict[name]if chosenLandLord: # 如果叫了地主正在出牌moves = AIplayer.getAllMoves() # 生成可以出的牌possibleMoves = [] # 根據場上情況實際可以打的牌牌for move in moves:realcards = []for card in move: # 先把生成的牌(無花色,只有大小)變成實際的牌(有花色和大小)for hand in AIplayer.cards: if hand[-1] == card[-1] and hand not in realcards:realcards.append(hand)if self.isValidPlay(realcards): # 如果可以打,加到選項里possibleMoves.append(realcards)possibleMoves.append([]) # 即允許過牌move = random.choice(possibleMoves) # 隨機選一個出牌方式出牌self.makePlay(move)else: # 還沒人叫地主的話就自己叫地主self.chooseLandlord(name)self.assignPlayOrder()

在Game類里的時候我們用到了player對象來表達玩家的相關信息,這里我們定義下player類:

class player:def __init__(self, name):self.name = name # 玩家名稱/idself.identity = 's' # s代表農民,p代表地主self.cards = [] # 初始手牌# 出牌/從手牌中移除某些牌def playCard(self, selectedCards):for i in selectedCards:self.cards.remove(i)

還有剛用到的AI玩家類。具體如下:

class AI(player): # 這里用到了繼承def __init__(self,name):super().__init__(name) # 繼承了player類的構造函數# 因為用到了繼承,所以AI也繼承了player類的playCard函數,所以無需再定義# 生成所有可以出的牌def getAllMoves(self):envmoves = utils.MovesGener(self.cards).gen_moves() # 這里又用到了utils.py,后面會介紹# MovesGener是一個出牌生成器,gen_moves()生成可以出的牌EnvCard2RealCard = {3: '3', 4: '4', 5: '5', 6: '6', 7: '7',8: '8', 9: '9', 10: '10', 11: 'J', 12: 'Q',13: 'K', 14: 'A', 17: '2', 20: 'X', 30: 'D'}realmoves = []for move in envmoves:realmove = [] # 把生成的虛擬數字變回撲克無花色數字for card in move:realmove.append(EnvCard2RealCard[card])realmoves.append(realmove)return realmoves

到這里,游戲引擎/后端邏輯最主要的部分就寫好了。

utils.py

剛才提到了很多工具都來自utils.py。以下是它的代碼以及介紹:

''' 重要聲明:以下打星號(*)的函數均借鑒于DouZero,請感興趣的同學前往https://github.com/kwai/DouZero查看他們的代碼 utils.py描述is_contiuous_seq: 輸入出的牌,返回它是否連續(類似順子,但沒限制長度) *get_move_type: 輸入出的牌,返回它的種類(比如順子,單張,三帶一)和它的大小(比如三帶一的大小就是那三張的大小) *select: 輸入一些牌和一個代表長度的數字,生成該長度這些牌的不同組合 * MovesGener Class: 用來生成可行出牌的類 * '''

這里是對于DouZero這部分代碼的引用:

@InProceedings{pmlr-v139-zha21a,title = {DouZero: Mastering DouDizhu with Self-Play Deep Reinforcement Learning},author = {Zha, Daochen and Xie, Jingru and Ma, Wenye and Zhang, Sheng and Lian, Xiangru and Hu, Xia and Liu, Ji},booktitle = {Proceedings of the 38th International Conference on Machine Learning},pages = {12333--12344},year = {2021},editor = {Meila, Marina and Zhang, Tong},volume = {139},series = {Proceedings of Machine Learning Research},month = {18--24 Jul},publisher = {PMLR},pdf = {http://proceedings.mlr.press/v139/zha21a/zha21a.pdf},url = {http://proceedings.mlr.press/v139/zha21a.html},abstract = {Games are abstractions of the real world, where artificial agents learn to compete and cooperate with other agents. While significant achievements have been made in various perfect- and imperfect-information games, DouDizhu (a.k.a. Fighting the Landlord), a three-player card game, is still unsolved. DouDizhu is a very challenging domain with competition, collaboration, imperfect information, large state space, and particularly a massive set of possible actions where the legal actions vary significantly from turn to turn. Unfortunately, modern reinforcement learning algorithms mainly focus on simple and small action spaces, and not surprisingly, are shown not to make satisfactory progress in DouDizhu. In this work, we propose a conceptually simple yet effective DouDizhu AI system, namely DouZero, which enhances traditional Monte-Carlo methods with deep neural networks, action encoding, and parallel actors. Starting from scratch in a single server with four GPUs, DouZero outperformed all the existing DouDizhu AI programs in days of training and was ranked the first in the Botzone leaderboard among 344 AI agents. Through building DouZero, we show that classic Monte-Carlo methods can be made to deliver strong results in a hard domain with a complex action space. The code and an online demo are released at https://github.com/kwai/DouZero with the hope that this insight could motivate future work.} }

以下是主要代碼:

import collections import itertools################## 檢查這些牌是不是連續的序列 ################## def is_continuous_seq(move):i = 0while i < len(move) - 1: # 遍歷排序好的牌,看相鄰兩張是否大小差值為1if move[i+1] - move[i] != 1:return Falsei += 1return True################## 獲取出牌的種類和大小 ################## def get_move_type(move):move_size = len(move)move_dict = collections.Counter(move) # 一個用來計數可哈希對象的字典子類# 它的len就是move里值/牌種類的數量(比如有3和4那len就是2,只有3那len就是1)if move_size == 0: # 過牌return {'type': 0}if move_size == 1: # 單張return {'type': 1, 'rank': move[0]}if move_size == 2:if move[0] == move[1]: # 對子return {'type': 2, 'rank': move[0]}elif move == [20, 30]: # 王炸return {'type': 5}else: # 違規出法return {'type': 15}if move_size == 3: # 三張(不帶)if len(move_dict) == 1:return {'type': 3, 'rank': move[0]}else: # 違規出法return {'type': 15}if move_size == 4:if len(move_dict) == 1: # 炸彈return {'type': 4, 'rank': move[0]}elif len(move_dict) == 2: # 三帶一if move[0] == move[1] == move[2] or move[1] == move[2] == move[3]:return {'type': 6, 'rank': move[1]}else: # 違規出法return {'type': 15}else: # 違規出法return {'type': 15}if is_continuous_seq(move): # 順子return {'type': 8, 'rank': move[0], 'len': len(move)}if move_size == 5:if len(move_dict) == 2: # 三帶二return {'type': 7, 'rank': move[2]}else: # 違規出法return {'type': 15}count_dict = collections.defaultdict(int)for c, n in move_dict.items(): # 遍歷每個卡面值-計數對count_dict[n] += 1 # 看每個計數有多少張卡if move_size == 6: # 四帶兩單if (len(move_dict) == 2 or len(move_dict) == 3) and count_dict.get(4) == 1 and \(count_dict.get(2) == 1 or count_dict.get(1) == 2):return {'type': 13, 'rank': move[2]}# 四帶兩對if move_size == 8 and (((len(move_dict) == 3 or len(move_dict) == 2) and(count_dict.get(4) == 1 and count_dict.get(2) == 2)) or count_dict.get(4) == 2):return {'type': 14, 'rank': max([c for c, n in move_dict.items() if n == 4])}mdkeys = sorted(move_dict.keys())if len(move_dict) == count_dict.get(2) and is_continuous_seq(mdkeys):# 飛機(連對)return {'type': 9, 'rank': mdkeys[0], 'len': len(mdkeys)}if len(move_dict) == count_dict.get(3) and is_continuous_seq(mdkeys):# 火箭(連續三不帶)return {'type': 10, 'rank': mdkeys[0], 'len': len(mdkeys)}# 檢查三帶一火箭和三帶二火箭if count_dict.get(3, 0) >= 2:serial_3 = list()single = list()pair = list()for k, v in move_dict.items():if v == 3:serial_3.append(k)elif v == 1:single.append(k)elif v == 2:pair.append(k)else: # 違規出法return {'type': 15}serial_3.sort()if is_continuous_seq(serial_3):if len(serial_3) == len(single)+len(pair)*2:# 三帶一火箭return {'type': 11, 'rank': serial_3[0], 'len': len(serial_3)}if len(serial_3) == len(pair) and len(move_dict) == len(serial_3) * 2:# 三帶二火箭return {'type': 12, 'rank': serial_3[0], 'len': len(serial_3)}if len(serial_3) == 4: # 三帶一火箭if is_continuous_seq(serial_3[1:]):return {'type': 11, 'rank': serial_3[1], 'len': len(serial_3) - 1}if is_continuous_seq(serial_3[:-1]):return {'type': 11, 'rank': serial_3[0], 'len': len(serial_3) - 1}return {'type': 15} # 違規出法################## 生成指定長度的指定卡牌的所有組合 ################## def select(cards, num):return [list(i) for i in itertools.combinations(cards, num)]################## 生成可行出牌的類 ################## class MovesGener(object):"""This is for generating the possible combinations"""def __init__(self, cards_list):RealCard2EnvCard = {'3': 3, '4': 4, '5': 5, '6': 6, '7': 7,'8': 8, '9': 9, '10': 10, 'J': 11, 'Q': 12,'K': 13, 'A': 14, '2': 17, 'X': 20, 'D': 30}self.cards_list = []for i in cards_list:if i[-1] == '0':self.cards_list.append(RealCard2EnvCard['10'])else:self.cards_list.append(RealCard2EnvCard[i[-1]])self.cards_dict = collections.defaultdict(int)for i in self.cards_list:self.cards_dict[i] += 1self.single_card_moves = []self.gen_type_1_single()self.pair_moves = []self.gen_type_2_pair()self.triple_cards_moves = []self.gen_type_3_triple()self.bomb_moves = []self.gen_type_4_bomb()self.final_bomb_moves = []self.gen_type_5_king_bomb()# 生成順子def _gen_serial_moves(self, cards, min_serial, repeat=1, repeat_num=0):if repeat_num < min_serial: # at least repeat_num is min_serialrepeat_num = 0single_cards = sorted(list(set(cards)))seq_records = list()moves = list()start = i = 0longest = 1while i < len(single_cards):if i + 1 < len(single_cards) and single_cards[i + 1] - single_cards[i] == 1:longest += 1i += 1else:seq_records.append((start, longest))i += 1start = ilongest = 1for seq in seq_records:if seq[1] < min_serial:continuestart, longest = seq[0], seq[1]longest_list = single_cards[start: start + longest]if repeat_num == 0: # No limitation on how many sequencessteps = min_serialwhile steps <= longest:index = 0while steps + index <= longest:target_moves = sorted(longest_list[index: index + steps] * repeat)moves.append(target_moves)index += 1steps += 1else: # repeat_num > 0if longest < repeat_num:continueindex = 0while index + repeat_num <= longest:target_moves = sorted(longest_list[index: index + repeat_num] * repeat)moves.append(target_moves)index += 1return moves# 生成單張def gen_type_1_single(self):self.single_card_moves = []for i in set(self.cards_list):self.single_card_moves.append([i])return self.single_card_moves# 生成對子def gen_type_2_pair(self):self.pair_moves = []for k, v in self.cards_dict.items():if v >= 2:self.pair_moves.append([k, k])return self.pair_moves# 生成三不帶def gen_type_3_triple(self):self.triple_cards_moves = []for k, v in self.cards_dict.items():if v >= 3:self.triple_cards_moves.append([k, k, k])return self.triple_cards_moves# 生成炸彈def gen_type_4_bomb(self):self.bomb_moves = []for k, v in self.cards_dict.items():if v == 4:self.bomb_moves.append([k, k, k, k])return self.bomb_moves# 生成王炸def gen_type_5_king_bomb(self):self.final_bomb_moves = []if 20 in self.cards_list and 30 in self.cards_list:self.final_bomb_moves.append([20, 30])return self.final_bomb_moves# 生成三帶一def gen_type_6_3_1(self):result = []for t in self.single_card_moves:for i in self.triple_cards_moves:if t[0] != i[0]:result.append(t+i)return result# 生成三帶二def gen_type_7_3_2(self):result = list()for t in self.pair_moves:for i in self.triple_cards_moves:if t[0] != i[0]:result.append(t+i)return result# 生成順子def gen_type_8_serial_single(self, repeat_num=0):return self._gen_serial_moves(self.cards_list, 5, repeat=1, repeat_num=repeat_num)# 生成飛機(連對)def gen_type_9_serial_pair(self, repeat_num=0):single_pairs = list()for k, v in self.cards_dict.items():if v >= 2:single_pairs.append(k)return self._gen_serial_moves(single_pairs, 3, repeat=2, repeat_num=repeat_num)# 生成三不帶火箭def gen_type_10_serial_triple(self, repeat_num=0):single_triples = list()for k, v in self.cards_dict.items():if v >= 3:single_triples.append(k)return self._gen_serial_moves(single_triples, 2, repeat=3, repeat_num=repeat_num)# 生成三帶一火箭def gen_type_11_serial_3_1(self, repeat_num=0):serial_3_moves = self.gen_type_10_serial_triple(repeat_num=repeat_num)serial_3_1_moves = list()for s3 in serial_3_moves: # s3 is like [3,3,3,4,4,4]s3_set = set(s3)new_cards = [i for i in self.cards_list if i not in s3_set]# Get any s3_len items from cardssubcards = select(new_cards, len(s3_set))for i in subcards:serial_3_1_moves.append(s3 + i)return list(k for k, _ in itertools.groupby(serial_3_1_moves))# 生成三帶二火箭def gen_type_12_serial_3_2(self, repeat_num=0):serial_3_moves = self.gen_type_10_serial_triple(repeat_num=repeat_num)serial_3_2_moves = list()pair_set = sorted([k for k, v in self.cards_dict.items() if v >= 2])for s3 in serial_3_moves:s3_set = set(s3)pair_candidates = [i for i in pair_set if i not in s3_set]# Get any s3_len items from cardssubcards = select(pair_candidates, len(s3_set))for i in subcards:serial_3_2_moves.append(sorted(s3 + i * 2))return serial_3_2_moves# 生成四帶兩單def gen_type_13_4_2(self):four_cards = list()for k, v in self.cards_dict.items():if v == 4:four_cards.append(k)result = list()for fc in four_cards:cards_list = [k for k in self.cards_list if k != fc]subcards = select(cards_list, 2)for i in subcards:result.append([fc]*4 + i)return list(k for k, _ in itertools.groupby(result))# 生成四帶兩對def gen_type_14_4_22(self):four_cards = list()for k, v in self.cards_dict.items():if v == 4:four_cards.append(k)result = list()for fc in four_cards:cards_list = [k for k, v in self.cards_dict.items()if k != fc and v >= 2]subcards = select(cards_list, 2)for i in subcards:result.append([fc] * 4 + [i[0], i[0], i[1], i[1]])return result# 生成所有可能的出牌方式def gen_moves(self):moves = []moves.extend(self.gen_type_1_single())moves.extend(self.gen_type_2_pair())moves.extend(self.gen_type_3_triple())moves.extend(self.gen_type_4_bomb())moves.extend(self.gen_type_5_king_bomb())moves.extend(self.gen_type_6_3_1())moves.extend(self.gen_type_7_3_2())moves.extend(self.gen_type_8_serial_single())moves.extend(self.gen_type_9_serial_pair())moves.extend(self.gen_type_10_serial_triple())moves.extend(self.gen_type_11_serial_3_1())moves.extend(self.gen_type_12_serial_3_2())moves.extend(self.gen_type_13_4_2())moves.extend(self.gen_type_14_4_22())return moves

以上就是游戲邏輯用到的所有代碼了!

結束語

寫AI的時候比較懶事情比較多,沒去研究怎么給DouZero寫個API調用這個很強的AI,也沒自己寫比較有技術含量的AI。國際象棋和井字棋用到的minmax和alpha-beta這種AI算法好像不太能勝任(要自己調整/找很多參數),對于斗地主這個七分靠運氣的游戲來說隨機選擇是性價比最高的了。感興趣的小伙伴可以嘗試自己研究下這種有團隊協作、游戲信息半透明、規則較多的AI該怎么寫(提前對研究出來的大佬說太強了)。
平時我們自己打斗地主的一些額外規則(比如三個人都不叫地主就重新洗牌,贏的人先叫地主,其他人可以搶地主,下籌碼等等)和甚至某些基礎規則(前兩個人都過牌那么你就不能過牌),我都沒添加到游戲中,因為這些是bug游戲特性。
本系列的下一篇博客將會展示如何在前端用tkinter和pygame寫游戲界面并調用后端邏輯,敬請期待!有各種問題和見解也歡迎評論或者私信!

總結

以上是生活随笔為你收集整理的用python写一个有AI的斗地主游戏(二)——简述后端代码和思路的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

色激情五月 | 黄色免费视频在线观看 | 又爽又黄又无遮挡网站动态图 | 在线亚洲午夜片av大片 | 久久免费av| 亚洲成人av电影 | 91麻豆精品国产 | 日韩中文字幕免费视频 | 中文字幕在线观看免费高清完整版 | 国产精品原创视频 | 中文字幕亚洲在线观看 | 日韩久久激情 | 欧美日韩精品在线一区二区 | 中文字幕高清在线播放 | 偷拍精品一区二区三区 | 亚洲视频免费在线 | 操操综合 | 精品国产一区在线观看 | 毛片基地黄久久久久久天堂 | 国产成人精品日本亚洲999 | 国产高清精 | 国产成人精品一区一区一区 | 成人免费影院 | 波多野结衣电影久久 | 天天天天天天天天操 | 国产一区二区在线免费视频 | 亚洲在线观看av | 91视频a| 久久xx视频 | 最近中文字幕在线播放 | 成年人视频在线观看免费 | 人人爽人人爽人人爽学生一级 | 人人玩人人添人人澡97 | 婷婷久久久| 在线观看精品国产 | 91精品国产成 | 四虎天堂 | 91色一区二区三区 | 91精品久久久久久综合乱菊 | 欧美日韩一区二区三区视频 | 九九热在线观看视频 | 天天操夜夜操夜夜操 | 狠狠干狠狠久久 | 亚洲精品乱码久久久久久蜜桃欧美 | 视频一区二区三区视频 | 99久久精品免费看国产 | 国产精品一区二区久久精品爱微奶 | 五月婷婷六月综合 | 992tv在线| 久久综合国产伦精品免费 | 在线视频 影院 | 国产视频在线一区二区 | av一区二区在线观看中文字幕 | 国产一级在线视频 | 中文字幕电影在线 | 久久久久久久久久久久久国产精品 | 中文字幕一区二区三区四区视频 | 精品一区二区av | 激情综合五月婷婷 | 黄色三几片 | 91av在线播放视频 | 精品久久久久一区二区国产 | 日韩在线免费高清视频 | 午夜在线观看影院 | 日韩午夜在线 | 91成版人在线观看入口 | 9999精品| 怡春院av| 久久成年人视频 | 91完整版 | 日本精品中文字幕 | 久久免费视频在线观看 | 亚洲一级片| 国产午夜激情视频 | 玖草在线观看 | 欧美久久久久久 | 色五婷婷 | 国产精品免费在线观看视频 | 国产玖玖精品视频 | 久久视频精品在线 | 国产精品久久久久久久免费大片 | 久草www| 欧美少妇的秘密 | 中文字幕国内精品 | 免费看片网址 | 久免费视频 | 久久热亚洲 | 激情五月综合 | 中国一级片视频 | 成人三级av | 精久久久久 | 国产免费观看久久黄 | www.婷婷com | 在线免费观看国产 | 91成人在线观看高潮 | 国产日韩精品在线 | 久久免费a | 免费看特级毛片 | 高清不卡毛片 | 久久99视频 | 91丨九色丨丝袜 | 国产美女免费观看 | 国产精品美女免费看 | av黄网站 | 天天操夜夜干 | 美女搞黄国产视频网站 | 国产69精品久久久久久 | 狠狠狠色丁香婷婷综合久久88 | 在线a视频| 91中文字幕网 | 欧美一区二区免费在线观看 | 国产一级一片免费播放放 | 香蕉视频18 | 欧美激情视频免费看 | 91精品视频观看 | 天天色天天草天天射 | 国内精品免费久久影院 | 久热精品国产 | 在线观看视频三级 | 国产高清精品在线观看 | 伊人春色电影网 | 午夜aaaa| av中文字幕av| 婷香五月 | 97色在线观看免费视频 | 亚洲va天堂va欧美ⅴa在线 | 特级免费毛片 | 国产日产在线观看 | 综合网五月天 | 中文字幕日韩在线播放 | 国产精品女同一区二区三区久久夜 | 欧美视频一区二 | 免费视频a | 免费福利在线 | 久久久国产精品一区二区中文 | 国产精品毛片一区二区在线 | 国产高清在线a视频大全 | 人人干天天干 | 日本三级久久久 | 成人免费一级片 | 91天堂影院| 国产精品亚洲片夜色在线 | 亚洲激情在线视频 | 久久久久久久久久久免费视频 | 欧美一区在线观看视频 | 黄色特级片 | av韩国在线 | 国产午夜视频在线观看 | 激情五月看片 | 久久公开视频 | 综合网av | av在线小说 | 国产专区日韩专区 | 中文字幕一区二区三区在线视频 | 69xx视频| 天堂视频中文在线 | 欧美一级在线观看视频 | 午夜精品久久久久久久99婷婷 | 色综合久久天天 | 国产成人精品福利 | 激情婷婷色 | 最新一区二区三区 | 偷拍福利视频一区二区三区 | 久久精品中文 | 天操夜夜操 | 91日韩在线 | 97国产电影 | 久久字幕精品一区 | 天天操天天摸天天干 | 色偷偷88888欧美精品久久 | 国产裸体永久免费视频网站 | 黄色美女免费网站 | 国产亚洲欧美一区 | 91在线免费播放视频 | 日本中文字幕系列 | 免费人成网 | 91久久久久久国产精品 | 黄色大片日本 | 免费av的网站 | 99999精品视频 | 夜夜夜夜猛噜噜噜噜噜初音未来 | 中文字幕中文中文字幕 | 色综合久久久久综合99 | 91视频com | 国产精品成人一区二区三区吃奶 | 性色av一区二区三区在线观看 | 超碰97免费 | 国产精品原创在线 | 欧美男同网站 | av在线收看| 欧美日韩国产色综合一二三四 | 99国产免费网址 | 又长又大又黑又粗欧美 | 久久久久久久久久久免费av | 三日本三级少妇三级99 | 五月开心色 | 最新91在线视频 | 日韩欧美在线中文字幕 | 欧美大片aaa | 国产黄色在线网站 | 亚洲电影免费 | 亚洲精品视频在线观看免费视频 | 免费观看一区二区 | 在线婷婷 | 久草免费在线视频观看 | 日韩一区二区三区观看 | 天天射天天爽 | 午夜久久久久久久 | 成人在线视频观看 | 国产成人一区二区啪在线观看 | 91成人破解版 | 96av麻豆蜜桃一区二区 | 国产一级淫片在线观看 | 国产小视频免费在线观看 | 久久午夜网| 中文字幕在线免费看 | 亚洲精品女人久久久 | 国产精品k频道 | 91亚洲精品国产 | 成人a在线 | 欧美高清成人 | 免费看的黄色小视频 | 日韩三级.com | 免费能看的黄色片 | 午夜国产影院 | 97理论片 | 免费福利小视频 | 青青射 | 免费视频国产 | 久久精品爱爱视频 | 国产伦精品一区二区三区四区视频 | 黄色国产成人 | 国产精品久久久久久久久久久久午 | 欧美日韩高清一区二区 国产亚洲免费看 | 日韩在线视频网 | 中文字幕视频观看 | 69亚洲精品 | 亚洲精品国产品国语在线 | 色一色在线 | 在线观看视频在线 | 在线观看黄色的网站 | 国模精品一区二区三区 | 日日摸日日添日日躁av | 日日夜夜天天人人 | 亚洲一区二区精品3399 | 999视频在线播放 | 在线国产专区 | 中文字幕欧美日韩va免费视频 | 国产精久久久 | 久久免费观看视频 | 国产一级特黄毛片在线毛片 | 在线亚洲成人 | 欧美精品在线视频 | av在线播放免费 | 91正在播放 | 国产99久 | 亚洲黑丝少妇 | 国产91精品一区二区麻豆网站 | 国产午夜精品一区二区三区 | 在线免费视频你懂的 | 日韩一区二区三区高清免费看看 | 久久久精品免费观看 | 手机在线永久免费观看av片 | www四虎影院 | 麻豆精品在线视频 | 亚洲欧美在线综合 | 在线观看亚洲国产精品 | 国产丝袜高跟 | 激情网五月天 | 涩涩网站在线 | 在线99 | 久久久精品国产一区二区电影四季 | 草在线视频 | 日本精品久久久久中文字幕5 | 国产精品免费观看久久 | 欧美激情视频一区二区三区免费 | 97视频在线观看视频免费视频 | 在线视频 你懂得 | 视频福利在线 | 九九视频免费在线观看 | 午夜精品三区 | 亚洲精品视频二区 | 国语对白少妇爽91 | 伊在线视频 | 国产高清免费在线播放 | 日韩中文字幕在线看 | 五月天久久婷婷 | 日韩欧美视频 | 国产一区不卡在线 | 久草视频视频在线播放 | 亚洲精品国产日韩 | 中文字幕av最新更新 | 五月天天av | 欧美成人精品三级在线观看播放 | 免费看黄网站在线 | 日韩毛片一区 | 久久久久久久久久久久影院 | 亚洲成a人片77777kkkk1在线观看 | 亚洲精品99久久久久中文字幕 | 日韩中文字幕网站 | 四虎在线免费观看 | 久久久男人的天堂 | 日韩电影久久久 | 免费看国产曰批40分钟 | av免费在线免费观看 | 亚洲国产精品va在线看黑人 | 亚洲精品18日本一区app | 免费人成在线观看 | 亚洲视频在线免费观看 | 亚洲区另类春色综合小说校园片 | 国产精品国产毛片 | 亚洲黄色在线看 | 日韩欧美精品一区 | 国产精品v欧美精品 | 国产小视频在线观看 | 国内精品久久久久久久影视简单 | 99热精品久久 | 久久国产精品成人免费浪潮 | 亚洲狠狠丁香婷婷综合久久久 | 在线有码中文 | 9999精品免费视频 | 91九色porny蝌蚪视频 | 亚洲人成在线电影 | 手机成人在线电影 | 国产专区视频在线观看 | 黄色小说在线观看视频 | 中文字幕人成人 | 色狠狠一区二区 | 久久免费毛片 | 国产成人免费 | 黄色av高清 | www.少妇| 亚洲资源在线 | 久草免费在线视频 | 美女黄频免费 | 欧美一级片免费在线观看 | 69欧美视频 | 黄色a视频免费 | 国产一区二区综合 | 懂色av一区二区在线播放 | 久草视频在线免费播放 | 成人综合婷婷国产精品久久免费 | 欧美网站黄色 | 久久国产精品色婷婷 | 九色精品| 欧美日韩中 | 久久人人爽人人片av | 亚洲aⅴ久久精品 | 日日夜夜狠狠操 | 欧美精品在线观看免费 | 在线a亚洲视频播放在线观看 | 黄色av电影| 亚洲欧美在线视频免费 | 九九在线高清精品视频 | 亚洲激情在线观看 | 欧美精品v国产精品v日韩精品 | 鲁一鲁影院 | 欧美a免费 | 天天射综合 | 国产91精品久久久久 | 日本三级久久久 | 九九免费在线看完整版 | 99热999| 在线播放国产精品 | 国产91成人 | 国产成a人亚洲精v品在线观看 | 亚洲波多野结衣 | 色91在线视频 | 亚洲精品午夜久久久久久久久久久 | 黄色的网站免费看 | 国产精品va在线 | 天天干天天操av | 在线视频 一区二区 | 天天看天天干 | 成人福利在线播放 | 九九热免费精品视频 | 日日干天天 | 亚洲综合色视频在线观看 | 国产精品99久久久久久人免费 | 九色视频自拍 | 日韩成人xxxx | 久久精品99国产国产精 | 不卡视频国产 | www国产亚洲 | 久久电影网站中文字幕 | 美女久久久久久久 | 欧美激情在线网站 | www.狠狠色| 国产一区在线免费观看 | 久久久国产影院 | 国产免费人成xvideos视频 | 久久嗨 | 中文字幕在线一区二区三区 | 国产在线综合视频 | 视频 天天草 | 久久久精品久久日韩一区综合 | 日韩精品免费在线 | 2019中文字幕第一页 | 欧美极品少妇xxxx | 狠狠干.com| 国产96视频 | 亚洲第一伊人 | 最新av中文字幕 | 久久在线免费观看视频 | 国产高清在线精品 | 免费看污片 | 人人干干人人 | 在线免费观看国产 | 特级aaa毛片 | 免费国产在线精品 | 国内丰满少妇猛烈精品播 | 夜夜躁狠狠躁日日躁视频黑人 | 在线观看一区二区视频 | 狠狠地日 | 日韩av电影网站在线观看 | 精品视频免费观看 | 国产高清一区二区 | 天天操天天干天天操天天干 | 91亚洲精品久久久蜜桃 | 在线播放日韩av | 久久99久久精品国产 | 欧美日韩一区久久 | 欧美一性一交一乱 | 久操中文字幕在线观看 | 欧美性粗大hdvideo | 黄色成人91 | 国产精品久久网 | 亚洲无毛专区 | 在线观看免费一区 | 国产又粗又猛又爽又黄的视频免费 | 日韩精品久久久久久久电影99爱 | 国产黄色在线网站 | 精品视频专区 | 亚洲一区视频免费观看 | 人人精品久久 | 免费在线电影网址大全 | 24小时日本在线www免费的 | 久久久精品国产一区二区电影四季 | 91成人天堂久久成人 | 97在线播放| 一二区精品 | 国产h在线观看 | 九草在线观看 | 亚洲国产人午在线一二区 | www视频在线观看 | 免费激情网 | 国产黄a三级三级 | 国产精品免费久久久久影院仙踪林 | 视频一区二区三区视频 | 国产精品久久艹 | 亚洲精品在线视频观看 | 一区二区三区在线播放 | 91久久久久久国产精品 | 美女国产| 久久成年人 | 久草在线视频看看 | 日韩成人在线免费观看 | 国产精品视频不卡 | 操少妇视频 | 日韩在线播放av | 国产高清视频在线播放一区 | 91成人精品一区在线播放 | 777奇米四色| 九九精品视频在线观看 | 欧美一级片在线免费观看 | 日韩一区精品 | 国产精品中文久久久久久久 | 在线va视频| 99热精品国产一区二区在线观看 | 天天舔天天射天天操 | 日韩欧美区 | av在线电影网站 | 欧美一二三在线 | 91热爆在线观看 | 99激情网 | 中文字幕在线字幕中文 | 成人免费色 | 久久久精品久久日韩一区综合 | 精品美女国产在线 | 激情伊人五月天久久综合 | 日韩欧美在线视频一区二区 | 免费在线看成人av | 91av免费在线观看 | 日韩欧美综合在线视频 | 亚洲精品日韩av | 波多野结衣精品视频 | 国产在线视频不卡 | 久久久久久激情 | 九九在线高清精品视频 | 久久艹人人 | 日本99干网| 欧美一级视频免费 | 成人黄色av网站 | 在线免费国产视频 | 亚洲涩涩色 | 99爱在线观看 | 婷婷久久亚洲 | www.干| 在线观看成人网 | 欧美成人999 | 国产日韩欧美在线 | 成人一区影院 | 国产免费一区二区三区网站免费 | 亚洲国产精品成人va在线观看 | 久久久一本精品99久久精品 | 一级黄色片在线观看 | 成人免费在线播放视频 | 国产一级片久久 | 日韩欧美91| 国产黄色高清 | 超碰97中文 | 婷婷六月综合网 | 亚洲伦理一区二区 | 精品久久网站 | 国产精品一区二区在线看 | 青青河边草免费观看 | 欧美天堂视频在线 | 国产精品久久久久久欧美 | 在线成人一区 | 欧美日韩免费看 | 国产一区二区三区在线免费观看 | 国产精品1区 | 久久精品视频在线观看免费 | 99免费精品视频 | 综合网婷婷| 狠狠色免费 | 久久99热这里只有精品国产 | 国产精品99免视看9 国产精品毛片一区视频 | 一区二三国产 | 91视频在线观看下载 | 国产精品成人国产乱 | 日韩a在线看 | 亚洲午夜精品在线观看 | 911精品视频| 超碰大片 | 免费在线观看av不卡 | 国产一区成人 | 久久亚洲综合国产精品99麻豆的功能介绍 | 国产一区二区三区在线免费观看 | wwwav视频| 免费激情网 | 天天躁天天操 | a成人v在线 | 免费热情视频 | 中文字幕亚洲欧美日韩 | 免费看片日韩 | 高清av免费观看 | 人人看黄色 | 国产日韩精品欧美 | 欧美日韩国产一区二区三区在线观看 | 久草久草视频 | 国产区精品视频 | 视频在线观看99 | 色综合网在线 | 韩国一区二区三区视频 | 你操综合 | 在线播放 日韩专区 | av免费在线看网站 | 国产精品久久久久久久久久东京 | 免费观看第二部31集 | 亚洲精品黄色在线观看 | 色鬼综合网 | 久久久久久久久久久久久9999 | 国产不卡在线观看 | 欧美综合在线观看 | 久久久久久久精 | 国产婷婷一区二区 | 久久久久久久久久免费 | 四虎在线免费视频 | 国产精品福利无圣光在线一区 | 亚洲理论电影网 | 久草视频中文 | 精品视频97 | 国产一区二区三区久久久 | 99视频免费观看 | 婷婷丁香在线 | 亚洲精品视频免费观看 | 国产精品一区二区三区四区在线观看 | 色综合小说 | 人人精品久久 | 国产精品欧美日韩 | 人人精久 | 国产视频2区 | 在线免费av网 | 亚州性色 | 特级大胆西西4444www | 亚洲电影影音先锋 | 日韩欧美一区二区三区视频 | 亚洲女裸体| 国产91在线播放 | 麻豆国产在线视频 | 免费日韩电影 | 又长又大又黑又粗欧美 | 成人小视频免费在线观看 | 色婷婷中文 | 日韩欧美在线第一页 | 国产精品免费久久久久久 | 伊人黄 | 国产在线不卡一区 | 免费的国产精品 | 9i看片成人免费看片 | 天堂麻豆 | 欧美韩日在线 | 91伊人久久大香线蕉蜜芽人口 | 午夜成人影视 | 欧美日韩有码 | 国产成人精品一区二区三区网站观看 | 黄a网站| 91成人在线视频 | 中文字幕永久在线 | 成人精品在线 | 亚洲欧美日韩一二三区 | 久久久99精品免费观看乱色 | 黄色成人91 | 精品久久久免费视频 | 天天碰天天操 | 97在线观看免费视频 | 美女视频网| 免费看片色| 成人免费大片黄在线播放 | 国产精品欧美在线 | 免费观看黄色12片一级视频 | 成年人免费观看国产 | 香蕉视频在线免费 | 久久久久久久久久久成人 | 中文在线免费一区三区 | 久久久久久欧美二区电影网 | 人人爽久久久噜噜噜电影 | 国内精品久久久久影院一蜜桃 | 黄色视屏av | 国产在线观看高清视频 | 日本在线观看视频一区 | 日韩视频在线观看免费 | 免费在线观看av网址 | 久久美女免费视频 | 一区二区三区免费在线 | av网站播放| 国产91九色蝌蚪 | 成人黄色一级视频 | 日韩狠狠操 | 国产对白av| 激情视频在线高清看 | 国产精品久久久久久久久久久久午夜 | 久久国产影视 | 91精品少妇偷拍99 | 欧美精彩视频在线观看 | 日韩最新中文字幕 | 天天干夜夜想 | 色综合激情久久 | 在线成人免费 | 西西4444www大胆无视频 | 欧美一级片免费观看 | 在线国产欧美 | 国产成人精品一区二区三区在线观看 | 天天碰天天操 | 成人免费共享视频 | 久草视频视频在线播放 | 色综合咪咪久久网 | 丝袜av一区| 国内久久精品视频 | 欧美视频国产视频 | 久久久99国产精品免费 | 亚洲欧美日韩在线看 | 91av免费观看 | 亚洲国产成人久久 | 黄色软件视频网站 | 久久精品久久精品久久39 | 免费开视频 | 黄色av网站在线免费观看 | 美女在线观看av | 黄色的网站在线 | 国产一级免费av | 91久久精品一区二区二区 | 国产精品久久久久久久妇 | 一本到在线 | 美女视频国产 | av电影中文字幕在线观看 | 精品av网站 | 丁香在线观看完整电影视频 | 欧美精品在线观看免费 | 久久99精品久久久久久 | 黄色影院在线免费观看 | 国产成人黄色av | 精品国产欧美一区二区三区不卡 | 成年人免费电影在线观看 | 国产美女在线精品免费观看 | 九九热在线视频免费观看 | 在线影院av | 久久调教视频 | 久久精品国产亚洲精品2020 | 激情伊人五月天久久综合 | 一区二区三区日韩在线观看 | 国产精品 日韩 欧美 | 狠狠色伊人亚洲综合成人 | 婷婷视频在线观看 | 国色天香第二季 | 综合婷婷 | 中文在线最新版天堂 | 国产免费观看av | 一级精品视频在线观看宜春院 | 丰满少妇高潮在线观看 | 国产午夜精品理论片在线 | 天天爽天天做 | a级成人毛片 | av网站免费线看精品 | 国产精品麻豆99久久久久久 | 精品一区二区免费视频 | 在线观看亚洲免费视频 | 久久人人爽人人爽人人 | 国产一级黄色免费看 | 精品久久久久久久久久 | 9999精品免费视频 | 久精品一区| 亚洲资源在线网 | 免费观看国产视频 | 国产精品videossex国产高清 | www夜夜操com| 日韩中文字幕网站 | 国产精品久久久久久久午夜 | 黄色软件在线观看免费 | 成人在线一区二区 | 国产日韩欧美视频在线观看 | 激情一区二区三区欧美 | www.伊人网| 中文字幕一区二区三区四区视频 | 麻豆视频免费播放 | av免费在线网站 | 91热爆在线观看 | 国产不卡在线视频 | 菠萝菠萝在线精品视频 | 91成人网在线观看 | 久草视频在线新免费 | 成年人在线免费看片 | 丝袜美腿在线播放 | 欧美一区日韩一区 | 在线一二三区 | 日韩在线一级 | 欧美日韩高清一区二区三区 | 天天操天天操天天操天天操天天操天天操 | 视频99爱 | 香蕉视频色| 天天干天天操天天射 | 午夜精选视频 | 亚洲一级久久 | 8x成人免费视频 | av手机在线播放 | 欧美另类高清 | 国产精品亚洲人在线观看 | 日韩精品短视频 | 国产日韩欧美精品在线观看 | 国产精品国产三级国产aⅴ9色 | 国产精品久久久久久久7电影 | 麻豆传媒在线视频 | 麻豆视频在线免费观看 | 国产精品久久久久久久久久 | 亚洲日本一区二区在线 | 国产专区在线视频 | 日本狠狠干| 久草视频2 | 手机色在线 | 欧美日韩视频在线观看免费 | 免费的黄色的网站 | 国产精品毛片一区视频播 | 成人久久免费视频 | 亚洲二区精品 | 欧美特一级 | 中文字幕精品三区 | 欧美在线不卡一区 | av电影免费在线播放 | 国内外成人在线 | 中文国产字幕在线观看 | 日韩精品在线一区 | 国产一二区免费视频 | 日本三级吹潮在线 | 综合激情网 | 欧美一级激情 | 人人干人人超 | 久久精品毛片 | 日本99热 | 91精品区 | 玖玖视频免费在线 | 久久国产高清视频 | 午夜视频二区 | 日韩免费视频线观看 | 亚洲涩涩网 | 黄色精品在线看 | 国产精品对白一区二区三区 | 成年人视频在线观看免费 | av电影免费观看 | 最近更新的中文字幕 | 免费久久网站 | 国产一区高清在线 | 正在播放国产精品 | 亚洲国内精品视频 | 美女视频免费精品 | 五月婷婷色 | 亚洲精品美女久久久 | 亚洲国产精品视频在线观看 | 五月激情久久久 | 日本久草电影 | 98涩涩国产露脸精品国产网 | 久久99在线观看 | av 一区 二区 久久 | 日韩精品亚洲专区在线观看 | 国产视频一级 | 色在线高清 | 黄色av一区 | 日本69hd | 精品国产一区二区三区久久久 | 国产一区二区高清视频 | 国产日韩精品久久 | 国产三级国产精品国产专区50 | 国产97在线视频 | 久久一级电影 | 亚洲国产精品视频在线观看 | 国产黄色a| 黄色成人免费电影 | 99国产视频 | 国产精品v欧美精品v日韩 | 国内精品久久久久久久影视麻豆 | 亚洲精品999 | 亚洲一级久久 | 精品电影一区 | 欧美日韩伦理在线 | 欧美另类亚洲 | 成年人在线电影 | 91高清完整版在线观看 | 91精品一区二区在线观看 | 97福利在线| 久碰视频在线观看 | 中文字幕免费高清在线 | 国产视频2区 | 国产在线资源 | 日日干影院 | www.狠狠插.com| 99视频导航 | 国产白浆在线观看 | 亚洲天堂精品视频 | 91tv国产成人福利 | 国产aaa免费视频 | 欧美va天堂在线电影 | 亚洲 欧美 成人 | 中文字幕精品一区二区精品 | 成人一区二区在线观看 | 亚洲精品国产高清 | 色综合天| 在线精品在线 | 日韩精品一区二 | 久久久穴| 九九热只有精品 | 激情久久久久久久久久久久久久久久 | 深爱激情综合 | 久久久不卡影院 | 久久激情小视频 | 国产精品中文字幕在线观看 | 亚洲精品视频网址 | 国产成人免费在线观看 | 国产在线一卡 | 五月婷av | 欧美少妇bbwhd | 奇米影视777四色米奇影院 | 中文字幕在线看 | www.久久婷婷 | 婷婷色视频 | 97国产精品一区二区 | 黄色性av | 天天干天天做天天爱 | 国产亚洲在线 | 四虎5151久久欧美毛片 | 成全在线视频免费观看 | 精品日韩中文字幕 | 丁香花在线观看视频在线 | 欧美日韩精品在线一区二区 | 成年人网站免费在线观看 | 97超碰人人模人人人爽人人爱 | 久久婷婷精品视频 | www.夜色.com| 国产一区免费在线 | h网站免费在线观看 | 国产精品久久久久影视 | 97在线视频网站 | 亚洲网站在线 | www.玖玖玖| 久草爱| 久久女同性恋中文字幕 | 91视频91蝌蚪 | 中文字幕4 | 干天天 | 国产99久久久国产精品免费二区 | 久久久久成人精品 | 免费一级片久久 | 免费在线中文字幕 | 青青啪| 国产精品va在线 | 在线观看一 | 午夜av一区 | 久久激情综合网 | 精品一区二区在线播放 | 日日躁夜夜躁aaaaxxxx | 日韩二三区| 99热这里只有精品1 av中文字幕日韩 | 久久黄网站 | 香蕉免费 | 成人 国产 在线 | 国产精品av在线免费观看 | www.久久久com | 精品99在线视频 | 久久人人精 | 久久精品99国产 | 日日躁夜夜躁xxxxaaaa | 人人看看人人 | 久久99在线视频 | va视频在线 | av成人在线电影 | 欧美在线不卡一区 | 国产成人av电影在线观看 | 亚洲午夜精品久久久久久久久 | 中文字幕av一区二区三区四区 | 久久久久久久久久久久亚洲 | 国产精品自在欧美一区 | 免费在线观看中文字幕 | 日韩在线视频网 | 亚洲日本一区二区在线 | 日本久久免费视频 | 国产高清精品在线观看 | 在线免费av网 | 欧美午夜久久 | 天天做日日爱夜夜爽 | av一区二区三区在线 | 狂野欧美激情性xxxx | 国产91精品一区二区绿帽 | 国语对白少妇爽91 | 中文字幕丝袜美腿 | 久久久婷 | 国产精品综合久久久久 | 又色又爽的网站 | 久久久久久久久久久久电影 | 91精品999| 99精品久久久久 | 精品一区91| 亚洲成人动漫在线观看 | 天天曰 | 亚洲国产三级在线 | 国产免费黄视频在线观看 | 精品一区二区综合 | 精品国产一区二区三区久久久久久 | 免费亚洲婷婷 | 激情网站 | 天天干天天拍天天操 | 手机成人在线 | 黄色的网站在线 | 99久久99久久| 日韩精品视频免费在线观看 | 中文字幕在线一区二区三区 | 久久国产精品影视 | 亚洲高清久久久 | 日韩午夜高清 | 狠狠操操操 | 久久大香线蕉app | 国产精品一区二区三区在线免费观看 | 日韩欧美视频在线免费观看 | 精品在线观看一区二区 | 国产精品久久久久久电影 | 日韩免费三级 | 久久精品香蕉 | 911国产在线观看 | 69xx视频| 久草在线中文888 | 亚洲在线色 | 欧美a免费 | 天天插天天爽 | 这里只有精品视频在线 | 久久精品五月 | 激情视频区 | 亚洲 欧美变态 另类 综合 | 婷婷丁香激情综合 | 天天操天天射天天爱 | 欧美日韩激情网 | 麻豆视频一区 | 久草在线视频网站 | 精品久久久久久久久久久久久久久久 | 国产成人精品福利 | 国产精品久久久区三区天天噜 | 免费看一级特黄a大片 | 天天插天天狠 | 久久99视频免费观看 | 免费黄色特级片 | 精品视频久久久久久 | 国产精品一区二区你懂的 | 亚洲涩涩涩涩涩涩 | 四虎影视精品 | 五月天综合激情网 | 国内外成人免费在线视频 | 成年人毛片在线观看 | 亚洲aaa毛片| 久久不射影院 | 婷婷av资源| 久久精品久久精品久久精品 |