新牛牛【源码】

[复制链接]

该用户从未签到

2380

主题

2433

帖子

9139

积分

管理员

Rank: 9Rank: 9Rank: 9

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

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

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

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

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

//扑克数据
BYTE CGameLogic::m_cbCardListData[52]=
{
    //0x1C,0x1D,0x3B,0x3C,0x3D,0x09,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x0A,0x0B,0x0C,0x0D,    //方块 A - K
    //0x3A,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,    //梅花 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    //黑桃 A - K
    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
};

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

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

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

//获取类型
BYTE CGameLogic::GetCardType(BYTE cbCardData[], BYTE cbCardCount)
{
    ASSERT(cbCardCount==MAX_COUNT);

    ////炸弹牌型
    //BYTE bSameCount = 0;
    //SortCardList(cbCardData,cbCardCount);
    //BYTE bSecondValue = GetCardValue(cbCardData[MAX_COUNT/2]);
    //for(BYTE i=0;i<cbCardCount;i++)
    //{
    //    if(bSecondValue == GetCardValue(cbCardData))
    //    {
    //        bSameCount++;
    //    }
    //}
    //if(bSameCount==4)return OX_FOUR_SAME;

    BYTE bKingCount=0,bTenCount=0;
    for(BYTE i=0;i<cbCardCount;i++)
    {
        if(GetCardValue(cbCardData)>10)
        {
            bKingCount++;
        }
        else if(GetCardValue(cbCardData)==10)
        {
            bTenCount++;
        }
    }
    if(bKingCount==MAX_COUNT) return OX_FIVEKING;
    else if(bKingCount==MAX_COUNT-1 && bTenCount==1) return OX_FOURKING;

    ////葫芦牌型
    //if(bSameCount==3)
    //{
    //    if((bSecondValue!=GetCardValue(cbCardData[3]) && GetCardValue(cbCardData[3])==GetCardValue(cbCardData[4]))
    //    ||(bSecondValue!=GetCardValue(cbCardData[1]) && GetCardValue(cbCardData[1])==GetCardValue(cbCardData[0])))
    //        return OX_THREE_SAME;
    //}

    BYTE bTemp[MAX_COUNT];
    BYTE bSum=0;
    for (BYTE i=0;i<cbCardCount;i++)
    {
        bTemp=GetCardLogicValue(cbCardData);
        bSum+=bTemp;
    }

    for (BYTE i=0;i<cbCardCount-1;i++)
    {
        for (BYTE j=i+1;j<cbCardCount;j++)
        {
            if((bSum-bTemp-bTemp[j])%10==0)
            {
                return ((bTemp+bTemp[j])>10)?(bTemp+bTemp[j]-10)bTemp+bTemp[j]);
            }
        }
    }

    return OX_VALUE0;
}

//获取倍数
BYTE CGameLogic::GetTimes(BYTE cbCardData[], BYTE cbCardCount)
{
    if(cbCardCount!=MAX_COUNT)return 0;

    BYTE bTimes=GetCardType(cbCardData,MAX_COUNT);
    if(bTimes<7)return 1;
    else if(bTimes==7)return 2;
    else if(bTimes==8)return 3;
    else if(bTimes==9)return 4;
    else if(bTimes==10)return 5;
    else if(bTimes==OX_THREE_SAME)return 5;
    else if(bTimes==OX_FOUR_SAME)return 5;
    else if(bTimes==OX_FOURKING)return 5;
    else if(bTimes==OX_FIVEKING)return 5;

    return 0;
}

//获取牛牛
bool CGameLogic::GetOxCard(BYTE cbCardData[], BYTE cbCardCount)
{
    ASSERT(cbCardCount==MAX_COUNT);

    //设置变量
    BYTE bTemp[MAX_COUNT],bTempData[MAX_COUNT];
    CopyMemory(bTempData,cbCardData,sizeof(bTempData));
    BYTE bSum=0;
    for (BYTE i=0;i<cbCardCount;i++)
    {
        bTemp=GetCardLogicValue(cbCardData);
        bSum+=bTemp;
    }

    //查找牛牛
    for (BYTE i=0;i<cbCardCount-1;i++)
    {
        for (BYTE j=i+1;j<cbCardCount;j++)
        {
            if((bSum-bTemp-bTemp[j])%10==0)
            {
                BYTE bCount=0;
                for (BYTE k=0;k<cbCardCount;k++)
                {
                    if(k!=i && k!=j)
                    {
                        cbCardData[bCount++] = bTempData[k];
                    }
                }ASSERT(bCount==3);

                cbCardData[bCount++] = bTempData;
                cbCardData[bCount++] = bTempData[j];

                return true;
            }
        }
    }

    return false;
}

