下面就该进入打牌环节了

打牌之前, 首先应该定义牌的类型有哪些.

斗地主里面分成

单牌,  对子, 三不带, 三带一

拖拉机, 顺子, 飞机

王炸

其中,   拖拉机最多10对, 顺子至少5张 最多12张

飞机内容比较多

我们先把所有可能出现的牌型列举出来

// 牌型
const (cardTypeNIL int = iota // 留空// 单牌cardTypeSINGLE// 对子cardTypeDUAD// 三干cardTypeTRIPLE0// 三带一cardTypeTRIPLE1// 3对拖拉机cardTypeTRACTOR3// 4对拖拉机cardTypeTRACTOR4// 5对拖拉机cardTypeTRACTOR5// 6对拖拉机cardTypeTRACTOR6// 7对拖拉机cardTypeTRACTOR7// 8对拖拉机cardTypeTRACTOR8// 9对拖拉机cardTypeTRACTOR9// 10对拖拉机cardTypeTRACTOR10// 5张顺子cardTypeSTRAIGHT5// 6张顺子cardTypeSTRAIGHT6// 7张顺子cardTypeSTRAIGHT7// 8张顺子cardTypeSTRAIGHT8// 9张顺子cardTypeSTRAIGHT9// 10张顺子cardTypeSTRAIGHT10// 11张顺子cardTypeSTRAIGHT11// 12张顺子cardTypeSTRAIGHT12// 飞机不带cardTypePLANE20// 3飞机不带cardTypePLANE30// 4飞机不带(这里其实可以当做3飞机带3单) cardTypePLANE31cardTypePLANE40// 5飞机不带cardTypePLANE50// 6飞机不带cardTypePLANE60// 飞机带2单cardTypePLANE21// 3飞机带3单cardTypePLANE31// 4飞机带4单cardTypePLANE41// 5飞机带5单cardTypePLANE51// 炸弹cardTypeBOMB// 王炸火箭cardTypeROCKET
)

计算牌型前别忘记先洗一次牌

首先分析1~4张牌的牌型

1张肯定是单牌

// 单张
func (self TCards) getCardType1() (int, int) {return cardTypeSINGLE, self[0].nPoint // 单张的只有单牌
}

2张牌可能是王炸或者对子

