`
hereson
  • 浏览: 1450021 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

麻将胡牌算法,python版本

阅读更多

#!/usr/bin/env python
#coding=utf-8
#######################################################
#C 语言版
#马勇波 陈欣庆
#解放军理工大学工程兵工程学院研究生二队,南京 210007)
#PYTHON版
#ixafei
#NJUPT
#######################################################



class Mahjong:
    def __init__(self):
        pass
   
   
    """判断是否胡牌"""
    def zp_HU(self,list):
        _kingPos=None
        _yuShu=None
        _kingExist=False
        _j=0
        #满足3,3,3,3,2模型
        for _p in list:
            _yuShu=_p[0]%3
            if _yuShu==1:
                return False
            if _yuShu==2:
                if(_kingExist):
                    return False
                _kingPos=_j
                _kingExist=True
            _j=_j+1
        #先计算没有将牌的LIST
        _j=0
        for _p in list:
            if _kingPos==_j:
                pass
            else:
                if not self.Analyze(_p,_j==3):
                    return False
            _j=_j+1
        #该列表中包含将牌,采用轮训迭代方式,效率较低
        #指示除掉将后能否通过
        _success=False
        _jlist=list[_kingPos]+[]
       
        _j=0
        for _card in _jlist:
            if _j==0:
                pass
            else:
                if _card>=2:
                    _jlist[_j]-=2
                    _jlist[0]-=2
                    if self.Analyze(_jlist,_kingPos==3):
                        _success=True
                    if _success:
                        break
            _j=_j+1
        return _success
   
   
    #分解为“刻” “顺”组合
    def Analyze(self,list,flag):
        if list[0]==0:
            return True
       
        #寻找第一张牌
        _j=0
        for _p in list:
            if _j==0:
                pass
            else:
                if _p!=0:
                    break
            _j=_j+1
        result=None
        if list[_j]>=3:
            list[_j]-=3
            list[0]-=3
            result=self.Analyze(list,flag)
            list[_j]+=3
            list[0]+=3
            return result
       
        #做为顺牌
        if not flag and _j<8 and list[_j+1]>0 and list[_j+2]>0:
            list[_j]=list[_j]-1
            list[_j+1]=list[_j+1]-1
            list[_j+2]=list[_j+2]-1
            list[0]=list[0]-3
            result=self.Analyze(list,flag)
            #还原这3张牌
            list[_j]=list[_j]+1
            list[_j+1]=list[_j+1]+1
            list[_j+2]=list[_j+2]+1
            list[0]=list[0]+3
            return result
        return False
       
   
    #计算LIST中的总数
    def countList(self,list):
        _a=0
        for i in list:
            _a=_a+i
        return _a
   
   
    #转化为二维数组
    def list2array(self,list):
        """麻将游戏规则中心
        具体如下表
        ============================================
        0    1     2   3    4    5    6    7    8
        ============================================
        一万 二万 三万 四万 五万 六万 七万 八万 九万
        ============================================
        9    10   11   12   13   14   15   16   17
        ============================================
        一条 二条 三条 四条 五条 六条 七条 八条 九条
        ============================================
        18    19   20   21   22   23   24   25   26
        ============================================
        一筒 二筒 三筒 四筒 五筒 六筒 七筒 八筒 九筒
        ============================================
        27    28   29   30   31   32   33   34   35
        ============================================
        东风 南风 西风 北风 红中 发财 白板 花1 花2
        ============================================
        [0,1-9]
        0表示总数,1-9分别用各自的个数表示
        [8,8,8,8,7,6,5,4,3,2,1,0,0,0]
        转化为
        [[14, 3, 1, 1, 1, 1, 1, 1, 1, 4], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
        """
        _allPai=[]
        _w=[]
        _t=[]
        _s=[]
        _z=[]
        for k in range(0,9):
            _w.append(list.count(k))
           
        for k in range(9,18):
            _t.append(list.count(k))
           
        for k in range(18,27):
            _s.append(list.count(k))
       
        for k in range(27,36):
            _z.append(list.count(k))
       
        _w.insert(0,self.countList(_w))
        _t.insert(0,self.countList(_t))
        _s.insert(0,self.countList(_s))
        _z.insert(0,self.countList(_z))
        _allPai.append(_w)
        _allPai.append(_t)
        _allPai.append(_s)
        _allPai.append(_z)
        return _allPai



if __name__=="__main__":
    _pai=[
                [6,1,4,1],
                [3,1,1,1],
                [0],
                [5,2,3]
                ]
    print _pai
    MAHJONG=Mahjong()
    print MAHJONG.zp_HU(_pai)
    list=[0,1,1,1,1,2,9,10,11,27,27,28,28,28]
    list2=[8,8,8,8,7,6,5,4,3,2,1,0,0,0]
    pai2=MAHJONG.list2array(list2)
    print pai2
    print MAHJONG.zp_HU(pai2)

分享到:
评论

相关推荐

    麻将癞子胡牌算法

    麻将癞子胡牌算法,效率超快。4个5个癞子都测试过,python语言写的。

    麻将算法源码(任意癞子)

    分享一个麻将胡牌算法,支持多癞子,自己对麻将胡牌的理解写的一套快速识别胡牌逻辑,核心逻辑500行代码,仅对同条万进行处理,字花牌不包含在内,易理解,1M次随机胡牌牌型大概3秒左右。原创分享,我的算法也许可以...

    基于PythonMahjong用Python实现的麻将游戏-源码.rar

    【标题】中的“基于PythonMahjong用Python实现的麻将游戏-源码.rar”表明这是一个使用Python编程语言开发的麻将游戏项目,源码被压缩在RAR文件中。这为我们提供了一个学习和研究Python游戏开发的机会,特别是针对...

    棋牌的胡牌算法,包括麻将、跑胡子、扑克。实现lua、c++、c#、golang、js、java、python版本。(Ma.zip

    棋牌的胡牌算法,包括麻将、跑胡子、扑克。实现lua、c++、c#、golang、js、java、python版本。(Ma.zip

    tensorflow麻将智能出牌源码

    本项目聚焦于一个独特的应用——麻将智能出牌,通过Tensorflow这一强大的深度学习框架,实现了自动选择出牌的算法。下面,我们将深入探讨这一系统的实现细节。 首先,我们要理解的是`mahjong_common.py`,这个文件...

    棋牌的胡牌算法,包括麻将、跑胡子、扑克。

    棋牌的胡牌算法,包括麻将、跑胡子、扑克。实现 lua 、c++ 、c# 、golang 、js 、java 、python 版本。( Mahjong algorithm ).zip 适合学习/练手、毕业设计、课程设计、期末/期中/大作业、工程实训、相关项目/竞赛...

    Python项目案例开发从入门到实战源代码第12章 两人麻将代码

    通过这个项目,你不仅可以掌握Python的基础语法,还能学习到面向对象编程、数据结构、算法设计、错误处理以及测试等高级概念。这将为你在Python编程道路上奠定坚实的基础,同时也为理解和开发其他复杂项目提供了宝贵...

    棋牌的胡牌算法.zip

    实现 lua 、c++ 、c# 、golang 、js 、java 、python 版本。( Mahjong algorithm ) Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems公司于1995年5月正式发布。它的设计目标是“一次编写,到处运行...

    Python实现的基于大众麻将的麻将游戏程序,基于控制台输出

    在本项目中,我们探讨的是一个使用Python编程语言实现的基于大众麻将规则的控制台游戏程序。这个项目名为"my-mahjong-master",旨在提供一个简单但功能完整的麻将游戏体验,让玩家可以在命令行界面中进行游戏。下面...

    Python图形化麻将游戏带蒙特卡洛AI源码.zip

    这个项目的核心是利用Python语言构建一个具有图形界面的麻将游戏,并结合蒙特卡洛方法实现AI算法,使得计算机可以智能地进行游戏对战。 1. **Python编程**:Python是一种高级、易学且功能强大的编程语言,因其简洁...

    麻将程序源码

    麻将,作为一款策略和运气并重的传统中国桌面游戏,其电子化版本需要程序员运用编程语言来模拟游戏规则,包括洗牌、发牌、胡牌条件、计分系统以及网络对战功能。 【描述】:“一个简单的麻将程序源码,可以局域网...

    【毕业设计】Python 图形化麻将游戏 带蒙特卡洛AI源码.zip

    这是一个基于Python的毕业设计项目,主要内容是开发一款图形化的麻将游戏,并且包含了蒙特卡洛方法实现的人工智能(AI)模块。这个项目对于学习Python编程、图形界面设计以及人工智能算法有着很高的教育价值。 首先...

    game_majiang.rar

    在本项目"game_majiang.rar"中,我们聚焦于使用Python编程语言实现四川麻将的算法,以及构建一个包含电脑AI玩家的简单游戏交互界面。四川麻将是麻将的一种变种,具有独特的规则和玩法,例如"血战到底"、"杠上开花"等...

    Paitan:综合不和谐麻将机器人

    2. **麻将游戏逻辑**:机器人需要实现麻将的规则和算法,包括洗牌、发牌、判定胡牌条件等。这通常涉及复杂的逻辑,可能需要用到数据结构和算法。 3. **用户交互**:机器人需要能够理解用户的输入,例如接收麻将操作...

    类似QQ麻将游戏源码

    7. **游戏逻辑**:麻将游戏的逻辑复杂,包括发牌、胡牌规则、碰杠操作等。源码中会有相应的逻辑处理函数,开发者需要理解这些函数如何实现麻将游戏的规则。 8. **对象模型和类的设计**:源码中可能会包含各种类,如...

    麻將範例程式YOU CAN USE IT OT LEARN MHJONG

    虽然没有提供更多的具体信息,但我们可以推测该程序可能包含了麻将游戏的各种基本功能,如洗牌、发牌、玩家操作、胡牌判断等,是初学者了解麻将游戏算法和编程实践的良好起点。 【标签】"麻将"明确了主题,这个程序...

    麻将的运动

    4. **游戏逻辑**:麻将游戏的规则复杂,包括胡牌条件、碰杠操作等,都需要编程实现。开发者需要编写严谨的算法来处理各种可能的游戏状态,确保游戏的规则正确无误。这可能涉及到数据结构设计,如使用数组或链表来...

    毕业设计,房卡麻将设计.zip

    1. **游戏规则实现**:房卡麻将的规则与传统麻将略有不同,通常包括创建房间、邀请好友、设定房间规则(如番数限制、胡牌条件等)等。开发者需要深入理解麻将规则,并将其转化为可执行的算法。 2. **数据库设计**:...

    大数据技术2015最新面试题

    4. 长沙麻将胡牌判断:这个问题可以通过哈希表记录每个花色的牌数量,然后按照胡牌规则检查。首先,确定每个花色的牌是否满足条件,接着寻找对子,最后检查剩余牌能否组合成顺子或刻子。设计数据结构时,可以使用一...

Global site tag (gtag.js) - Google Analytics