#coding='utf-8'#author='小罗QQ1271801445'#麻将胡牌算法#判定规则:n*(abc)+m*(ddd)+ee#特殊牌型:7*(ee),7对。

##规则:##胡牌的基础牌型:##(1)11、123、123、123、123##(2)11、123、123、123、111(1111,下同)##(3)11、123、123、111、111##(4)11、123、111、111、111##(5)11、111、111、111、111##胡牌的特殊牌型:##11、11、11、11、11、11、11(七对)#国士无双、十三幺九。由1筒(饼)、9筒(饼)、1条(索)、9条(索)、1万、9万、东、南、西、北、中、发、白十三种牌统称幺九牌。#胡牌时这十三种牌某一种有两枚,而另十二种各一枚,共计十四枚,即构成十三幺。

##其中:1=单张 11=将、对子 111=刻子 1111=杠 123=顺子

##设计:##牌型:万条饼,东西南北风,中发白。##万:1-9##条:11-19##饼:21-29##东西南北风:31,33,35,37##中发白:41,43,45

##这样定义,方便进行连续性计算,防止 东西南风,这样凑成一组牌。##思路,先判断7对子,然后进行常规判断。遍历和剪枝。##先找到数量大于等于2的牌,然后去掉,那么剩下的牌,要么连续的3张,或是相同的3张。#3张相同的,肯定是相连的3张。#3张连续的,可能是相邻的,也可能有跳跃,比如11,2222,33,结果是22,123,123,和牌成功。如果是只做相邻检测,则结果会不对。

##为保证函数solid,成为不需要维护的代码,那么就需要进行参数检查。##考虑数字是否在定义的规则范围内;##考虑参数的数量是否合规;##考虑参数是否包含一个必备选项:对子;##考虑是否是特殊和牌类型:7对;##常规和牌判断;####错误回顾:##1,首次制作,未考虑到遍历完成,未和牌的情况,导致11,235,678 这样的未和牌的,没有返回数据。##2,首次制作的时候,对于顺子的判断出现了错误。比如:112233,一个牌型可能有多张,排序完成后,123在数字上连续,但是位置上不一定相邻。所以不能直接用切片判断,应该用 a[0]+1 in a 这样的方式进行判断。##3,另外一个重大错误,举例:345,55,567,88,检查和牌项时,58都是和牌项,但是5明细已经没有牌了。所以要做数量的限制。

##知识点:通过减少print,可以大幅度减少运行时间。

importtime,sysimport random #用于测试。#公共参数,1套牌库,注意总共是4套。

pais=list(range(1,10))+list(range(11,20))+list(range(21,30))+list(range(31,38,2))+list(range(41,46,2))defhepai(a:list):'''Judge cards hepai. For excample:a=[1,2,3,4,4]

a=list,万:1-9,条:11-19,饼:21-29,东西南北风:31,33,35,37,中发白:41,43,45。'''a=sorted(a)#print(a)

#牌面检查,是否属于本函数规定的范围内。

#pais=list(range(1,10))+list(range(11,20))+list(range(21,30))+list(range(31,38,2))+list(range(41,46,2))

#print(pais)

for x inset(a):if a.count(x)>4:#某张牌的数量超过了4,是不正确的。

returnFalseif x not inpais:print('参数错误:输入的牌型{}不在范围内。\n万:1-9,条:11-19,饼:21-29,东西南北风:31,33,35,37,中发白:41,43,45。'.format(x))returnFalse#牌数检查。

if len(a)%3!=2:print('和牌失败:牌数不正确。')returnFalse#是否有对子检查。

double=[]for x inset(a):if a.count(x)>=2:

double.append(x)#print(double)

if len(double)==0:#print('和牌失败:无对子')

returnFalse#7对子检查(由于不常见,可以放到后面进行判断)

#对子的检查,特征1:必须是14张;特征2:一个牌型,有2张,或4张。特别注意有4张的情况。

if len(a)==14:for x inset(a):if a.count(x) not in [2,4]:break

