麻将游戏算法深入解析

您所在的位置:网站首页 打麻将进牌的计算公式图 麻将游戏算法深入解析

麻将游戏算法深入解析

2024-07-17 02:28| 来源: 网络整理| 查看: 265

以此文奠我那些年中无意删除而删除的代码工程,另:本工作室承接棋牌算法研发合作业务,有兴趣可联系本QQ:285421210或微信honghaier_game 欢迎加入红孩儿【麻将研发】群: 605024890 敬请关注微信共众号:红孩儿的游戏开发之路        持续推出“房卡”麻将项目设计技巧,算法等等。                麻将游戏算法深入解析 (C++篇)

 

      这两天为了工具箱的完善,整理了这些年引擎开发的一些资料,无意中发现06年写的一个麻将算法,编译运行了一下,还是有点意思的,拿出来整理一下分享给大家。

 

       麻将是一种大家最喜爱的娱乐活动之一,相信所有人都有接触过。我写的这版算法,是可以吃,碰,杠,还有把牌摸完没有人胡时的皇庄和包听。是用控制台方式来表现的,什么?控制台?

       对,因为是算法的设计,所以用控制台来表现当然最简单了。

      当然,在交互时要用文字输入会有少许不便,不过这种形式的游戏可是图形游戏的鼻祖哦~

 

     好,废话不多说了,来说一下设计思路:

 

     对于麻将的一个玩家,都有一个牌墙的管理,这里封装了一副牌墙的各种算法,这个类我命名为CMJ。

     另外还有一个洗牌类,负责洗牌和发牌。这个类为CMJManage。

 

     我们先来看一下CMJ类。

CMJ.h:

