斗地主【源码】

[复制链接]

该用户从未签到

2380

主题

2433

帖子

9139

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
9139
QQ
跳转到指定楼层
楼主
发表于 2017-6-13 11:30:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

想要查看内容赶紧注册登陆吧!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
#include "StdAfx.h"
#include "GameLogic.h"

//////////////////////////////////////////////////////////////////////////////////
//静态变量

//索引变量
const BYTE cbIndexCount=5;

//扑克数据
const BYTE    CGameLogic::m_cbCardData[FULL_COUNT]=
{
    0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,    //方块 A - K
    0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,    //梅花 A - K
    0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,    //红桃 A - K
    0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,    //黑桃 A - K
    0x4E,0x4F,
};

//////////////////////////////////////////////////////////////////////////////////

//构造函数
CGameLogic::CGameLogic()
{
}

//析构函数
CGameLogic::~CGameLogic()
{
}

//获取类型
BYTE CGameLogic::GetCardType(const BYTE cbCardData[], BYTE cbCardCount)
{
    //简单牌型
    switch (cbCardCount)
    {
    case 0:    //空牌
        {
            return CT_ERROR;
        }
    case 1: //单牌
        {
            return CT_SINGLE;
        }
    case 2:    //对牌火箭
        {
            //牌型判断
            if ((cbCardData[0]==0x4F)&&(cbCardData[1]==0x4E)) return CT_MISSILE_CARD;
            if (GetCardLogicValue(cbCardData[0])==GetCardLogicValue(cbCardData[1])) return CT_DOUBLE;

            return CT_ERROR;
        }
    }

    //分析扑克
    tagAnalyseResult AnalyseResult;
    AnalysebCardData(cbCardData,cbCardCount,AnalyseResult);

    //四牌判断
    if (AnalyseResult.cbBlockCount[3]>0)
    {
        //牌型判断
        if ((AnalyseResult.cbBlockCount[3]==1)&&(cbCardCount==4)) return CT_BOMB_CARD;
        if ((AnalyseResult.cbBlockCount[3]==1)&&(cbCardCount==6)) return CT_FOUR_TAKE_ONE;
        if ((AnalyseResult.cbBlockCount[3]==1)&&(cbCardCount==8)&&(AnalyseResult.cbBlockCount[1]==2)) return CT_FOUR_TAKE_TWO;


        return CT_ERROR;
    }

    //三牌判断
    if (AnalyseResult.cbBlockCount[2]>0)
    {
        //连牌判断
        if (AnalyseResult.cbBlockCount[2]>1)
        {
            //变量定义
            BYTE cbCardData=AnalyseResult.cbCardData[2][0];
            BYTE cbFirstLogicValue=GetCardLogicValue(cbCardData);

            //错误过虑
            if (cbFirstLogicValue>=15) return CT_ERROR;

            //连牌判断
            for (BYTE i=1;i<AnalyseResult.cbBlockCount[2];i++)
            {
                BYTE cbCardData=AnalyseResult.cbCardData[2][i*3];
                if (cbFirstLogicValue!=(GetCardLogicValue(cbCardData)+i)) return CT_ERROR;
            }
        }
        else if( cbCardCount == 3 ) return CT_THREE;

        //牌形判断
        if (AnalyseResult.cbBlockCount[2]*3==cbCardCount) return CT_THREE_LINE;
        if (AnalyseResult.cbBlockCount[2]*4==cbCardCount) return CT_THREE_TAKE_ONE;
        if ((AnalyseResult.cbBlockCount[2]*5==cbCardCount)&&(AnalyseResult.cbBlockCount[1]==AnalyseResult.cbBlockCount[2])) return CT_THREE_TAKE_TWO;

        return CT_ERROR;
    }

    //两张类型
    if (AnalyseResult.cbBlockCount[1]>=3)
    {
        //变量定义
        BYTE cbCardData=AnalyseResult.cbCardData[1][0];
        BYTE cbFirstLogicValue=GetCardLogicValue(cbCardData);

        //错误过虑
        if (cbFirstLogicValue>=15) return CT_ERROR;

        //连牌判断
        for (BYTE i=1;i<AnalyseResult.cbBlockCount[1];i++)
        {
            BYTE cbCardData=AnalyseResult.cbCardData[1][i*2];
            if (cbFirstLogicValue!=(GetCardLogicValue(cbCardData)+i)) return CT_ERROR;
        }

        //二连判断
        if ((AnalyseResult.cbBlockCount[1]*2)==cbCardCount) return CT_DOUBLE_LINE;

        return CT_ERROR;
    }

    //单张判断
    if ((AnalyseResult.cbBlockCount[0]>=5)&&(AnalyseResult.cbBlockCount[0]==cbCardCount))
    {
        //变量定义
        BYTE cbCardData=AnalyseResult.cbCardData[0][0];
        BYTE cbFirstLogicValue=GetCardLogicValue(cbCardData);

        //错误过虑
        if (cbFirstLogicValue>=15) return CT_ERROR;

        //连牌判断
        for (BYTE i=1;i<AnalyseResult.cbBlockCount[0];i++)
        {
            BYTE cbCardData=AnalyseResult.cbCardData[0];
            if (cbFirstLogicValue!=(GetCardLogicValue(cbCardData)+i)) return CT_ERROR;
        }

        return CT_SINGLE_LINE;
    }

    return CT_ERROR;
}

