成都麻将胡牌算法

2023-05-16

//四川麻将胡牌算法(不支持风、花牌):支持缺一门,七小对,正常胡牌,带杠

//感谢 华仔 对我的代码提出了宝贵的意见,华仔很适合做测试啊!!

#include <stdio.h>
#include <memory.h>
#include <string.h>
#define TEST 0
#if TEST
#define LOG(fmt, ...) printf(fmt"\n", ##__VA_ARGS__)
#else
#define LOG(fmt, ...)
#endif
const char g_typedef[3] = {'W', 'T', 'D'};
class CMahJangg
{
public:
CMahJangg()
{
for (int i = 0; i < 3; i++)
{
m_TypeNum[i] = 0;
memset(m_CardNum[i], 0, sizeof(int)*9);
memset(log, 0, sizeof(char)*100);
m_GangNum = false;
}
}
void Init(char *pCards)
{
char *pTmp = pCards;
int nNum = 0;
char cType = 0;
while (*pTmp != '\0')
{
nNum = *pTmp - '0';
cType = *(pTmp+1);
for (int i = 0; i < 3; i++)
{
if (cType == g_typedef[i])
{
m_TypeNum[i]++;
m_CardNum[i][nNum-1]++;
break;
}
}
pTmp += 2;
}
}
bool IsSevenCouple()
{
if (14 == m_TypeNum[0] + m_TypeNum[1] + m_TypeNum[2])
{
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 9; j++)
{
if (m_CardNum[i][j] != 0 && m_CardNum[i][j] != 2)
{
return false;
}
}
}
return true;
}
return false;
}
bool IsWin()
{
if (m_TypeNum[0] && m_TypeNum[1] && m_TypeNum[2])
{
//不是缺一门
LOG("不是缺一门\n");
return false;
}
if (IsSevenCouple())
{
//七小对
LOG("七小对\n");
return true;
}
//正常胡牌:有一个对子,其余的要么三支顺子,要么三支一样的(或四只)
bool HasCouple = false;
for (int i = 0; i < 3; i++)
{
if (!IsOneTypeWin(m_CardNum[i], m_TypeNum[i], HasCouple, i))
{
LOG("花色:%c不满足胡牌\n", g_typedef[i]);
return false;
}
}
if (!HasCouple)
{
LOG("没有对子,不能胡牌\n");
return false;
}
if (m_TypeNum[0]+m_TypeNum[1]+m_TypeNum[2]-14 != m_GangNum)
{
LOG("你丫诈和,牌的数量不对.\n");
return false;
}
LOG("正常胡牌\n");
return true;
}
bool IsOneTypeWin(int *pCards, int Num, bool &HasCouple, int type)
{
if (Num == 0)
{
return true;
}
char tmp[20] = {0};
for (int i = 0; i < 9; i++)
{
if (pCards[i] >= 2 && !HasCouple)
{
pCards[i] -= 2;
HasCouple = true;
if (IsOneTypeWin(pCards, Num-2, HasCouple, type))
{
sprintf(tmp, "%d%c%d%c ", i+1, g_typedef[type], i+1, g_typedef[type]);
strcat(log, tmp);
LOG("当前牌:%s\n", log);
return true;
}
pCards[i] += 2;
HasCouple = false;
}
if (pCards[i] == 4)
{
pCards[i] -= 4;
if (IsOneTypeWin(pCards, Num-4, HasCouple, type))
{
sprintf(tmp, "%d%c%d%c%d%c%d%c ", i+1, g_typedef[type], i+1, g_typedef[type], i+1, g_typedef[type], i+1, g_typedef[type]);
strcat(log, tmp);
LOG("当前牌:%s\n", log);
m_GangNum++;
return true;
}
pCards[i] += 4;
}
if (pCards[i] >= 3)
{
pCards[i] -= 3;
if (IsOneTypeWin(pCards, Num-3, HasCouple, type))
{
sprintf(tmp, "%d%c%d%c%d%c ", i+1, g_typedef[type], i+1, g_typedef[type], i+1, g_typedef[type]);
strcat(log, tmp);
LOG("当前牌:%s\n", log);
return true;
}
pCards[i] += 3;
}
if (i < 7 && pCards[i] && pCards[i+1] && pCards[i+2])
{
pCards[i] -= 1;
pCards[i+1] -= 1;
pCards[i+2] -= 1;
if (IsOneTypeWin(pCards, Num-3, HasCouple, type))
{
sprintf(tmp, "%d%c%d%c%d%c ", i+1, g_typedef[type], i+2, g_typedef[type], i+3, g_typedef[type]);
strcat(log, tmp);
LOG("当前牌:%s\n", log);
return true;
}
pCards[i] += 1;
pCards[i+1] += 1;
pCards[i+2] += 1;
}
}
return false;
}
private:
int m_TypeNum[3]; //分别表示万、条、筒的个数
int m_CardNum[3][9]; //分别表示万、条、筒(W,T,D)
int m_GangNum;
char log[100];
};
bool IsMahJangWin(char *pCard)
{
CMahJangg mj;
mj.Init(pCard);
return mj.IsWin();
}

转载于:https://www.cnblogs.com/boyisjl/archive/2012/12/01/2796972.html

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

成都麻将胡牌算法 的相关文章