#ifndef _CMJ_H #define _CMJ_H //============================================ //Author:Honghaier //Date:2006-12-20 //QQ:285421210 //============================================ #include #include #include #include using namespace std; #define MJPAI_ZFB 0 //中,发,白 #define MJPAI_FENG 1 //东西南北风 #define MJPAI_WAN 2 //万 #define MJPAI_TIAO 3 //条 #define MJPAI_BING 4 //饼 #define MJPAI_HUA 5 //花 #define MJPAI_GETPAI true //起牌 #define MJPAI_PUTPAI false //打牌 //节点信息 struct stPAI { int m_Type; //牌类型 int m_Value; //牌字 } ; //吃牌顺 struct stCHI { int m_Type; //牌类型 int m_Value1; //牌字 int m_Value2; //牌字 int m_Value3; //牌字 } ; // m_Type m_Value //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-// // 0 | 中 1 发2 白 // | // 1 | 东 1 西2 南 北 // | // 2 | 一万 二万 …… 九万 // | // 3 | 一条 二条 …… 九条 // | // 4 | 一饼 二饼 …… 九饼 // | // 5 | 春 夏 秋 东 竹 兰 梅 菊 // | //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-// //胡牌信息 struct stGoodInfo { char m_GoodName[100]; //胡牌术语 int m_GoodValue; //胡牌番数 } ; //牌 class CMJ { vector< int > m_MyPAIVec[6]; //起的种牌型 vector< int > m_ChiPAIVec[6]; //吃的种牌型 vector< int > m_PengPAIVec[6]; //碰的种牌型 vector< int > m_GangPAIVec[6]; //杠的种牌型 stPAI m_LastPAI; //最后起的牌 stGoodInfo m_GoodInfo; //胡牌信息 bool m_9LBD; //是否听连宝灯牌型 bool m_13Y; //是否听十三幺 int m_MKNum; //明刻数 int m_AKNum; //暗刻数 bool m_4AK; //是否是听四暗刻 vector< stCHI > m_TempChiPAIVec; //吃的可选组合 vector< stPAI > m_TempPengPAIVec; //碰的可选组合 vector< stPAI > m_TempGangPAIVec; //杠的可选组合 public: //构造 CMJ(); //析构 ~CMJ(); //初始化 void Init(); //起牌 bool AddPai(int p_Type,int p_Value); //取得对应的牌在牌墙的索引 int GetPaiIndex(int p_Type,int p_Value); //打牌(参数为对应的牌在牌墙的索引) bool DelPai(int PaiIndex); //删除牌 bool DelPai(int p_Type,int p_Value); //清空牌 void CleanUp(); //取得胡牌信息 stGoodInfo *GetInfo(); //检测是否胡牌 bool CheckAllPai(bool GetOrPut); //对所有的牌进行输出 void PrintAllPai(); //对一张牌进行输出 void PrintPai(int p_Type,int p_Value); //吃牌 bool CheckChiPai(int p_Type,int p_Value); //吃牌 bool DoChiPai(int p_iIndex,int p_Type,int p_Value); //碰牌 bool CheckPengPai(int p_Type,int p_Value); //碰牌 bool DoPengPai(int p_Type,int p_Value); //杠牌 bool CheckGangPai(int p_Type,int p_Value); //杠牌 bool DoGangPai(int p_Type,int p_Value); //对可吃的组合进行输出 void PrintChiChosePai(); //对可碰的组合进行输出 void PrintPengChosePai(); //对可杠的组合进行输出 void PrintGangChosePai(); //取得吃牌组合数 UINT GetChiChoseNum(); private: //检测是否胡牌(张) bool CheckAAPai(int iValue1,int iValue2); //检测是否三连张 bool CheckABCPai(int iValue1,int iValue2,int iValu3); //检测是否三重张 bool CheckAAAPai(int iValue1,int iValue2,int iValu3); //检测是否四重张 bool CheckAAAAPai(int iValue1,int iValue2,int iValu3,int iValue4); //检测是否三连对 bool CheckAABBCCPai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5,int iValue6); //检测是否三连高压 bool CheckAAABBBCCCPai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5,int iValue6,int iValue7,int iValue8,int iValue9); //检测是否三连刻 bool CheckAAAABBBBCCCCPai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5,int iValue6,int iValue7,int iValue8,int iValue9,int iValue10,int iValue11,int iValue12); //检测是否六连对 bool CheckAABBCCDDEEFFPai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5,int iValue6,int iValue7,int iValue8,int iValue9,int iValue10,int iValue11,int iValue12); //带将牌检测=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= //检测是否胡牌(张) bool Check5Pai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5); //检测是否胡牌(张) bool Check8Pai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5,int iValue6,int iValue7,int iValue8); //检测是否胡牌(张) bool Check11Pai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5,int iValue6,int iValue7,int iValue8,int iValue9,int iValue10,int iValue11); //检测是否胡牌(张) bool Check14Pai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5,int iValue6,int iValue7,int iValue8,int iValue9,int iValue10,int iValue11,int iValue12,int iValue13,int iValue14); //不带将牌检测-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= //检测是否胡牌(张) bool Check3Pai(int iValue1,int iValue2,int iValue3); //检测是否胡牌(张) bool Check6Pai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5,int iValue6); //检测是否胡牌(张) bool Check9Pai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5,int iValue6,int iValue7,int iValue8,int iValue9); //检测是否胡牌(张) bool Check12Pai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5,int iValue6,int iValue7,int iValue8,int iValue9,int iValue10,int iValue11,int iValue12); private: //胡牌判断 //检测是否胡大四喜 bool CheckD4X_HU(); //检则是否胡大三元 bool CheckD3Y_HU(); //检测是否胡绿一色 bool CheckL1S_HU(); //检测是否胡九莲宝灯 bool Check9LBD_HU(); //检测是否胡四杠 bool Check4Gang_HU(); //检测是否胡连七对 bool CheckL7D_HU(); //检测是否胡十三幺 bool Chekc13Y_HU(); //检测是否胡清幺九 bool CheckQY9_HU(); //检测是否胡小四喜 bool CheckX4X_HU(); //检测是否胡小三元 bool CheckX3Y_HU(); //检测是否胡字一色 bool CheckZ1S_HU(); //检测是否四暗刻 bool Check4AK_HU(); //检测是否一色双龙会 bool Check1S2LH_HU(); //检测是否一色四同顺 bool Check1S4TS_HU(); //检测是否一色四节高? bool Check1S4JG_HU(); //检测是否一色四步高? bool Check1S4BG_HU(); //检测是否三杠 bool Check3Gang_HU(); //检测是否混幺九 bool CheckHY9_HU(); //检测是否七对 bool Check7D_HU(); //检测是否七星不靠 bool Check7XBK_HU(); //检测是否全双刻? bool CheckQSK_HU(); //清一色 bool CheckQ1S_HU(); //检测是否一色三同顺 bool Check1S3TS_HU(); //检测是否一色三节高 bool Check1S3JG_HU(); //检测是否全大 bool CheckQD_HU(); //检测是否全中 bool CheckQZ_HU(); //检测是否全小 bool CheckQX_HU(); //检测是否青龙 bool CheckQL_HU(); //检测是否三色双龙会 bool Check3S2LH_HU(); //检测是否一色三步高 bool Check1S3BG_HU(); //全带五 bool CheckQD5_HU(); //三同刻 bool Check3TK_HU(); //三暗刻 bool Check3AK_HU(); //单钓将 bool CheckDDJ_HU(); //检测胡 bool CheckHU(); private: //听牌判断 //检测是否听九莲宝灯 bool Check9LBD_TING(); //检测是否听十三幺 bool Check13Y_TING(); //检测是否听四暗刻 bool Check4AK_TING(); //检测是否听牌 bool CheckTING(); } ; #endif