else:## print('和牌:7对子。',a)

returnTrue#十三幺检查。

if len(a)==14:

gtws=[1, 9, 11, 19, 21, 29, 31, 33, 35, 37, 41, 43, 45] #[1,9,11,19,21,29]+list(range(31,38,2))+list(range(41,46,2)) #用固定的表示方法,计算速度回加快。

#print(gtws)

for x ingtws:if 1<=a.count(x)<=2:pass

else:break

else:print('和牌:国土无双,十三幺!')returnTrue#常规和牌检测。

a1=a.copy()

a2=[] #a2用来存放和牌后分组的结果。

for x indouble:#print('double',x)

#print(a1[0] in a1 and (a1[0]+1) in a1 and (a1[0]+2) in a1)

a1.remove(x)

a1.remove(x)

a2.append((x,x))for i in range(int(len(a1)/3)):#print('i-',i)

if a1.count(a1[0])==3:#列表移除,可以使用remove,pop,和切片,这里切片更加实用。

a2.append((a1[0],)*3)

a1=a1[3:]#print(a1)

elif a1[0] in a1 and a1[0]+1 in a1 and a1[0]+2 in a1:#这里注意,11,2222,33,和牌结果22,123,123,则连续的3个可能不是相邻的。

a2.append((a1[0],a1[0]+1,a1[0]+2))

a1.remove(a1[0]+2)

a1.remove(a1[0]+1)

a1.remove(a1[0])#print(a1)

else:

a1=a.copy()

a2=[]#print('重置')

break

else:#print('和牌成功,结果:',a2)

returnTrue#如果上述没有返回和牌成功,这里需要返回和牌失败。

else:#print('和牌失败:遍历完成。')

returnFalse#单元测试:#assert hepai([1,1,2,2,3,3,4,4,5,5,6,6,7,7])==True,'7对和牌'

try:print('单元测试开始:',

hepai([1,1,2,2,3,3,4,4,5,5,6,6,7,7])==True,#7对和牌。

hepai([1,1,1,1,13,13,4,4,5,5,6,6,17,17]),#含4个一样牌的7对。

hepai([1,9,11,19,21,29]+list(range(31,38,2))+list(range(41,46,2))+[29,])==True, #十三幺测试。

hepai([1,1,2,2,2,2,3,3])==True,#不连续和牌。首次写的时候,这里给忽略掉了。

hepai([1,1,1,2,2,2,3,3,3,4,5,17,18,19])==True, #正常和牌。

hepai([18,18,31,33,35,31,31,33,33,35,35])==True, #东西南北风

hepai([33,34,35,36,36])==False, #参数错误。

hepai([1,2,3,4])==False, #数量不正确。

hepai([1,2,3,4,5])==False, #无对子。

hepai([1,1,2,3,5,6,7,8])==False) #遍历完成,不和牌。

print('单元测试结束,如果有False,请检查。')print('*'*50)except:print('运行测试未通过,请检查。')

