用 python 实现 简单AI 双人日麻(文字版)之一 建立胡牌逻辑
行业外的我,放下 python 许久,如今因为迷上日麻,想在上班摸鱼的时候,决心搞一个文字版的麻将,练习练习。
声明一下,本人的代码属于自学,代码很混乱,希望抛砖引玉
第一步,就是简单的建立 胡牌逻辑。在帖子里看到了一个大神写的简单逻辑。个人脑子不行,所以这里直接搬运一下。
原贴地址:https://www.cnblogs.com/guangzhao17/p/8167302.html,这里搬运一下,感谢大神
#_*_ coding=utf-8 _*_
import time, sys
import 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))
a = pais #用于测试
def hepai(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 in set(a): #拆为元素集if a.count(x) > 4: # 某张牌的数量超过了4,是不正确的。return Falseif x not in pais:print('参数错误:输入的牌型{}不在范围内。\n万:1-9,条:11-19,饼:21-29,东西南北风:31,33,35,37,中发白:41,43,45。'.format(x))return False# 牌数检查。if len(a) % 3 != 2:print('和牌失败:牌数不正确。')return False# 是否有对子检查。double = []for x in set(a):if a.count(x) >= 2:double.append(x)# print(double)if len(double) == 0:# print('和牌失败:无对子')return False# 7对子检查(由于不常见,可以放到后面进行判断)# 对子的检查,特征1:必须是14张;特征2:一个牌型,有2张,或4张。特别注意有4张的情况。if len(a) == 14:for x in set(a):if a.count(x) not in [2, 4]:breakelse:## print('和牌:7对子。',a)return True# 十三幺检查。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 in gtws:if 1 <= a.count(x) <= 2:passelse:breakelse:print('和牌:国土无双,十三幺!')return True# 常规和牌检测。a1 = a.copy()a2 = [] # a2用来存放和牌后分组的结果。for x in double:# 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('重置')breakelse:# print('和牌成功,结果:',a2)return True# 如果上述没有返回和牌成功,这里需要返回和牌失败。else:# print('和牌失败:遍历完成。')return False
这里的 hepai 函数较为简单,简单的判断是是否胡牌,以及特殊牌型七对子,国士的判断。缺少符数,翻数等的判断。后续想办法优化
用 python 实现 简单AI 双人日麻(文字版)之一 建立胡牌逻辑相关推荐
- 用 python 实现简单AI 双人日麻(文字版)之三 加入COM出牌
这一章主要是增加COM的角色出牌 第一步:添加COM出牌 实现电脑摸牌,出牌的逻辑 def com_output(a:list): #实现电脑摸牌,随机出牌#global Paia.append(Pa ...
- Python——调用百度AI实现图片上文字识别
Python--调用百度AI实现图片上文字识别 简介 步骤 安装百度AI库 注册百度AI开放平台 调用glob库 调用AipOcr库识别文字 可能会遇到的问题 批量操作 简介 Python免费调用百度 ...
- Python利用百度AI提取图片中的文字信息
Python利用百度AI提取图片中的文字信息 安装百度AI : pip install baidu-aip 到https://console.bce.baidu.com/ai/创建文字识别应用,获取A ...
- ~ 如何用C++自制一个日麻游戏 ~(二)听牌判断算法 § 1 判断听牌(附带C#实现)
导入 -- 什么环节只要用算法判断一次,就能知道是否听牌立直.还差什么牌就可以荣和自摸? -- 只要在缺一张手牌(如1.4.7.10.13张时)的情况下判断是否听牌.听哪些牌,就可以为上面的复杂判断提 ...
- 【LeetCode Python实现】二次元日麻游戏 雀魂麻将
想要看更加舒服的排版.更加准时的推送 关注公众号"不太灵光的程序员" 每日八点有干货推送,微信随时解答你的疑问 公众号"不太灵光的程序员" 同时发布<二次 ...
- python程序-30分钟学会用Python编写简单程序
原标题:30分钟学会用Python编写简单程序 参与文末每日话题讨论,赠送异步新书 异步图书君 学习目标 知道有序的软件开发过程的步骤. 了解遵循输入.处理.输出(IPO)模式的程序,并能够以简单的方 ...
- 适合小学生python的书_小学生开始学Python,最接近AI的编程语言:安利一波Python书单...
原标题:小学生开始学Python,最接近AI的编程语言:安利一波Python书单 AlphaGo 都在使用的 Python 语言,是最接近 AI 的编程语言. 教育部考试中心近日发布了"关于 ...
- 我花了两年,从不懂Python变成了AI工程师
2020-01-23 11:08:57 赖可 发自 凹非寺量子位 报道 | 公众号 QbitAI 想做机器学习的工作,却觉得自己没有专业技能? 有一位小哥,从不知道Python到找到AI工程的工作,用 ...
- Python+OpenCv实现AI人脸识别身份认证系统(2)——人脸数据采集、存储
原 Python+OpenCv实现AI人脸识别身份认证系统(2)--人脸数据采集.存储 2019年07月02日 08:47:52 不脱发的程序猿 阅读数 602更多 所属专栏: 人脸识别身份认证系统设 ...
最新文章
- numpy.ndarray size changed, may indicate binary incompatibility. Expected 88 from C header, got 80 f
- 利用找因子来找方程解的个数
- linux oracle脚本编写,Linux 脚本编写基础(一)--语法
- COM 组件设计与应用(六)
- 282. 给表达式添加运算符
- 用python绘制叠加等边三角形_python 叠加等边三角形的绘制的实现
- Spring Boot 框架介绍和使用
- lombok slfj 中_lombok @Slf4j注解
- PHP 结构控制 if else / switch / while / do while
- 在WSL2上运行nVIDIA Nsight
- 南京邮电大计算机科学与技术,计算机科学与技术专业培养目标与毕业要求-南京邮电大学计算机学院.PDF...
- Appium安装手册详解
- 太阳电池IV测试软件,太阳能电池IV测试系统
- jenkins测试人员的使用
- 8CRM客户案例分享
- 产品经理如何实现自我提升
- IPMI用户名密码忘记了怎么处理?
- 【个人使用篇】github代码管理
- Opencv3.2移植到arm板
- DDNS动态域名解析IPv6地址