我写了个“女朋友”陪自己打麻将……
序
一个月黑风高的晚上,我正坐在工位的电脑前精力充沛的疲倦不已的写着bug。
突然,一通备注着“小仙女”的电话打了过来,我一看赶紧接通了女朋友的电话。
电话那边传来温柔的声音“好无聊呀,过来陪我一起打麻将吧”
可是事业心强并且写着bug的我怎么能够去和女朋友打麻将呢?
于是在犹豫了一秒之后我便起身而出。
见到了可爱的女朋友,我们便兴奋的搓起了麻将。
搓了一轮一轮又一轮……
可是实在是太困,搓着搓着我竟然睡着了。
“涛哥,涛哥,快醒醒~“
在同事的呼唤中我揉了揉朦胧的双眼,看着眼前模糊的桌面,转了转脑袋,我这才反应过来我是在公司写代码写睡着了,难道刚才的一切都是梦?
我向同事述说着刚才的事情,可同事带着嘲笑的口气说“别做梦了,还女朋友?除了你写的机器人还有谁会陪你打麻将哈哈哈”
我很生气,但是拿出手机看了通话记录确实没有什么“小仙女”。
一番冷静后,我将双手放在了笔记本上,抚摸着顺滑的键盘,去她的小仙女,我还是陪我的机器人吧。
虽然自己很难受,但还是秉承着助人为乐的精神教教单身汪萌怎么写机器人陪自己玩。
以下,正文。
麻将预备知识
我们先来了解一下麻将的预备知识,由于全国各地的麻将规则和叫法不尽相同,在这以日麻做统一。有一定麻将基础的可以跳过
定义规则:「」
表明和国内麻将有所不同之处; 加•
为通用标准定义;加#
为本文章定义或麻将牌友之间的通俗用法(非通用用法)
名称定义:(其中加粗的是比较重要的)
#条子简称s,饼子简称p,万子简称m。一般多用于快速形容手牌。用法例如:234p55678s3478m西
•老头牌:一到九的s(索)、p(饼)、m(万)的统称。共24张
•三元牌:白发中 牌统称「日麻顺序」。共12张
•四风牌:东南西北 牌统称。共16张
•暗刻子:牌中含有三个一样的牌组
•明刻子:碰形成的三个一样的牌组
•刻子:暗刻子和明刻子统称
•顺子:相同花色,相连的三张构成的牌组
•面子:顺子与刻子的统称
•将牌\雀头:一对相同的牌(如果一对相同的牌被分在不同的牌组里必然不算),简称:"将"。
•吃:上家打出牌,与下家的牌正好组成一副顺子
•碰:其他人打出一张牌,自己手中有两张相同的牌正好组成一副刻子
•杠子:四个一样的牌形成的牌组(需声明 才成立)
•明杠:自己手中有暗刻,然后获取别人打出的牌声明杠子
•暗杠:自己手中有一组杠子,直接声明杠子
•和了:「完成带番数的特殊和牌型」
#标准和牌型:四组面子和一将牌
#和牌型:标准和牌型+七对子+国士无双(中麻里的"十三幺")
•自摸:自己摸牌和了。
•荣和:他家打出牌使你和了。又称食和。
•出统:一家打的牌使另一家荣和。中麻里叫"点炮"。
•听牌:差一张牌就可以完成和牌型的状态
•向听:差n张牌就可以听牌称n向听
•手牌:麻将开局,每人按顺序分次先后摸得的13张,就叫作手牌。
和牌的判断
和牌的规则
我们都知道打麻将的最终目的是「和牌」,首先我们需要知道和牌的规则。
有多种多样的和牌,但是总归起来可分为:标准和牌型、七对子和国士无双这三种。
- 标准和牌型为4面子+1雀头,可以理解为
n*AAA+m*XYZ+DD
,如下就是一种标准型的和牌。
- 七对子比较好理解,就是七个对子,如下是一种七对子的和牌。
- 国士无双(中国麻将又称十三幺),指其中
1种一对,剩下12种各一张的和牌。如下是一种国士无双的和牌。
和牌的判断思路
那么如何教机器人判断和牌呢?
1、打表
给每种牌编一个id,麻将中共34种牌因此需要至少6位空间。手牌14张也就是84位。要保存和牌的全部组合约1700万种需要约175MB存储。
查表法比较吃内存,但是据说天凤之类的网游就是这么算的。
2、暴力拆解
可以使用递归,拆出顺子、刻子、将牌。
暴力拆解比较耗时间,但是可维护性较好。
鱼和熊掌不可兼得?为了绝佳的游戏体验,我冒着秃头的危险找到了改进的方案。
3、方案来自 hp.vector.co.jp
改进的思路是先给手牌排序,然后不管具体牌面,只计算连续牌的张数,得到一个「牌型」,再从表中查牌型是否胡。
例如「222456万345678饼北北」,可以编码为「30111011111102」(三张相同牌,三张连续牌,六张连续牌,两张相同牌,中间隔开)。
下一步是将其二进制化,采用如下特制规则:
1→0
2→110
3→11110
4→1111110
10→10
20→1110
30→111110
40→11111110
这样编码后每张牌只占用1到2位空间,最坏情况子下(十四张不连单牌)仅占用27位。跟之前的84位相比,单组数据压缩了三分之二以上。更牛逼的是,和牌表从1700万种具体组合下降到仅仅9362种形状排列!
和牌的判断标准
对于和牌的判断标准,我们需要了解「shanten (向听)」这个概念,上面简单说过,差n张牌就可以听牌称n向听。下面我们以一例牌型来详细说明。
当前手牌为3向听状态
打【北】,摸【一万】,到2向听
打【发】,摸【四万】,到1向听
打【一筒】,摸【五万】,到听牌(0向听)
打【七筒】,摸【二条】,和牌(-1向听)
向听的计算
所以,让机器人和牌转为了向听的计算这一问题,朝着向听减少的方向,直至 -1,即为和牌。
由前面所提的和牌规则,我们可将向听数的计算也分为:标准和牌型、七对子和国士无双这三种。
我们先解决两种特殊情况。
- 七对子的向听计算
正如它的名字一样,在 七对子中 收集七个对子是和的条件。因此,为了计算向听,计算对子的数量是基本的。作为例子考虑下面的手牌吧。
对子数是 5 个,是 1 向听。换句话说,**在七对子的情况下,如果你计算对子的数量,然后用 6 减去它,那就是向听。**例如,如果对子有6个即听牌(0向听) ,如果有7个即和了(- 1向听)。
七对子的向听 = 6 - 对子数
但是需要注意的是以下情况。
六饼是暗子,不过,这个也作为对子需要数数。
另外,还需要特别注意的是以下情况。
这是六个对子,所以根据上面的公式,它会变成一个听牌,但实际上是一向听。像这样牌的种类不够的话,从7减去牌的种类的东西必须加到向听数。
例如,这个牌子有四个对子和四种牌子,
向听数 = 6-4 + (7-4) = 5
- 国士无双(十三幺)的向听计算
如果数出一九字牌的种类,再用13减去,那就是向听数。但是如果有一个对子,可以把一个向听减少到最大限度。
如下面这种情况,因为一九字牌有12种,对子是一个,所以以13-12-1是0 chanten,也就是听牌。
在这种情况下,你不能使用这两种方法,所以13-11-1就是1 chanten。
最后是比较麻烦的标准和牌型
- 标准和牌型的向听计算
求解方法包括计算面子和面子候选数的数量,然后用下面的公式计算。
向听数 = 8- 面子数 × 2- 面子候选数
这里面子是指已经完成的面子,也就是顺子和刻子。面子候选是指再过一张就要面子的东西,也就是对子和搭子。
基本上,我们只需要注意两种情况。
⚠️一种是,面子数和面子候选数的总数不得超过4个。
举个例子,这个牌子有两个面子,四个候选面子,所以如果你用上面的公式来计算
8-2×2-4=0
然而,实际上,不能使用面子候选数。 这是所谓的多余面子的状态。 在这种情况下,为了使面子和面子候选数的总数为4,必须将面部候选的数量计为两个。 如果以此计算
8-2×2-2=2
然后你会发现这副牌确实是两个向听。
⚠️另一种是雀头。如果除了在上面使用的牌以外,可以得到麻雀头,从向听的数量中减去1。例如:
计算为
8-2×2-2=2
但是因为一对八条可以作为雀头使用,所以变成了一个向听。
机器人出牌
我们知道了【和牌的判断】和【向听的计算】,接下来就可以教机器人如何出牌了。我们的目的是让机器人和牌(若果是想获得碾压的快感,只做个摸啥打啥的傻瓜
我写了个“女朋友”陪自己打麻将……相关推荐
- 程序猿真的觉得写代码比女朋友重要吗?
原创文章,欢迎转载.转载请注明:转载自IT人故事会,谢谢! 原文链接地址:程序猿真的觉得写代码比女朋友重要吗? 要看是什么样的女朋友.觉得代码更重要,是因为女朋友还不够好.认为自己男朋友更在乎代码的, ...
- 一行一个链接代码_小白写代码讨女朋友欢心,包教包会
爱情这点小事里,不花钱也可以很有情致- 你看鹅厂程序员小彭,在520来临之际,给女朋友写了段代码,不花钱就让女朋友惊喜又感动. https://elvinn-1aa07a-1251269979.tcl ...
- 哄女朋友玩的c语言编程,在线教学:哄女朋友陪你玩游戏的真正秘诀
原标题:在线教学:哄女朋友陪你玩游戏的真正秘诀 约稿. 大概,每个男生都试图哄过女朋友喜欢上打游戏吧? 不,不是各色萌萌的消除游戏.纸牌游戏.扫雷游戏. 而是大东西:动作.角色扮演.模拟.策略类. 我 ...
- 我开发了一个女朋友陪聊系统【全天24小时推送问候,自动回复女友的微信消息】
一名名叫李恺祥的软件开发工程师发了一条动态,没想到自己火的如此之快. 起因是因为工作忙,老是不能及时回复女友的消息,于是就写了一段程序,这段程序可以: [全天24小时推送问候,自动回复女友的微信消息] ...
- 我用Java写了个女朋友,甚至还能跟我聊两句!?
小编虽然给不了你女朋友 但是可以给你一个获得女朋友的免费方法 这种挖坟一样的问题 怎么能如此简单的定义一个女朋友 醒醒女朋友当然是你想怎么写就怎么样的 01 为什么学Java 1. 需求量大:JA ...
- 这个可能是比你女朋友陪你时间都要久的本子
今天我看到产品小姐姐的一个东西,我惊呆了,因为我好像看到了黑科技,事情是这个样子的.... 由于加班写代码,在比较疲劳的时候,就站起来随意的在办公室里走走,放松一下自己的脑神经. 走到一个产品小姐姐身 ...
- 一个留学生被戴了绿帽子之后,写给前女朋友的一封信
看了还是有点触动,转了.... 亲爱的瑶瑶同志: 首先要感谢你把我甩了,和那个小子开始了浪漫生活,使我顺利的回到了单身生活,也使我和很多留学出国的哥们一样,带上了一顶绿油油的帽子. 出国前你怎么给我说 ...
- 写一个哄女朋友的python小程序
好的,下面给出一个哄女朋友的Python小程序,主要是通过一些温馨的话语来表达爱意: importtimedef love_words():print("宝贝,你是我的唯一,我爱你!&quo ...
- python自动聊天机器人设置回复延迟_用Python 写一个聊天机器人陪你聊天(文尾有彩蛋)...
一.工具简介 1--Python.写代码的工具: 2--itchat库.第三方库,用来登录微信,接收并回复微信好友信息: 3--图灵机器人.第三方接口,我们本次使用的机器人: 二.代码解析 1.准备 ...
最新文章
- 蕨叶形生物刷新生命史,动物界至少起源于5.7亿年前
- 时雨月五| AI机器学习实战の电磁导航智能车中神经网络应用的问题与思考
- 在Intellij上面导入项目 AOP示例项目 AspectJ学习 Spring AoP学习
- STM32中的timers中断处理函数
- Django笔记---数据库设计
- 数组指针和指针数组的区别(1)
- C# 字符串操作:split、substring、Format
- 201521123071 《JAVA程序设计》第七周学习总结
- Flutter 入门指北(Part 9)之弹窗和提示(SnackBar、BottomSheet、Dialog)
- P2234 [HNOI2002]营业额统计
- java parser .java_JDK的Parser来解析Java源代码详解
- Maxscript开发笔记
- 南邮2020/2021电工电子技术期末试卷
- 腾讯云内容分发网络 CDN 产品认证课程笔记(二)——腾讯云CDN介绍
- linux全角半角切换快捷键,切换中英文标点快捷键,全角半角之间的转换快捷键
- java制作进度条,Java制作进度条
- Android Push哪家强——分析豌豆荚1400个APP
- CSP初赛篇·知识大纲(未完成)
- m1卡工作原理和相关总结
- python 文件打开的六种方式
热门文章
- 小程序源码:语音变声器微信小程序-多玩法安装简单
- php arraycopy,System.arraycopy方法解释
- RISC-V IDE MounRiver Studio V1.51更新点介绍
- 使用 OpenLaszlo 创建 Web 富客户端
- 基于Mysql+JavaSwing的超市商品管理系统设计与实现
- py获取前端的参数_设计小巧、高效和高性能的多参数患者监护仪
- 黑盒测试-软件构造学习
- Maven安装卸载本地jar
- Gurobi过期了怎么办
- 2.依据最小风险的贝叶斯决策对观察的结果进行分类MATLAB程序代码