pyhton麻将胡牌听牌判断,pyhton麻将胡牌,pyhton麻将胡牌听牌


pyhton麻将胡牌听牌判断
第一版代码有缩进问题,第二版没有了;另外第二版在第一版的基础增加听牌的判断;

1.[代码][Python]代码

#-*- coding: utf-8 -*-import random'''' 麻将牌数据结构 万 1x | 筒 2x | 条 3x| 东西南北中发白 41-47'''class game():    TYPE = 10 # 只有万字牌(筒和条不放进来)    def __init__(self):        self.leave = []        self.user = []self.check = Check()        #self.leave_bak = []        self.create()    # 创建牌数据    def create(self):        for i in range(4):            start = game.TYPE            for j in range(start,start+9):                self.leave.append(j)            for k in range(41,48):                self.leave.append(k)    class Check():    def __init__(self):pass    def bar(self,_list):rs = self.findSame(_list,4)return rs        def bump(self,_list):rs = self.findSame(_list,3)return rs        def findSame(self,_list,num):return _list.count(_list[0]) == num    def eat(self,_list):return _list[1] == _list[0] + 1 and _list[1] == _list[2] - 1        def hasBar(self,_list):pass    def win(self,_list, j):if len(_list) == 0 : return Truefor i in _list:    #print _list    if _list[0] < 40: #只有字牌可以吃    if len(_list) >= 3 and self.eat(_list) : #常规吃判断    return self.win(_list[3:],j)        if len(_list) >= 6 : #11 22 33 三小对吃类型        _l = [_list,_list[2:],_list[4:]]        rs = False        for k in _l : rs = self.findSame(k,2)        if rs and self.eat([_list[0],_list[2],_list[4]]):        return self.win(_list[6:],j)    if self.bump(_list) : #碰return self.win(_list[3:],j)        if _list.count(_list[0]) == 2 and j == False : # 将j = Truereturn self.win(_list[2:],j)        break #不断的话会重复判断return Falseclass User():    def __init__(self,_uid):        self.uid = _uid        self.bird = []def main():    _game = game()    num = 200    for i in range(num):random.shuffle(_game.leave)_l = _game.leave[:14]_l.sort()rs = _game.check.win(_l,False)print i,_l,rs_game.create()            if __name__ == '__main__':    main()第二版:新增听牌判断如果落听Check.lis会有数据#-*- coding: utf-8 -*-import random'''' 麻将牌数据结构 万 1x | 筒 2x | 条 3x| 东西南北中发白 41-47'''class game():    TYPE = 10 # 只有万字牌(筒和条不放进来)    def __init__(self):        self.leave = []        self.user = []        self.check = Check()        #self.leave_bak = []        self.create()    # 创建牌数据    def create(self):        for i in range(4):            start = game.TYPE            for j in range(start,start+9):                self.leave.append(j)            for k in range(41,48):                self.leave.append(k)        #     def getBird(self):        random.shuffle(self.leave)        print 'last%s'%self.leave        self.user.append(User('roy'))        self.user.append(User('tt'))        for i in self.user:            i.bird = self.leave[:13]            i.bird.sort()            self.leave = self.leave[13:]            print 'user %s bird %s'%(i.uid,i.bird)        print 'next%s'%self.leaveclass Check():    def __init__(self):        self.gn = 0 # 排列组合数目 胡牌是五组        self.lis = []    def bar(self,_list):    rs = self.findSame(_list,4)    return rs        def bump(self,_list):    rs = self.findSame(_list,3)    return rs        def findSame(self,_list,num):    return _list.count(_list[0]) == num    def eat(self,_list):        _eat = None        _rs = None        iseat = False        if _list[1] == _list[0] + 1 and _list[1] == _list[2] - 1 :             _eat = _list[:3]            _rs = _list[3:]            iseat = True        if _list[2] == _list[1] + 1 and _list[2] == _list[3] and _list[2]==_list[4]-1:             _eat = [_list[0]]+[_list[2]]+[_list[4]]            _rs = _eat+_list[6:]            iseat = True        return (_eat,_rs,iseat)        def hasBar(self,_list):    pass    def checklis(self,_list):        if len(self.lis) > 0 : return False        if len(_list) > 3 : return False        if len(_list) < 3 : return True        def isLis(_l):            if _l[0] == _l[1] : return True            if _l[0] == _l[1] - 1 : return True            if _l[0] == _l[1] - 2 and (_l[0] + 1)%10 != 0 : return True        if isLis(_list) : return True        if isLis(_list[1:]) : return True        return False    def win(self,_list, j):        if len(_list) == 0 : return True        for i in _list:            #print _list,j            if i < 40: #只有48d3字牌可以吃                (_eat,_rs,iseat) = self.eat(_list)                if iseat : #常规吃判断                    self.gn += 1                    print 'get eat',_eat,_rs,j                    if self.win(_rs,j) : return True                    if self.checklis(_rs):                        self.lis = _rs                        return False                    else:                        break                if self.findSame(_list,3): #碰                self.gn += 1                print 'get bump',_list[:3],j                arr = _list[3:]                if self.win(arr,j) : return True                if self.checklis(arr):                    self.lis = arr                    return False                else:                    break                    if self.findSame(_list,2) and j == False : #将                j = True                self.gn += 1                print 'get j ',_list[:2],j                arr = _list[2:]                if self.win(arr,j) : return True                if self.checklis(arr) :                     print 'get j check',arr                    self.lis = arr                    return False                            return Falseclass User():    def __init__(self,_uid):        self.uid = _uid        self.bird = []def main():    _game = game()    _l = [11,11,12,12,13,13,16,16,16,17,17,18,41,41]    _game.check.gn = 0    rs = _game.check.win(_l,False)    gn = _game.check.gn    #lis = _game.check.lis    #_game.check.gn = 0    print _l,rs,gn,_game.check.lis    '''    num = 2000    for i in range(num):random.shuffle(_game.leave)_l = _game.leave[:14]_l.sort()rs = _game.check.win(_l,False)if rs : print i,_l,rs_game.create()    '''            if __name__ == '__main__':    main()

编橙之家文章,

评论关闭