python编程胡牌将是什么意思_python麻将和牌算法相关推荐

  1. python联机麻将_python麻将和牌算法

    #coding='utf-8' #麻将胡牌算法 #判定规则:n*(abc)+m*(ddd)+ee #特殊牌型:7*(ee),7对. ##规则: ##胡牌的基础牌型: ##(1)11.123.123.1 ...

  2. python编程快速上手-----让繁琐工作自动化_Python编程快速上手—让繁琐工作自动化|百度云盘|基础学习...

    下载地址: 链接:https://pan.baidu.com/s/1QRH_LyFAizkbLfJm3oyK1w 提取码:5fel 内容提要 如今,人们面临的大多数任务都可以通过编写计算机软件来完成. ...

  3. 儿童python编程能给孩子带来哪些好处_python编程入门学习对孩子成长有哪些优势?...

    python编程语言学习有意义吗? python编程语言是少儿编程培训课程中重要的组成部分,随着越来越多的孩子开始接触和学习编程,通过编程学习培养孩子良好的学习习惯和锻炼提升孩子逻辑思维能力.在pyt ...

  4. python编程计算前30项的和_Python 程序员需要知道的 30 个技巧

    如果你让一个 Python 程序员说一下 Python 的优势,他会说简洁以及高可读是最有影响力的优势.为证明上述两点,在这个 Python 教程里,我们将聊聊许多基本的 Python 建议和技巧. ...

  5. python编程从入门到实践第八章_Python编程从入门到实践的第三天

    #-*- coding = utf-8 -*- #今天是12月24号了,天气阴,不是太好,这是我看Python编程从入门到实践的第三天,现在是上午,我是皮卡丘,这是我敲的第八章的代码 #第八章练习题1 ...

  6. 儿童python编程能给孩子带来哪些好处_python编程练习好吗?会给孩子带来哪些作用?...

    通常学习别人的孩子,在以后就业方面,还有学校成绩方面都会占据很多的优势,所以说家长对孩子学习编程这一方面是相当支持和认可的.但是,python编程练习好吗?会给孩子带来哪些作用?python是一种比较 ...

  7. python编程胡牌将是什么意思_OpenCV+Python识别车牌和字符分割的实现

    本篇文章主要基于python语言和OpenCV库(cv2)进行车牌区域识别和字符分割,开篇之前针对在python中安装opencv的环境这里不做介绍,可以自行安装配置! 车牌号检测需要大致分为四个部分 ...

  8. 慕课乐学python编程题_中国大学mooc慕课_Python编程基础_2020章节测试答案

    中国大学mooc慕课_Python编程基础_2020章节测试答案 更多相关问题 [单选] 双绕组变压器降压可获得(). [单选] 电炉和电烙铁是根据()制造而成的 [单选] 各种电流互感器产品技术数据 ...

  9. python编程的文件后缀是什么意思_python文件的后缀名是什么

    python文件的后缀名有:".py".".py3".".pyc".".pyo".".pyd".&q ...

最新文章

  1. unity开发小贴士之八 Audio使用心得
  2. 博士生在没有导师指导的情况下,该如何自己选题发 CVPR ?
  3. 自定义控件详解(六):Paint 画笔MaskFilter过滤
  4. C# Soap调WebService
  5. Java设计模式-Proxy代理模式
  6. 语法分析实验ll算法c语言,实验5LL语法分析程序的设计与实现(C语言).doc
  7. 2021超详细的Dart语言基础总结~你值得拥有~
  8. 使用Docker运行java项目需要注意的glibc依赖库问题
  9. 【maven3学习之一】window7下maven环境搭建
  10. Linux_学习_Day3_bash
  11. 阐述html语言的理解,大学语文课后思考题答案
  12. QS首发大学百强排名,华东五校表现惊艳,老牌985望尘莫及
  13. 随手记_英语_学术写作_标点符号的使用
  14. c#引用参数ref与输出参数out
  15. c语言小程序 祝你生日快乐!
  16. npi阶段是什么意思_NPI阶段发现的重要性论述
  17. mysql lpad 列_mysql的lpad函数
  18. C语言和python实现——公鸡5文钱一只, 母鸡3文钱一只,小鸡3只一文钱,用100文钱买100只鸡
  19. 2019,华为一号文
  20. Flutter技术与实战(4)

热门文章

  1. java 水印 位置_Java实现图片加水印且控制位置和透明度
  2. 《天天数学》连载29:一月二十九日
  3. 大数据学习笔记04:单机模式使用ZooKeeper
  4. const 指针_C语言学习日记(11)——const与指针
  5. 服务器编译linux内核时间,Firefly-RK3399 Linux内核编译
  6. 【英语学习】【WOTD】mettlesome 释义/词源/示例
  7. glDrawArrays,glDrawElements用法
  8. Mybatis系列全解(六):Mybatis最硬核的API你知道几个?
  9. windows模拟微信小程序_Windows 版微信新版本内测!小程序可以直接添加到电脑桌面了...
  10. jedis-2.4.1 中的JedisPoolConfig没MaxActive属性