//排列扑克
VOID CGameLogic::SortCardList(BYTE cbCardData[], BYTE cbCardCount, BYTE cbSortType)
{
    //数目过虑
    if (cbCardCount==0) return;
    if (cbSortType==ST_CUSTOM) return;

    //转换数值
    BYTE cbSortValue[MAX_COUNT];
    for (BYTE i=0;i<cbCardCount;i++) cbSortValue=GetCardLogicValue(cbCardData);   

    //排序操作
    bool bSorted=true;
    BYTE cbSwitchData=0,cbLast=cbCardCount-1;
    do
    {
        bSorted=true;
        for (BYTE i=0;i<cbLast;i++)
        {
            if ((cbSortValue<cbSortValue[i+1])||
                ((cbSortValue==cbSortValue[i+1])&&(cbCardData<cbCardData[i+1])))
            {
                //设置标志
                bSorted=false;

                //扑克数据
                cbSwitchData=cbCardData;
                cbCardData=cbCardData[i+1];
                cbCardData[i+1]=cbSwitchData;

                //排序权位
                cbSwitchData=cbSortValue;
                cbSortValue=cbSortValue[i+1];
                cbSortValue[i+1]=cbSwitchData;
            }   
        }
        cbLast--;
    } while(bSorted==false);

    //数目排序
    if (cbSortType==ST_COUNT)
    {
        //变量定义
        BYTE cbCardIndex=0;

        //分析扑克
        tagAnalyseResult AnalyseResult;
        AnalysebCardData(&cbCardData[cbCardIndex],cbCardCount-cbCardIndex,AnalyseResult);

        //提取扑克
        for (BYTE i=0;i<CountArray(AnalyseResult.cbBlockCount);i++)
        {
            //拷贝扑克
            BYTE cbIndex=CountArray(AnalyseResult.cbBlockCount)-i-1;
            CopyMemory(&cbCardData[cbCardIndex],AnalyseResult.cbCardData[cbIndex],AnalyseResult.cbBlockCount[cbIndex]*(cbIndex+1)*sizeof(BYTE));

            //设置索引
            cbCardIndex+=AnalyseResult.cbBlockCount[cbIndex]*(cbIndex+1)*sizeof(BYTE);
        }
    }

    return;
}

//混乱扑克
VOID CGameLogic::RandCardList(BYTE cbCardBuffer[], BYTE cbBufferCount)
{
    //混乱准备
    BYTE cbCardData[CountArray(m_cbCardData)];
    CopyMemory(cbCardData,m_cbCardData,sizeof(m_cbCardData));

    //混乱扑克
    BYTE cbRandCount=0,cbPosition=0;
    do
    {
        cbPosition=rand()%(cbBufferCount-cbRandCount);
        cbCardBuffer[cbRandCount++]=cbCardData[cbPosition];
        cbCardData[cbPosition]=cbCardData[cbBufferCount-cbRandCount];
    } while (cbRandCount<cbBufferCount);

    return;
}

//删除扑克
bool CGameLogic::RemoveCardList(const BYTE cbRemoveCard[], BYTE cbRemoveCount, BYTE cbCardData[], BYTE cbCardCount)
{
    //检验数据
    ASSERT(cbRemoveCount<=cbCardCount);

    //定义变量
    BYTE cbDeleteCount=0,cbTempCardData[MAX_COUNT];
    if (cbCardCount>CountArray(cbTempCardData)) return false;
    CopyMemory(cbTempCardData,cbCardData,cbCardCount*sizeof(cbCardData[0]));

    //置零扑克
    for (BYTE i=0;i<cbRemoveCount;i++)
    {
        for (BYTE j=0;j<cbCardCount;j++)
        {
            if (cbRemoveCard==cbTempCardData[j])
            {
                cbDeleteCount++;
                cbTempCardData[j]=0;
                break;
            }
        }
    }
    if (cbDeleteCount!=cbRemoveCount) return false;

    //清理扑克
    BYTE cbCardPos=0;
    for (BYTE i=0;i<cbCardCount;i++)
    {
        if (cbTempCardData!=0) cbCardData[cbCardPos++]=cbTempCardData;
    }

    return true;
}

//逻辑数值
BYTE CGameLogic::GetCardLogicValue(BYTE cbCardData)
{
    //扑克属性
    BYTE cbCardColor=GetCardColor(cbCardData);
    BYTE cbCardValue=GetCardValue(cbCardData);

    //转换数值
    if (cbCardColor==0x40) return cbCardValue+2;
    return (cbCardValue<=2)?(cbCardValue+13):cbCardValue;
}

