二人牛牛(库存+前控+多人控制)0829【源码】

[复制链接]

该用户从未签到

2380

主题

2433

帖子

9139

积分

管理员

Rank: 9Rank: 9Rank: 9

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

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

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

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好友和群
收藏收藏
回复

使用道具 举报

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

本版积分规则

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