// 两张牌
func (self TCards) getCardType2() (int, int) {if self[0].nPoint == cardPointX && self[1].nPoint == cardPointY {return cardTypeROCKET, self[0].nPoint // 王炸}if self[0].nPoint == self[1].nPoint {return cardTypeDUAD, self[0].nPoint // 一样的是对子}return cardTypeNIL, 0
}

3张牌只能是3不带

// 三张牌, 只可能是三干
func (self TCards) getCardType3() (int, int) {if self[0].nPoint == self[1].nPoint && self[0].nPoint == self[2].nPoint {return cardTypeTRIPLE0, self[0].nPoint // 三张一样单牌}return cardTypeNIL, 0
}

4张牌只能是三带一或者炸弹

// 四张牌, 可能是三带一 或者
func (self TCards) getCardType4() (int, int) {if self[1].nPoint != self[2].nPoint {return cardTypeNIL, 0 // 如果中间两张不相等就没意义了}if self[0].nPoint == self[3].nPoint {return cardTypeBOMB, self[1].nPoint // 如果首位两张也相等(因为是排序的, 通过夹逼准则, 四张牌都相等)}if self[0].nPoint == self[1].nPoint || self[1].nPoint == self[3].nPoint {return cardTypeTRIPLE1, self[1].nPoint // 只要有一个相等就是三带一}return cardTypeNIL, 0
}

超过5张牌的情况就比较复杂了.....  顺子,  拖拉机,  飞机等其他情况

我们依次来做判断

首先是比较简单的顺子算法


// 可以检查是否是顺子
func (self TCards) checkCardTypeStraight() (int, int) {nFirst := self[0].nPoint // 起始的牌nLen := len(self)// 顺子最少5张, 最多3 -> A = 12 张if nLen < 5 || nLen > 12 {return cardTypeNIL, cardPointNIL}// 按顺序计算是否正常for i := 1; i < nLen; i++ {if self[i].nPoint-nFirst != i {return cardTypeNIL, cardPointNIL}}// 到了A就要截止if self[nLen-1].nPoint > cardPointA {return cardTypeNIL, cardPointNIL}return cardTypeSTRAIGHT5 + nLen - 5, self[0].nPoint
}

再次是同样简单的拖拉机


// 6张牌可以检查是否是拖拉机
func (self TCards) checkCardTypeTractor() (int, int) {nFirst := self[0].nPointnLen := len(self)// 必须是双数卡组才可能是拖拉机if nLen%2 == 1 {return cardTypeNIL, cardPointNIL}// 最少3对,  最多10对if nLen < 6 || nLen > 20 {return cardTypeNIL, cardPointNIL}// 第一张拖拉机对子if self[1].nPoint != nFirst {return cardTypeNIL, cardPointNIL}// 循环后面的拖拉机对子for i := 1; i < nLen/2; i++ {if self[2*i].nPoint-nFirst != i {return cardTypeNIL, cardPointNIL}if self[2*i+1].nPoint-nFirst != i {return cardTypeNIL, cardPointNIL}}return cardTypeTRACTOR3 + nLen/2 - 3, self[0].nPoint // 6张 3对拖拉机起, 长度+2 就是+1
}

飞机分成3个不带的飞机和3个带1的两种. 有些部分还有3个带一对, 或者不到最后一手牌必须进行三带一 (本公司算法)

其中三个的部分和拖拉机差不多. 由于夹逼原则,  排序过后只需要第一第三张牌符合条件即可


// 飞机全是三不带
func (self TCards) getCardTypePlane3Only() (int, int) {nLen := len(self)// 基础数量判断if nLen < 6 || nLen > 18 {return cardTypeNIL, cardPointNIL}nFirst := self[0].nPoint// 3张牌做3张牌循环,  先三三检查是否满足if self[2].nPoint != nFirst {return cardTypeNIL, cardPointNIL}// 再检查是否依次递增for i := 1; i < nLen/3; i++ {if self[i*3].nPoint-nFirst != i {return cardTypeNIL, cardPointNIL}if self[i*3+2].nPoint-nFirst != i {return cardTypeNIL, cardPointNIL}}return cardTypePLANE20 + (nLen / 3) - 2, self[0].nPoint
}

三带一稍微复杂一点. 需要找到所有牌的数量, 然后进行检测


// 飞机是三带一
func (self TCards) getCardTypePlane3And1() (int, int) {nLen := len(self)var data [15]int// 数量for _, pCard := range self {data[pCard.nPoint]++}// 找到飞机主干findFun := func(nStart int) int {for i := nStart; i < 15; i++ {if data[i] > 3 {return i}}return 0}n1 := findFun(1)for i := 0; i < nLen/4; i++ {if n1 == 0 {return cardTypeNIL, cardPointNIL}n2 := findFun(n1)if n2 != n1+1 {return cardTypeNIL, cardPointNIL}n1 = n2}return cardTypePLANE21 + (nLen / 4) - 2, n1
}

到此为止,  牌型的部分暂时告一段落.

golang制作一个斗地主游戏服务器[5]:牌型相关推荐

  1. 云原生项目实践DevOps(GitOps)+K8S+BPF+SRE,从0到1使用Golang开发生产级麻将游戏服务器—第7篇...

    空血来战玩法 & 游戏规则篇 空血来战使用纯正的四川麻将玩法,分为三人模式和四人两种模式,三人模式<三人两房>只用条子和筒子两种花色共72张牌,游戏节奏更快,对战更激烈.四人模式& ...

  2. 表白小游戏教程:制作一个小游戏送给喜欢的TA(不会编程也能学会哦)

    大家好哇~ 欢迎翻开波波和阿菌的长篇故事~ 不过捏,今天我们不讲故事,今天将由阿菌和大家分享一个小教程:教大家制作一个小游戏,可以用来送给喜欢的人.无须任何计算机专业基础,只要能操作电脑,并在初一的数 ...

  3. python多进程关闭socket_用Python制作一个多进程UDP服务器,一个进程监听一个p

    我想用Python制作一个多进程UDP服务器,从一个类中为每个进程监听一个端口: processListener.py:import multiprocessing import socket cla ...

  4. c语言改u3d游戏,使用Unity3D怎么制作一个五子棋游戏

    使用Unity3D怎么制作一个五子棋游戏 发布时间:2021-04-17 17:56:36 来源:亿速云 阅读:106 作者:Leah 本篇文章为大家展示了使用Unity3D怎么制作一个五子棋游戏,内 ...

  5. python可视化迷宫求解_如何用 Python 制作一个迷宫游戏

    相信大家都玩过迷宫的游戏,对于简单的迷宫,我们可以一眼就看出通路,但是对于复杂的迷宫,可能要仔细寻找好久,甚至耗费数天,然后可能还要分别从入口和出口两头寻找才能找的到通路,甚至也可能找不到通路. 虽然 ...

  6. 虚幻4学习笔记(8)动手制作一个小游戏

    动手制作一个小游戏 新节点介绍 前期准备 搭建场景 门蓝图 灯蓝图 创建关卡蓝图 B站UP谌嘉诚课程:https://www.bilibili.com/video/BV164411Y732 新节点介绍 ...

  7. 使用VS制作一个小游戏(五子棋)

    使用VS制作一个小游戏(五子棋) 一.前期准备: 下载Visual Studio(以下使用的是VS2017) 下载Easyx库:官方easyx库下载 右上方下载 二.思路理解 (本次是简单的单机双人五 ...

  8. 用js制作一个扫雷游戏(vue版)

    使用js来制作一个扫雷游戏,可以分为以下几个步骤 1.根据不同难度构建扫雷游戏区域: 2.在游戏区域中放置地雷: 3.处理点击事件: 4.处理游戏结束事件 1.根据不同难度构建扫雷游戏区域 创建一个二 ...

  9. 用Phaser来制作一个html5游戏——flappy bird (一)

    用Phaser来制作一个html5游戏--flappy bird (一) Phaser是一个简单易用且功能强大的html5游戏框架,利用它可以很轻松的开发出一个html5游戏.在这篇文章中我就教大家如 ...

  10. 使用cmake搭建一个跨平台游戏服务器

    1 简言 当前游戏服务器开发,通常需要跨平台进行.开发人员在windows上进行代码编写,调试,然后发布到linux上编译运行.因此,构建一个既能在windows上运行,又可以在linux上运行的服务 ...

最新文章

  1. CBitmapButton的使用(转)
  2. HMM与条件随机场区别 转
  3. element not visible的解决方法
  4. 0401互联网新闻 | 企业微信新版发布;阿里巴巴发布“AI谣言粉碎机”
  5. GlobalPointer:用统一的方式处理嵌套和非嵌套NER
  6. 不平等博弈问题学习记录(三)(对于超实数在博弈下左大右小以及多堆情况的扩充)
  7. java 压缩文件夹_java 实现压缩文件(单文件 或 文件夹)
  8. C、C++ 学习经历
  9. LINUX的简单命令
  10. c盘能达到1T吗,为什么?
  11. 模板函数:将string类型变量转换为常用的数值类型和常用的数值类型转String
  12. Leetcode. 回文字符串的分割和最少分割数
  13. Unity3D 代码优化
  14. creo减速器建模实例,减速箱proE整体及零件图
  15. speex回声消除源码解读
  16. 使用C语言创建顺序表
  17. Python字符串拼接的四种方法
  18. 应对面试,准备的题目!!
  19. python协程处理多个文件_python:多任务(线程、进程、协程)
  20. PTA 公路村村通

热门文章

  1. 【报告分享】 2020-2021年数字内容产业趋势报告-企鹅智库 (附下载)
  2. java自动化键盘组合键_SELENIUM自动化模拟键盘快捷键操作实现解析
  3. CFAR原理详解及其matlab代码实现
  4. React Native集成阿里云推送----广播推送
  5. ps6人脸识别液化工具在哪_ps液化工具在哪
  6. 我了解的一些线阵相机知识
  7. 微型计算机原理8255跑马灯,单片机+74LS138译码器+跑马灯+8255A+8253方波实验详解
  8. 光电信息科学与工程学c语言吗,光电信息科学与工程是热门吗?本文讲给你讲个透彻...
  9. 周遭心理学的应用-什么是心理学?
  10. 北航计算机考研 跨考,北航计算机考研经验谈_跨考网