//对比扑克
bool CGameLogic::CompareCard(const BYTE cbFirstCard[], const BYTE cbNextCard[], BYTE cbFirstCount, BYTE cbNextCount)
{
    //获取类型
    BYTE cbNextType=GetCardType(cbNextCard,cbNextCount);
    BYTE cbFirstType=GetCardType(cbFirstCard,cbFirstCount);

    //类型判断
    if (cbNextType==CT_ERROR) return false;
    if (cbNextType==CT_MISSILE_CARD) return true;

    //炸弹判断
    if ((cbFirstType!=CT_BOMB_CARD)&&(cbNextType==CT_BOMB_CARD)) return true;
    if ((cbFirstType==CT_BOMB_CARD)&&(cbNextType!=CT_BOMB_CARD)) return false;

    //规则判断
    if ((cbFirstType!=cbNextType)||(cbFirstCount!=cbNextCount)) return false;

    //开始对比
    switch (cbNextType)
    {
    case CT_SINGLE:
    case CT_DOUBLE:
    case CT_THREE:
    case CT_SINGLE_LINE:
    case CT_DOUBLE_LINE:
    case CT_THREE_LINE:
    case CT_BOMB_CARD:
        {
            //获取数值
            BYTE cbNextLogicValue=GetCardLogicValue(cbNextCard[0]);
            BYTE cbFirstLogicValue=GetCardLogicValue(cbFirstCard[0]);

            //对比扑克
            return cbNextLogicValue>cbFirstLogicValue;
        }
    case CT_THREE_TAKE_ONE:
    case CT_THREE_TAKE_TWO:
        {
            //分析扑克
            tagAnalyseResult NextResult;
            tagAnalyseResult FirstResult;
            AnalysebCardData(cbNextCard,cbNextCount,NextResult);
            AnalysebCardData(cbFirstCard,cbFirstCount,FirstResult);

            //获取数值
            BYTE cbNextLogicValue=GetCardLogicValue(NextResult.cbCardData[2][0]);
            BYTE cbFirstLogicValue=GetCardLogicValue(FirstResult.cbCardData[2][0]);

            //对比扑克
            return cbNextLogicValue>cbFirstLogicValue;
        }
    case CT_FOUR_TAKE_ONE:
    case CT_FOUR_TAKE_TWO:
        {
            //分析扑克
            tagAnalyseResult NextResult;
            tagAnalyseResult FirstResult;
            AnalysebCardData(cbNextCard,cbNextCount,NextResult);
            AnalysebCardData(cbFirstCard,cbFirstCount,FirstResult);

            //获取数值
            BYTE cbNextLogicValue=GetCardLogicValue(NextResult.cbCardData[3][0]);
            BYTE cbFirstLogicValue=GetCardLogicValue(FirstResult.cbCardData[3][0]);

            //对比扑克
            return cbNextLogicValue>cbFirstLogicValue;
        }
    }
   
    return false;
}

//构造扑克
BYTE CGameLogic::MakeCardData(BYTE cbValueIndex, BYTE cbColorIndex)
{
    return (cbColorIndex<<4)|(cbValueIndex+1);
}

//分析扑克
VOID CGameLogic::AnalysebCardData(const BYTE cbCardData[], BYTE cbCardCount, tagAnalyseResult & AnalyseResult)
{
    //设置结果
    ZeroMemory(&AnalyseResult,sizeof(AnalyseResult));

    //扑克分析
    for (BYTE i=0;i<cbCardCount;i++)
    {
        //变量定义
        BYTE cbSameCount=1,cbCardValueTemp=0;
        BYTE cbLogicValue=GetCardLogicValue(cbCardData);

        //搜索同牌
        for (BYTE j=i+1;j<cbCardCount;j++)
        {
            //获取扑克
            if (GetCardLogicValue(cbCardData[j])!=cbLogicValue) break;

            //设置变量
            cbSameCount++;
        }

        //设置结果
        BYTE cbIndex=AnalyseResult.cbBlockCount[cbSameCount-1]++;
        for (BYTE j=0;j<cbSameCount;j++) AnalyseResult.cbCardData[cbSameCount-1][cbIndex*cbSameCount+j]=cbCardData[i+j];

        //设置索引
        i+=cbSameCount-1;
    }

    return;
}

//分析分布
VOID CGameLogic::AnalysebDistributing(const BYTE cbCardData[], BYTE cbCardCount, tagDistributing & Distributing)
{
    //设置变量
    ZeroMemory(&Distributing,sizeof(Distributing));

    //设置变量
    for (BYTE i=0;i<cbCardCount;i++)
    {
        if (cbCardData==0) continue;

        //获取属性
        BYTE cbCardColor=GetCardColor(cbCardData);
        BYTE cbCardValue=GetCardValue(cbCardData);

        //分布信息
        Distributing.cbCardCount++;
        Distributing.cbDistributing[cbCardValue-1][cbIndexCount]++;
        Distributing.cbDistributing[cbCardValue-1][cbCardColor>>4]++;
    }

    return;
}

//////////////////////////////////////////////////////////////////////////////////

分享到:  QQ好友和群QQ好友和群
收藏收藏
回复

使用道具 举报

快速回复高级模式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表