房卡麻将分析系列之"发牌器"算法设计

2023-05-16



               房卡麻将分析系列之"发牌器"算法设计



              大家好,经过一段时间的努力,在填平了大部分源码框架中的坑后,我们的”大赢家“红中麻将总算完成了1.0版本,虽然仍然有诸多问题,但总归算是有一个好的开始,希望后续诸事顺利,能够早日跑出流水,也欢迎各位合作商积极与我联系。


               回顾开发过程,我深深的体会到,一个有多年摸牌经验的服务器主程是有多么重要!记得年前帮一家公司做房卡麻将项目,对方从上到下,基本没人会玩麻将,诸事都需要请教麻友,这样的情况我觉得上线的产品应该也不太会好吧,没爱的设计~!不过我可是8岁就上牌桌,八十年代家里就有了一幅竹制麻将。而童年时每年最开心的事情,莫过于过年时和小伙伴们”搓麻“赌压岁钱了。上大学离家之前的十几年里,时常家里”叮叮咣咣“的”呼啦“声是我人生最重要的记忆了。现在的我,虽然一年也打不上两圈牌了,但是仍然可以不看牌面的情况下用手摸出每一张牌。


                             



                 在这种情况下,写麻将似乎是得心应手的事情。而在碰到胡牌算法调试时,快速理解并写出对应的发牌器算法,也是很有意思并且实用的事情。


                  ”发牌器“就是一套能够对所有操作需求生成出给玩家相应牌型的算法。对于棋牌开发者来说,这是必不可少的,他可以快速的帮助开发者调试出吃,碰,杠,听,胡等各个操作的正确性。节省调试的时间和成本。试想下,如果你让测试员自已打出”天胡“,这似乎是比登天还难的事情罢~。


                  今天,我们就来讲一下“发牌器”的开发原理和设计方法。


                  ”发牌器“的算法基于现有的麻将牌逻辑类扩展出一些函数即可,然后在。比如这样:




              在原本随机发牌函数的基础上增加各个牌型的发牌函数即可。然后就是为每个函数完成相应的牌型安排。


             比如,“七对子”牌型:


//牌型发牌 - 七对子

void CGameLogic::SetCardData_QiDuiZi(BYTE cbLeftCardCount, BYTE cbCardData[], BYTE cbMaxCount)

{


//座位

BYTE cbChar = 0;

//玩家的牌

//玩家1: 饼对,八饼对,四万对,五万对,二条对,四对,还有一个九饼待配对

BYTE cbP1PaiData[13] = { 0x04, 0x04, 0x08, 0x08, 0x09, 0x14, 0x14, 0x15, 0x15, 0x22, 0x22, 0x24, 0x24 };

BYTE cbP2PaiData[13] = { 0x11, 0x11, 0x11, 0x11, 0x13, 0x13, 0x15, 0x15, 0x27, 0x27, 0x28, 0x28, 0x19 };

BYTE cbP3PaiData[13] = { 0x22, 0x22, 0x22, 0x22, 0x23, 0x23, 0x23, 0x23, 0x27, 0x27, 0x29, 0x29, 0x33 };

BYTE cbP4PaiData[13] = { 0x31, 0x31, 0x31, 0x32, 0x33, 0x34, 0x34, 0x35, 0x35, 0x37, 0x37, 0x44, 0x44 };


//发给玩家的牌

BYTE cbP1QiPai = 0x09;  //玩家起牌自摸。

BYTE cbP2QiPai = 0x09  ;//玩家起牌打出去吃胡。

BYTE cbP3QiPai = 0x23; 

BYTE cbP4QiPai = 0x04; 

BYTE cbP5QiPai = 0x19; 

BYTE cbP6QiPai = 0x26; 

BYTE cbP7QiPai = 0x33;

BYTE cbP8QiPai = 0x28;

 

        //填充到发牌的手牌数据里。

CopyMemory(&cbCardData[cbLeftCardCount - (MAX_COUNT - 1)], cbP1PaiData, sizeof(cbP1PaiData));

CopyMemory(&cbCardData[cbLeftCardCount - 2 * (MAX_COUNT - 1)], cbP2PaiData, sizeof(cbP2PaiData));

CopyMemory(&cbCardData[cbLeftCardCount - 3 * (MAX_COUNT - 1)], cbP3PaiData, sizeof(cbP3PaiData));

CopyMemory(&cbCardData[cbLeftCardCount - 4 * (MAX_COUNT - 1)], cbP4PaiData, sizeof(cbP4PaiData));


       //填充到起牌的数据前八个牌里面。

cbCardData[cbLeftCardCount - 4 * (MAX_COUNT - 1) - 1] = cbP1QiPai;

cbCardData[cbLeftCardCount - 4 * (MAX_COUNT - 1) - 2] = cbP2QiPai;

cbCardData[cbLeftCardCount - 4 * (MAX_COUNT - 1) - 3] = cbP3QiPai;

cbCardData[cbLeftCardCount - 4 * (MAX_COUNT - 1) - 4] = cbP4QiPai;

cbCardData[cbLeftCardCount - 4 * (MAX_COUNT - 1) - 5] = cbP5QiPai;

cbCardData[cbLeftCardCount - 4 * (MAX_COUNT - 1) - 6] = cbP6QiPai;

cbCardData[cbLeftCardCount - 4 * (MAX_COUNT - 1) - 7] = cbP6QiPai;

cbCardData[cbLeftCardCount - 4 * (MAX_COUNT - 1) - 8] = cbP6QiPai;

}


          这样在牌局开始时,四个玩家即按如上牌型得到手牌牌墙,并按设定的起牌摸牌。这样即可快速进行七小对的测试。


         再来看一个“杠底开花”