随机推荐

  • [雷达点云处理] 可视化方法CloudCompare 和 numpy保存

    点云可视化工具CloudCompare cloudcompare是一个开源的网站 https www cloudcompare org 安装方法为 1安装snap sudo apt span class token operator spa
  • arm linux串口控制led,通信程序设计 - Linux下ARM和单片机的串口通信设计

    3 通信程序设计 ARM 与单片机的串口通信程序包括两方面 xff1a 一方面是作为上位机的ARM 的串口通信程序 xff0c 另一方面是作为下位机的单片机的串口通信程序 在通信之前必须制定合理的通信协议以保证通信的可靠性和成功率 现约定双
  • 联想服务器rd系列,联想ThinkServer RD550服务器首发评测

    IT168 评测 9月22日 xff0c 在 34 新云力量 联想企业级业务策略暨ThinkServer Gen5发布会 34 上 xff0c 联想正式发布了基于最新的英特尔至强E5 2600 v3系列处理器ThinkServer第五代产品
  • 6、镜像和容器

    文章目录 隐藏 开发者必备的 Docker 实践指南镜像与容器 本文是全系列中第8 10篇 xff1a 专题 Docker入门 Docker踩坑及个人学习汇总 获取Centos7安装Docker各种姿势 xff08 指定版本 xff09 T
  • 《Docker-在Windows上安装Docker桌面》

    文章目录 Windows上安装Docker桌面一 Docker Desktop下载二 Docker Desktop 安装三 下载并安装Linux内核更新程序包四 安装 Linux 分发五 配置docker的镜像加速器六 通过Linux分发版
  • stm32经典笔试题_stm32嵌入式试题

    第一章 为什么学习 STM32 STM32 是一系列以 ARM Cortex M 为内核的 32 位嵌入式微控制器 第二章 初识 STM32 库 1 什么是启动文件 xff1f 启动文件的作用是什么 xff1f 具体实现了哪些功能 xff1
  • imu相机标定_相机+imu标定

    官方上是跑在ros indigo上的 xff0c 但是实测用kinetic也没问题 xff0c 主要就是装依赖的时候改下名字 下面命令行里有写注释 1 工具箱 Kalibr 安装 安装依赖 sudo apt get install pyth
  • linux双系统如何选择顺序,双系统中怎么设置Ubuntu多系统的默认启动顺序?

    很多人在安装Linux系统 xff0c 如Fedora或Ubuntu等操作系统玩的时候 xff0c 一般还会保留一份Windows操作系统作为主用系统 xff0c 但是发现安装了Linux系统之后 xff0c 默认的启动菜单就变成了Linu
  • rpe matlab,Constant velocity range-parameterized EKF initialization

    The RPEKF is a special type of filter that can be initialized using angle only measurements that is azimuth and or eleva
  • 计算机与工作 生活的小论文,电脑与生活作文

    电脑与生活作文 在生活 工作和学习中 xff0c 大家或多或少都会接触过作文吧 xff0c 作文是人们把记忆中所存储的有关知识 经验和思想用书面形式表达出来的记叙方式 那要怎么写好作文呢 xff1f 以下是小编收集整理的电脑与生活作文 xf
  • gVim的字体和背景颜色设置

    电脑环境是XP xff0c 软件是gVim7 3 xff0c 安装在C盘的 Program Files 下 如何设置gVim的字体和背景颜色 xff1a C gt Program Files gt Vim gt vimrc文件 xff0c
  • xlight ftp linux,Xlight FTP Server

    Xlight FTP Server的功能按钮都是中文的 xff0c 国内用户可以轻易地创建新的服务器 xff0c 并且能够为同一台计算机的多个端口创建各自的虚拟服务器 此外 xff0c 它还具有用户虚拟目录 xff0c 每个用户的虚拟目录都
  • 参数控制c语言代码走向,C语言可变参数完全解读

    本文转自 xff1a http www cnblogs com wangyonghui archive 2010 07 12 1776068 html 一 是什么 我们学习C语言时最经常使用printf 函数 xff0c 但我们很少了解其原
  • VHDL计算机硬件能直接执行吗,第5章 VHDL程序结构.ppt

    第5章 VHDL程序结构 VHDL 数字系统设计 第5章 VHDL程序结构 VHDL语言的特点 xff1a VHDL语言具有很强的电路描述和建模能力 xff0c 能从多个层次对数字系统进行建模和描述 xff0c 从而大大简化了硬件设计任务
  • opencv双目标定原理_双目视觉原理及流程概述

    击上方 新机器视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 双目原理 双目视觉是利用视差原理的一种视觉方法 如图所示为空间中一点P在左右相机中的成像点Pleft 61 Xleft Yleft xf
  • java怎么写算法_用Java写算法之一:冒泡排序

    从这篇文章开始 xff0c 我会陆陆续续将我所能用Java实现的算法在这里简单做个梳理 xff0c 也算温故而知新吧 受个人水平和时间限制 xff0c 可能会有错漏 xff0c 欢迎各位批评指正 那么 xff0c 就从冒泡排序开始 显然 x
  • docker显示linux桌面,怎样在桌面上安装 Docker CE?

    按照这些简单的步骤在你的 Linux Mac 或 Windows 桌面上安装 Docker CE 在上一篇文章中 xff0c 我们学习了容器世界的一些基本术语 当我们运行命令并在后续文章中使用其中一些术语时 xff0c 这些背景信息将会派上
  • 信号量-邮箱-消息队列的区别

    为什么要用 xff1a 任务间的通信可以通过全局变量或者信号量来完成 全局变量虽然可以承载通信的内容 xff0c 但是接收方无法意识到信息的到达 xff0c 除非发送方向接收方发送一个信号量 xff0c 或者接收方不断该全局变量 xff1b
  • 乱码大全(二) (转)

    乱码大全 二 转 64 more 64 2 XxencodeXML namespace prefix 61 o ns 61 34 urn schemas microsoft com Office office 34 gt 提到Uuencod
  • 成都麻将胡牌算法

    四川麻将胡牌算法 xff08 不支持风 花牌 xff09 支持缺一门 七小对 xff0c 正常胡牌 xff0c 带杠 感谢 华仔 对我的代码提出了宝贵的意见 xff0c 华仔很适合做测试啊 xff01 xff01 include lt st