• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > 麻将游戏算法深入解析及实现代码

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

作者:火云洞红孩儿 字体:[增加 减小] 来源:互联网 时间:2017-05-28

火云洞红孩儿 通过本文主要向大家介绍了麻将游戏算法,麻将游戏源代码,麻将游戏代码,手机麻将游戏代码,麻将算法代码等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

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

 这两天为了工具箱的完善,整理了这些年引擎开发的一些资料,无意中发现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 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 CheckQ



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

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

相关文章

  • 2017-05-28C++设计模式之享元模式
  • 2017-05-28c语言读取obj文件转换数据的小例子
  • 2017-05-28深入C++浮点数无效值定义与判定的解决办法
  • 2017-05-28C语言putenv()函数和getenv()函数的使用详解
  • 2017-05-28c++遍历lua table示例
  • 2017-05-28MFC创建模态对话框和非模态对话框的方法
  • 2017-05-28探讨C语言中关键字volatile的含义
  • 2017-05-28基于C++中sprintf的错误总结详解
  • 2017-05-28C++ 实现2048游戏示例
  • 2017-05-28C语言+win32api写窗体应用程序

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 分析C语言一个简单程序
    • 深入理解数组指针与指针数组的区别
    • c语言尾队列tailq使用示例分享
    • POJ2151 Check the difficulty of problems 概率DP
    • C语言 以字符串的形式读写文件详解及示例代码
    • C++基础学生管理系统
    • C++模板类的用法
    • 深入理解Java事务的原理与应用
    • C语言中的malloc使用详解
    • 简单介绍C语言中的umask()函数和truncate()函数

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有