//牌型发牌 - 杠上开花

void CGameLogic::SetCardData_GangShangKaiHua(BYTE cbLeftCardCount, BYTE cbCardData[], BYTE cbMaxCount)

{

//座位

BYTE cbChar = 0;

//玩家的牌

//玩家1:一饼三个待杠

BYTE cbP1PaiData[13] = { 0x01, 0x01, 0x01, 0x02, 0x02, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x31, 0x31 };

BYTE cbP2PaiData[13] = { 0x11, 0x11, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x31, 0x32 };

BYTE cbP3PaiData[13] = { 0x21, 0x21, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x33, 0x33 };

BYTE cbP4PaiData[13] = { 0x31, 0x31, 0x31, 0x32, 0x33, 0x34, 0x34, 0x35, 0x35, 0x37, 0x37, 0x34, 0x34 };


//发给玩家的牌

BYTE cbP1QiPai = 0x01;//起手暗杠

BYTE cbP2QiPai = 0x31;//杠后起牌东风胡

BYTE cbP3QiPai = 0x23; 

BYTE cbP4QiPai = 0x24;

BYTE cbP5QiPai = 0x25; 

BYTE cbP6QiPai = 0x26;

BYTE cbP7QiPai = 0x27;

BYTE cbP8QiPai = 0x28;


CopyMemory(&cbCardData[cbLeftCardCount - (MAX_COUNT - 1)], cbP1PaiData, sizeof(cbP1PaiData));

CopyMemory(&cbCardData[cbLeftCardCount - 2 * (MAX_COUNT - 1)], cbP2PaiData, sizeof(cbP2PaiData));

CopyMemory(&cbCardData[cbLeftCardCount - 3 * (MAX_COUNT - 1)], cbP3PaiData, sizeof(cbP3PaiData));

CopyMemory(&cbCardData[cbLeftCardCount - 4 * (MAX_COUNT - 1)], cbP4PaiData, sizeof(cbP4PaiData));


cbCardData[cbLeftCardCount - 4 * (MAX_COUNT - 1) - 1] = cbP1QiPai;

cbCardData[cbLeftCardCount - 4 * (MAX_COUNT - 1) - 2] = cbP2QiPai;

cbCardData[cbLeftCardCount - 4 * (MAX_COUNT - 1) - 3] = cbP3QiPai;

cbCardData[cbLeftCardCount - 4 * (MAX_COUNT - 1) - 4] = cbP4QiPai;

cbCardData[cbLeftCardCount - 4 * (MAX_COUNT - 1) - 5] = cbP5QiPai;

cbCardData[cbLeftCardCount - 4 * (MAX_COUNT - 1) - 6] = cbP6QiPai;

cbCardData[cbLeftCardCount - 4 * (MAX_COUNT - 1) - 7] = cbP6QiPai;

cbCardData[cbLeftCardCount - 4 * (MAX_COUNT - 1) - 8] = cbP6QiPai;

}


          玩家在拿到一饼后即可暗杠,摸出东风后胡。


         其它的算法也都可以按同样的路子改出来,注意好牌型和玩家对应关系就可以了。


        好,这节课就讲到这里,咱们下次继续讲”房卡“麻将的开发技巧~


        


  ”房卡“麻将研发技巧,尽在”红孩儿的游戏开发之路“,欢迎关注公众号!

                                                                                      


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