//获取整数
bool CGameLogic::IsIntValue(BYTE cbCardData[], BYTE cbCardCount)
{
    BYTE sum=0;
    for(BYTE i=0;i<cbCardCount;i++)
    {
        sum+=GetCardLogicValue(cbCardData);
    }
    ASSERT(sum>0);
    return (sum%10==0);
}

//排列扑克
void CGameLogic::SortCardList(BYTE cbCardData[], BYTE cbCardCount)
{
    //转换数值
    BYTE cbLogicValue[MAX_COUNT];
    for (BYTE i=0;i<cbCardCount;i++) cbLogicValue=GetCardValue(cbCardData);   

    //排序操作
    bool bSorted=true;
    BYTE cbTempData,bLast=cbCardCount-1;
    do
    {
        bSorted=true;
        for (BYTE i=0;i<bLast;i++)
        {
            if ((cbLogicValue<cbLogicValue[i+1])||
                ((cbLogicValue==cbLogicValue[i+1])&&(cbCardData<cbCardData[i+1])))
            {
                //交换位置
                cbTempData=cbCardData;
                cbCardData=cbCardData[i+1];
                cbCardData[i+1]=cbTempData;
                cbTempData=cbLogicValue;
                cbLogicValue=cbLogicValue[i+1];
                cbLogicValue[i+1]=cbTempData;
                bSorted=false;
            }   
        }
        bLast--;
    } while(bSorted==false);

    return;
}

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

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

    return;
}

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

    //转换数值
    return (bCardValue>10)?(10):bCardValue;
}

//对比扑克
bool CGameLogic::CompareCard(BYTE cbFirstData[], BYTE cbNextData[], BYTE cbCardCount,BOOL FirstOX,BOOL NextOX)
{
    if(FirstOX!=NextOX)return (FirstOX>NextOX);

    //比较牛大小
    if(FirstOX==TRUE)
    {
        //获取点数
        BYTE cbNextType=GetCardType(cbNextData,cbCardCount);
        BYTE cbFirstType=GetCardType(cbFirstData,cbCardCount);

        //点数判断
        if (cbFirstType!=cbNextType) return (cbFirstType>cbNextType);

        switch(cbNextType)
        {
        case OX_FOUR_SAME:        //炸弹牌型   
        case OX_THREE_SAME:        //葫芦牌型
            {
                //排序大小
                BYTE bFirstTemp[MAX_COUNT],bNextTemp[MAX_COUNT];
                CopyMemory(bFirstTemp,cbFirstData,cbCardCount);
                CopyMemory(bNextTemp,cbNextData,cbCardCount);
                SortCardList(bFirstTemp,cbCardCount);
                SortCardList(bNextTemp,cbCardCount);

                return GetCardValue(bFirstTemp[MAX_COUNT/2])>GetCardValue(bNextTemp[MAX_COUNT/2]);

                break;
            }
        }
    }

    //排序大小
    BYTE bFirstTemp[MAX_COUNT],bNextTemp[MAX_COUNT];
    CopyMemory(bFirstTemp,cbFirstData,cbCardCount);
    CopyMemory(bNextTemp,cbNextData,cbCardCount);
    SortCardList(bFirstTemp,cbCardCount);
    SortCardList(bNextTemp,cbCardCount);

    //比较数值
    BYTE cbNextMaxValue=GetCardValue(bNextTemp[0]);
    BYTE cbFirstMaxValue=GetCardValue(bFirstTemp[0]);
    if(cbNextMaxValue!=cbFirstMaxValue)return cbFirstMaxValue>cbNextMaxValue;

    //比较颜色
    return GetCardColor(bFirstTemp[0]) > GetCardColor(bNextTemp[0]);

    return false;
}

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

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

使用道具 举报

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

本版积分规则

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