C++麻将游戏算法深入解析
C++麻将游戏算法深入解析
这两天为了工具箱的完善,整理了这些年引擎开发的一些资料,无意中发现06年写的一个麻将算法,编译运行了一下,还是有点意思的,拿出来整理一下分享给大家。
麻将是一种大家最喜爱的娱乐活动之一,相信所有人都有接触过。我写的这版算法,是可以吃,碰,杠,还有把牌摸完没有人胡时的皇庄和包听。是用控制台方式来表现的,什么?控制台?
对,因为是算法的设计,所以用控制台来表现当然最简单了。
当然,在交互时要用文字输入会有少许不便,不过这种形式的游戏可是图形游戏的鼻祖哦~
好,废话不多说了,来说一下设计思路:
对于麻将的一个玩家,都有一个牌墙的管理,这里封装了一副牌墙的各种算法,这个类我命名为CMJ。
另外还有一个洗牌类,负责洗牌和发牌。这个类为CMJManage。
我们先来看一下CMJ类。
CMJ.h:
[cpp]
#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();
补充:软件开发 , C++ ,