一个月黑风高的晚上,我正坐在工位的电脑前精力充沛的疲倦不已的写着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

但是因为一对八条可以作为雀头使用,所以变成了一个向听。

机器人出牌

我们知道了【和牌的判断】和【向听的计算】,接下来就可以教机器人如何出牌了。我们的目的是让机器人和牌(若果是想获得碾压的快感,只做个摸啥打啥的傻瓜

我写了个“女朋友”陪自己打麻将……相关推荐

  1. 程序猿真的觉得写代码比女朋友重要吗?

    原创文章,欢迎转载.转载请注明:转载自IT人故事会,谢谢! 原文链接地址:程序猿真的觉得写代码比女朋友重要吗? 要看是什么样的女朋友.觉得代码更重要,是因为女朋友还不够好.认为自己男朋友更在乎代码的, ...

  2. 一行一个链接代码_小白写代码讨女朋友欢心,包教包会

    爱情这点小事里,不花钱也可以很有情致- 你看鹅厂程序员小彭,在520来临之际,给女朋友写了段代码,不花钱就让女朋友惊喜又感动. https://elvinn-1aa07a-1251269979.tcl ...

  3. 哄女朋友玩的c语言编程,在线教学:哄女朋友陪你玩游戏的真正秘诀

    原标题:在线教学:哄女朋友陪你玩游戏的真正秘诀 约稿. 大概,每个男生都试图哄过女朋友喜欢上打游戏吧? 不,不是各色萌萌的消除游戏.纸牌游戏.扫雷游戏. 而是大东西:动作.角色扮演.模拟.策略类. 我 ...

  4. 我开发了一个女朋友陪聊系统【全天24小时推送问候,自动回复女友的微信消息】

    一名名叫李恺祥的软件开发工程师发了一条动态,没想到自己火的如此之快. 起因是因为工作忙,老是不能及时回复女友的消息,于是就写了一段程序,这段程序可以: [全天24小时推送问候,自动回复女友的微信消息] ...

  5. 我用Java写了个女朋友,甚至还能跟我聊两句!?

    小编虽然给不了你女朋友 但是可以给你一个获得女朋友的免费方法 这种挖坟一样的问题 怎么能如此简单的定义一个女朋友 醒醒女朋友当然是你想怎么写就怎么样的 01 为什么学Java 1.   需求量大:JA ...

  6. 这个可能是比你女朋友陪你时间都要久的本子

    今天我看到产品小姐姐的一个东西,我惊呆了,因为我好像看到了黑科技,事情是这个样子的.... 由于加班写代码,在比较疲劳的时候,就站起来随意的在办公室里走走,放松一下自己的脑神经. 走到一个产品小姐姐身 ...

  7. 一个留学生被戴了绿帽子之后,写给前女朋友的一封信

    看了还是有点触动,转了.... 亲爱的瑶瑶同志: 首先要感谢你把我甩了,和那个小子开始了浪漫生活,使我顺利的回到了单身生活,也使我和很多留学出国的哥们一样,带上了一顶绿油油的帽子. 出国前你怎么给我说 ...

  8. 写一个哄女朋友的python小程序

    好的,下面给出一个哄女朋友的Python小程序,主要是通过一些温馨的话语来表达爱意: importtimedef love_words():print("宝贝,你是我的唯一,我爱你!&quo ...

  9. python自动聊天机器人设置回复延迟_用Python 写一个聊天机器人陪你聊天(文尾有彩蛋)...

    一.工具简介 1--Python.写代码的工具: 2--itchat库.第三方库,用来登录微信,接收并回复微信好友信息: 3--图灵机器人.第三方接口,我们本次使用的机器人: 二.代码解析 1.准备 ...

最新文章

  1. 蕨叶形生物刷新生命史,动物界至少起源于5.7亿年前
  2. 时雨月五| AI机器学习实战の电磁导航智能车中神经网络应用的问题与思考
  3. 在Intellij上面导入项目 AOP示例项目 AspectJ学习 Spring AoP学习
  4. STM32中的timers中断处理函数
  5. Django笔记---数据库设计
  6. 数组指针和指针数组的区别(1)
  7. C# 字符串操作:split、substring、Format
  8. 201521123071 《JAVA程序设计》第七周学习总结
  9. Flutter 入门指北(Part 9)之弹窗和提示(SnackBar、BottomSheet、Dialog)
  10. P2234 [HNOI2002]营业额统计
  11. java parser .java_JDK的Parser来解析Java源代码详解
  12. Maxscript开发笔记
  13. 南邮2020/2021电工电子技术期末试卷
  14. 腾讯云内容分发网络 CDN 产品认证课程笔记(二)——腾讯云CDN介绍
  15. linux全角半角切换快捷键,切换中英文标点快捷键,全角半角之间的转换快捷键
  16. java制作进度条,Java制作进度条
  17. Android Push哪家强——分析豌豆荚1400个APP
  18. CSP初赛篇·知识大纲(未完成)
  19. m1卡工作原理和相关总结
  20. python 文件打开的六种方式

热门文章

  1. 小程序源码:语音变声器微信小程序-多玩法安装简单
  2. php arraycopy,System.arraycopy方法解释
  3. RISC-V IDE MounRiver Studio V1.51更新点介绍
  4. 使用 OpenLaszlo 创建 Web 富客户端
  5. 基于Mysql+JavaSwing的超市商品管理系统设计与实现
  6. py获取前端的参数_设计小巧、高效和高性能的多参数患者监护仪
  7. 黑盒测试-软件构造学习
  8. Maven安装卸载本地jar
  9. Gurobi过期了怎么办
  10. 2.依据最小风险的贝叶斯决策对观察的结果进行分类MATLAB程序代码