其对应的CPP :

#include "CMJ.h" //构造 CMJ::CMJ() { m_9LBD = false; m_13Y = false; m_4AK = false; m_AKNum = 0; m_MKNum = 0; } //析构 CMJ::~CMJ() { } //初始化 void CMJ::Init() { m_9LBD = false; m_13Y = false; m_4AK = false; m_AKNum = 0; m_MKNum = 0; } //加入新牌,并排序 bool CMJ::AddPai(int p_Type,int p_Value) { int iSize = m_MyPAIVec[p_Type].size(); bool t_Find = false; vector< int >::iterator Iter; for(Iter = m_MyPAIVec[p_Type].begin();Iter !=m_MyPAIVec[p_Type].end(); Iter++) { if((*Iter)>p_Value) { m_MyPAIVec[p_Type].insert(Iter,p_Value); t_Find = true; break; } } if(t_Find==false) { m_MyPAIVec[p_Type].push_back(p_Value); } m_LastPAI.m_Type = p_Type; m_LastPAI.m_Value = p_Value; return true; } //取得对应的牌在牌墙的索引 int CMJ::GetPaiIndex(int p_Type,int p_Value) { int count = 0; for(UINT i = 0 ; i < 6 ; i++ ) { vector< int >::iterator Iter; for(Iter = m_MyPAIVec[i].begin();Iter !=m_MyPAIVec[i].end(); Iter++) { if(p_Type==i&&(*Iter)==p_Value) { return count; } count++; } } return -1; } //打牌 bool CMJ::DelPai(int PaiIndex) { int count = 0; for(UINT i = 0 ; i < 6 ; i++ ) { vector< int >::iterator Iter; for(Iter = m_MyPAIVec[i].begin();Iter !=m_MyPAIVec[i].end(); Iter++) { if(count==PaiIndex) { m_MyPAIVec[i].erase(Iter); return true; } count++; } } return false; } //删除牌 bool CMJ::DelPai(int p_Type,int p_Value) { vector< int >::iterator Iter; for(Iter = m_MyPAIVec[p_Type].begin();Iter !=m_MyPAIVec[p_Type].end(); Iter++) { if((*Iter)==p_Value) { m_MyPAIVec[p_Type].erase(Iter); return true; } } return false; } //清空牌 void CMJ::CleanUp() { for(UINT i = 0 ; i < 6 ; i++ ) { m_MyPAIVec[i].clear(); m_ChiPAIVec[i].clear(); m_PengPAIVec[i].clear(); m_GangPAIVec[i].clear(); } } //取得胡牌信息 stGoodInfo *CMJ::GetInfo() { return &m_GoodInfo; } //对所有的牌进行函数调用 void CMJ::PrintAllPai() { cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3