房卡麻将分析系列之"发牌器"算法设计 的相关文章

  • 判断N 数码是否有解 牛人总结 归并排序

    作者 力的博客 先介绍八数码问题 xff1a 我们首先从经典的八数码问题入手 xff0c 即对于八数码问题的任意一个排列是否有解 xff1f 有解的条件是什么 xff1f 我在网上搜了半天 xff0c 找到一个十分简洁的结论 八数码问题原始
  • 爬虫技术概览

    爬虫介绍 简介 自动化 半自动化从互联网上采集数据的程序 爬虫框架 一个简单的爬虫框架 外链图片转存失败 源站可能有防盗链机制 建议将图片保存下来直接上传 img 7ifdLU0V 1625273924704 http m qpic cn
  • 怎样在github上发布pre-release和release?

    请参考 xff1a https jingyan baidu com album ad310e80e0c1d11848f49e7f html picindex 61 2 以上是通过网页进行操作的 xff1b 能通过GUI进行操作吗 xff1f
  • git fatal: unrecognized input ^[

    原因是安装了一个vim的插件NREDTREE xff0c 另外需要退出当前用户然后重新登录
  • keil main之前执行过程

    硬件复位后 第一步是执行复位处理程序 这个程序的入口在启动代码里 默认 摘录一段cortex m3的复位处理入口代码 Reset Handler PROC PROC等同于FUNCTION 表示一个函数的开始 与ENDP相对 EXPORT R
  • 蓝牙物理链路类型:SCO和ACL链路与A2DP

    转载于https blog csdn net wenzongliang article details 84689377 蓝牙链路分两种同步链路 SCO 和异步链路 xff08 ACL xff09 A2DP xff08 Advanced A
  • FreeRTOS源码分析-异常处理

    asm void vPortSVCHandler void PRESERVE8 ldr r3 61 pxCurrentTCB Restore the context ldr r1 r3 Use pxCurrentTCBConst to ge
  • FreeRTOS源码分析-代码结构

    FreeRTOS作为开源的轻量级实时性操作系统 xff0c 不仅实现了基本的实时调度 信号量 队列和存储管理 xff0c 而且在商业应用上不需要授权费 FreeRTOS的实现主要由list c queue c croutine c和task
  • 建站基础:WordPress安装教程图解

    http www metsky com archives 430 html 本文介绍WordPress xff08 WP xff09 安装方法 xff0c 虽然很多IDC都会主动帮站长安装 xff0c 安装过程也很简单 xff0c 但毕竟是
  • 国内众筹

    http www zhihu com question 21022884 rf 61 20050061 非股权众筹网站 xff1a 点名时间 中国最大众筹平台 支持创新的力量 国内领先的众筹网站 xff0c 主打科技新硬件的综合类众筹网站
  • I2C slave address

    1 同一 I2C bus device 之 I2C slaver address 不可一样 2 检查 这些 devices 是否可以变更 I2C slaver address hardware pin control or software
  • FreeRTOS Task switch

    vTaskSwitchContext中看pxCurrentTCB traceTASK SWITCHED OUT 切出 taskSELECT HIGHEST PRIORITY TASK traceTASK SWITCHED IN 切入新的ta
  • cocoapods install

    http blog csdn net home zhang article details 47317751
  • UITableView

    http www cnblogs com kenshincui p 3931948 html
  • 一些网址

    http www chanpin100 com 点击打开链接
  • win10下的docker桌面端配置ubuntu进行访问

    前言 xff1a win10下安装了docker桌面端 xff0c 想使用linux系统来访问docker 1 win10下docker安装好之后 xff0c 可以直接使用powershell来访问docker环境 xff0c 如下 xff
  • ROS的基本用法二 服务通信

    第一节 xff1a ROS的服务 摘要 xff1a 介绍ROS的服是双向的通信 xff0c 客户端提交 xff0c 服务端处理后返回到客户端 1 理论介绍 自定义数据类型 xff0c 根据自定义数据类型进行处理 xff0c 客户端请求 xf
  • Ubuntu22安装docker-ce

    阿里云 span class token function sudo span span class token function apt get span remove span class token function docker s
  • C语言之字符数组和字符串末尾加‘\0‘情况浅述

    在字符数组中 xff0c 以字符串形式存入 xff0c 机器会自动加上 39 0 xff1b 在字符数组中 xff0c 以字符形式存入 xff0c 机器不会自动加上 39 0 39 在字符串中 xff0c 效果一样 在C语言中 xff1a
  • Ubuntu 16.04+ROS kinetic+rviz模拟turtlebot机器人时出现的问题-

    鉴于ROS kinetic 版本主能兼容 ubuntu 16 04和15 01版本 xff0c 而16 04的版本由于环境比较新 xff0c 感觉还有很多问题需要解决 博主在进行RVIZ模拟仿真机器人跑时 xff0c 出现了以下问题 xff

随机推荐

  • Win10下 Ubuntun1604LTS双系统安装

    1 下载Ubuntu 16 04 https www ubuntu com download alternative downloads 下载 16 04LTS版 2018 03 10 Ubuntu 16 04 4 LTS Ubuntu 1
  • 主祷文

    主 祷 文 我们在天上的父 xff0c 愿人都尊你的名为圣 愿你的国降临 愿你的旨意行在地上 xff0c 如同行在天上 我们日用的饮食 xff0c 今日赐给我们 免我们的债 xff0c 如同我们免了人的债 不叫我们遇见试探 xff0c 救我
  • 嵌入式Linux系统串口通信协议设计

    1 设计基础 这里指的协议是应用层协议 xff0c 针对应用协议的设计 xff0c 需要注意的有几个基本点 xff1a 可识别 xff0c 兼容性 xff0c 访问控制 xff0c 可追溯 xff0c 数据完整性校验 首先是可识别 xff0
  • 什么是导航?导航具有什么样的作用?

    导航 xff08 Navigation xff09 是引导载体从起始点安全 可靠地引导到目的地的过程 xff0c 导航的基本作用就是回答我在哪里 xff1f 通常用载体在空间的即时位置 速度 姿态和航向等参数来描述导航过程 xff0c 这些
  • 一个失败的程序员

    一个失败的程序员 第一次写博客 xff0c 看了别人的很久 xff0c 也想了很久 xff0c 觉得无论文笔有多不好 xff0c 分享的内容有多糟糕 xff0c 都应该有这个勇气迈出第一步 xff0c 记录生活 抒写回忆 xff0c 等到回
  • 学习FreeRTOS前的准备工作

    转自 http bbs armfly com read php tid 61 1552 了解FreeRTOS之前 xff0c 一定要搞清楚FreeRTOS xff0c SafeRTOS和OpenRTOS之间的关系 1 先说FreeRTOS和
  • Linux网络编程(一)

    Linux网络编程博文均选自 unix网络编程 Richard Stevens xff0c 仅限于学习与查漏补缺只用 xff0c 原址 xff1a http blog csdn net hongchangfirst article deta
  • vscode配合gitee同步云设置

    更换开发设备后 xff0c 新安装的vscode软件 xff0c 是没有原先的配置的 xff0c 诸如快捷键 xff0c 快捷代码段生成 安装的各个插件 xff0c 插件的配置等都木大了 xff0c 开发起来会很别扭 xff0c 网上最多的
  • 升压减压以及充电电路设计

    供电电路在整个硬件系统中都是极其重要的 xff0c 只有能产生稳定电压与电流的供电电路才能保证整个硬件系统的正常工作 在本系统中 xff0c STM32F103C8T6需要的电压为3 3V xff0c 同时还有其他的模块需要5V的电压 xf
  • Java枚举详解及常见用法

    1 枚举的使用场景 枚举是一个被命名的整型常数的集合 xff0c 用于声明一组带标识符的常数 枚举在曰常生活中很常见 xff0c 例如一个人的性别只能是 男 或者 女 xff0c 一周的星期只能是 7 天中的一个等 类似这种当一个变量有几种
  • ros编译时与opencv发生冲突的解决办法 opencv_imgcodecs3.so.3.3.1: undefined reference to `TIFFReadDirectory@LIBTIFF

    在编译ros项目的时候 xff0c 遇到下面的错误 xff1a 38 Building CXX object cube slam detect 3d cuboid CMakeFiles detect 3d cuboid dir src ma
  • ROS的一些常用的命令

    下面是ros下面的一些常用操作 xff0c 先做个总结 xff0c 方便后续使用 1 只编译工作空间下面的一个包 catkin make DCATKIN WHITELIST PACKAGES span class token operato
  • realsense相机两种获取相机内外参的方式

    realsense相机出厂的时候一般都标定好了 xff0c 直接读取他们的内参即可 终端输入 xff1a rs sensor control 然后按照提示操作即可 方法 xff1a https blog csdn net mystyle a
  • 【Python开发利器-TKinterDesigner 】 :第一讲:TkinterDesigner的基本功能介绍

    Python开发利器 TKinterDesigner xff1a 第一讲 xff1a TkinterDesigner的基本功能介绍
  • 基于Spine动画的AVATAR换装系统优化

    大家好 xff0c 我是红孩儿 xff0c 目前在玩吧技术专家组负责技术研发工作 xff0c 好久不见 xff0c 作为一名引擎开发者 xff0c 这次我给大家分享一下基于Spine动画的AVATAR换装优化 xff0c 希望能够对有类似需
  • TKinterDesigner v1.6.4 前瞻- 即将开启Python移动开发时代

    TKinterDesigner v1 6 4 前瞻 即将开启Python移动开发时代 我想 xff1a 这可能是一个新时代的开启吧
  • TKinterDesigner从入门到精通视频教程

    想使用TKinter开发桌面应用 xff1f 想使用TKinter开发移动应用 xff1f TKinterDesigner来帮助你吧 xff01 欢迎使用TKinterDesigner xff01 以下是 TKinterDesigner从入
  • 房卡麻将分析系列 "牌局回放" 之 播放处理

    持续放出房卡麻将设计与研发讲解 敬请关注微信共众号 xff1a 红孩儿的游戏开发之路 房卡麻将分析系列 34 牌局回放 34 之 播放处理 昨天红孩儿给大伙讲了讲 牌局回放 的数据记录处理 xff0c 有了数据的存储 xff0c 下面就是数
  • AutoSAR 标准--基础安全特性

    CSM 密码服务管理器 Crypto Service Manager xff1a 访问加密服务 配置用于执行服务的加密服务和算 同步或异步执行的配置 安全计数器的配置 对加密密钥的操作配置 配置证书操作 CRYIF 密码算法接口 Inter
  • 房卡麻将分析系列之"发牌器"算法设计

    房卡麻将分析系列之 34 发牌器 34 算法设计 大家好 xff0c 经过一段时间的努力 xff0c 在填平了大部分源码框架中的坑后 xff0c 我们的 大赢家 红中麻将总算完成了1 0版本 xff0c 虽然仍然有诸多问题 xff0c 但总