加入收藏 | 设为首页 | 会员中心 | 我要投稿 衡阳站长网 (https://www.0734zz.cn/)- 数据集成、设备管理、备份、数据加密、智能搜索!
当前位置: 首页 > 创业 > 经验 > 正文

麻将游戏算法深入解析及实现代码

发布时间:2021-01-01 04:47:23 所属栏目:经验 来源:网络整理
导读:麻将游戏算法深入解析及实现代码 这两天为了工具箱的完善,整理了这些年引擎开发的一些资料,无意中发现06年写的一个麻将算法,编译运行了一下,还是有点意思的,拿出来整理一下分享给大家。 麻将是一种大家最喜爱的娱乐活动之一,相信所有人都有接触过。我
副标题[/!--empirenews.page--]

麻将游戏算法深入解析及实现代码

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

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

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

麻将游戏算法深入解析及实现代码

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

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

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

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

     我们先来看一下CMJ类。

CMJ.h:

#ifndef _CMJ_H 
#define _CMJ_H 
//============================================ 
//Author:Honghaier 
//Date:2006-12-20 
//QQ:285421210 
//============================================ 
#include <windows.h> 
#include <iostream> 
#include <vector> 
#include <algorithm> 
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 iValu3); 
 //检测是否四重张 
 bool CheckAAAAPai(int iValue1,int iValu3,int iValue4); 
 //检测是否三连对 
 bool CheckAABBCCPai(int iValue1,int iValue3,int iValue4,int iValue5,int iValue6); 
 //检测是否三连高压 
 bool CheckAAABBBCCCPai(int iValue1,int iValue6,int iValue7,int iValue8,int iValue9); 
 //检测是否三连刻 
 bool CheckAAAABBBBCCCCPai(int iValue1,int iValue9,int iValue10,int iValue11,int iValue12); 
 //检测是否六连对 
 bool CheckAABBCCDDEEFFPai(int iValue1,int iValue12); 
 //带将牌检测=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= 
  
 //检测是否胡牌(张) 
 bool Check5Pai(int iValue1,int iValue5); 
 //检测是否胡牌(张) 
 bool Check8Pai(int iValue1,int iValue8); 
 //检测是否胡牌(张) 
 bool Check11Pai(int iValue1,int iValue11); 
 //检测是否胡牌(张) 
 bool Check14Pai(int iValue1,int iValue12,int iValue13,int iValue14); 
 
 //不带将牌检测-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= 
  
 //检测是否胡牌(张) 
 bool Check3Pai(int iValue1,int iValue3); 
 //检测是否胡牌(张) 
 bool Check6Pai(int iValue1,int iValue6); 
 //检测是否胡牌(张) 
 bool Check9Pai(int iValue1,int iValue9); 
 //检测是否胡牌(张) 
 bool Check12Pai(int iValue1,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 

(编辑:衡阳站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读