📄 upgradelogic.cpp
字号:
#include "StdAfx.h"
#include "UpGradeLogic.h"
//构造函数
CUpGradeGameLogic::CUpGradeGameLogic(void)
{
m_iDaoCard = 0;
m_iStation[4]=500;
for (int i=0;i<4;i++) m_iStation[i]=100*i;
}
//设置刀牌
void CUpGradeGameLogic::SetDaoCard(BYTE iDaoCard)
{
m_iDaoCard = iDaoCard;
return;
}
//获取扑克花色
BYTE CUpGradeGameLogic::GetCardHuaKind(BYTE iCard)
{
int iHuaKind=(iCard&UG_HUA_MASK);
return iHuaKind;
}
//获取扑克大小
int CUpGradeGameLogic::GetCardBulk(BYTE iCard)
{
if ((iCard==0x4E)||(iCard==0x4F))
{
return (iCard-58); //大小鬼
}
int iCardNum=GetCardNum(iCard);
if (iCardNum == 2) iCardNum = 16;
if (iCardNum == GetCardNum(m_iDaoCard)) iCardNum = 23;
return iCardNum;
}
//排列扑克
BOOL CUpGradeGameLogic::SortCard(BYTE iCardList[], BYTE bUp[], int iCardCount)
{
BOOL bSorted=TRUE,bTempUp;
int iTemp,iLast=iCardCount-1,iStationVol[45];
//获取位置数值
for (int i=0;i<iCardCount;i++)
{
iStationVol[i]=GetCardBulk(iCardList[i]);
///if (iStationVol[i]>=15) iStationVol[i]+=m_iStation[4];
///else iStationVol[i]+=m_iStation[GetCardHuaKind(iCardList[i],FALSE)>>4];
}
//排序操作
do
{
bSorted=TRUE;
for (int i=0;i<iLast;i++)
{
if (iStationVol[i]<iStationVol[i+1])
{
//交换位置
iTemp=iCardList[i];
iCardList[i]=iCardList[i+1];
iCardList[i+1]=iTemp;
iTemp=iStationVol[i];
iStationVol[i]=iStationVol[i+1];
iStationVol[i+1]=iTemp;
if (bUp!=NULL)
{
bTempUp=bUp[i];
bUp[i]=bUp[i+1];
bUp[i+1]=bTempUp;
}
bSorted=FALSE;
}
if (iStationVol[i] == iStationVol[i+1])//牌点同按花色
{
if (GetCardHuaKind(iCardList[i]) < GetCardHuaKind(iCardList[i+1]))
{
//交换
iTemp=iCardList[i];
iCardList[i]=iCardList[i+1];
iCardList[i+1]=iTemp;
}
}
}
iLast--;
} while(!bSorted);
return TRUE;
}
//重新排序
BOOL CUpGradeGameLogic::ReSortCard(BYTE iCardList[], int iCardCount)
{
CPtrList ptrList;
for (int i = 0;i < iCardCount;i++)
{
bool bFind = false;
int pd = GetCardNum(iCardList[i]);
if (pd == 16) pd = 17; ///大王
if (pd == 15) pd = 16; ///小王
if (pd == 2) pd = 15;
for (POSITION pos = ptrList.GetHeadPosition();pos != NULL;)
{
PSTypeNode *pn = (PSTypeNode *) ptrList.GetNext(pos);
if (!pn) continue;
/////ASSERT(pn);
if (pn->mps == pd)
{
pn->mcount++;
bFind = true;
break;
}
}
if (!bFind)
{
PSTypeNode *pn = new PSTypeNode();
pn->mps = pd;
pn->mcount = 1;
ptrList.AddTail(pn);
}
}
///sort
CPtrList tmpList;
for (POSITION pos = ptrList.GetHeadPosition();pos != NULL;)
{
PSTypeNode *pn = (PSTypeNode *) ptrList.GetNext(pos);
if (!pn) continue;
////ASSERT(pn);
PSTypeNode *pii = new PSTypeNode();
pii->mcount = pn->mcount;
pii->mps = pn->mps;
if (tmpList.IsEmpty())
{
tmpList.AddTail(pii);
continue;
}
bool bFind = false;
for (POSITION pos1 = tmpList.GetHeadPosition();pos1 != NULL;)
{
POSITION tp = pos1;
PSTypeNode *pi = (PSTypeNode *) tmpList.GetNext(pos1);
if (!pi) continue;
if (pii->mcount > pi->mcount || (pii->mcount == pi->mcount && pii->mps > pi->mps))
{
tmpList.InsertBefore(tp, pii);
bFind = true;
break;
}
}
if (!bFind)
{
tmpList.AddTail(pii);
}
}
BYTE iTempCard[45];
int iCnt = 0;
for (POSITION pos = tmpList.GetHeadPosition();pos != NULL;)
{
PSTypeNode *pn = (PSTypeNode *) tmpList.GetNext(pos);
if (!pn) continue;
ASSERT(pn);
for (int i = 0;i < iCardCount;i++)
{
int pd = GetCardNum(iCardList[i]);
if (pd == 16) pd = 17; ///大王
if (pd == 15) pd = 16; ///小王
if (pd == 2) pd = 15;
if (pd == pn->mps)
{
iTempCard[iCnt++] = iCardList[i];
}
}
}
while (!ptrList.IsEmpty())
{
PSTypeNode *ps = (PSTypeNode *) ptrList.RemoveHead();
delete ps;
}
ptrList.RemoveAll();
while (!tmpList.IsEmpty())
{
PSTypeNode *ps = (PSTypeNode *) tmpList.RemoveHead();
delete ps;
}
tmpList.RemoveAll();
for (int i = 0;i < iCardCount;i++)
{
iCardList[i] = iTempCard[i];
}
return TRUE;
}
//获取扑克
BYTE CUpGradeGameLogic::GetCardFromHua(int iHuaKind, int iNum)
{
if (iHuaKind!=UG_ERROR_HUA) return (iHuaKind+iNum-1);
return 0;
}
//是否对牌
BOOL CUpGradeGameLogic::IsDouble(BYTE iCardList[], int iCardCount)
{
if (iCardCount!=2) return FALSE;
int count = 0,first = -1;
for (int i = 0;i < iCardCount;i++)
{
if (iCardList[i] == 0x4E || iCardList[i] == 0x4F)//大小王
{
count++;
continue;
}
if (first < 0)
{
first = GetCardNum(iCardList[i]);
continue;
}
if (first != GetCardNum(iCardList[i])) return FALSE;
}
if (count == 2) return 3;
if (count > 0 && first == GetCardNum(m_iDaoCard)) return FALSE;
return first;
}
//是否三条
BOOL CUpGradeGameLogic::IsThree(BYTE iCardList[], int iCardCount)
{
if (iCardCount!=3) return FALSE;
int count = 0,first = -1;
for (int i = 0;i < iCardCount;i++)
{
if (iCardList[i] == 0x4E || iCardList[i] == 0x4F)
{
count++;
continue;
}
if (first < 0)
{
first = GetCardNum(iCardList[i]);
continue;
}
if (first != GetCardNum(iCardList[i])) return FALSE;
}
if (count == 3) return 3;
if (count > 0 && first == GetCardNum(m_iDaoCard)) return FALSE;
return first;
}
//是否氢弹
BOOL CUpGradeGameLogic::IsHydrogenBomb(BYTE iCardList[], int iCardCount)
{
if (iCardCount != 8) return FALSE;
int hetao = 0,
ht = 0,
mh = 0,
fp = 0;
int first = -1;
for (int i = 0;i < iCardCount;i++)
{
if (GetCardHuaKind(iCardList[0]) == UG_HEI_TAO) hetao++;
if (GetCardHuaKind(iCardList[i]) == UG_HONG_TAO) ht++;
if (GetCardHuaKind(iCardList[i]) == UG_MEI_HUA) mh++;
if (GetCardHuaKind(iCardList[i]) == UG_FANG_KUAI) fp++;
if (first < 0)
{
first = GetCardNum(iCardList[i]);
continue;
}
if (first != GetCardNum(iCardList[i])) return FALSE;
}
return (hetao == 2 && ht == 2 && mh == 2 && fp == 2);
}
//是否刀氢弹
BOOL CUpGradeGameLogic::IsDaoHydrogenBomb(BYTE iCardList[], int iCardCount)
{
return ((GetCardNum(m_iDaoCard) == GetCardNum(iCardList[0])) && IsHydrogenBomb(iCardList,iCardCount));
}
//是否原子
BOOL CUpGradeGameLogic::IsAtom(BYTE iCardList[], int iCardCount)
{
if (iCardCount != 3) return FALSE;
int firsths = -1,firstpd = -1;
for (int i = 0;i < iCardCount;i++)
{
if (firstpd < 0)
{
firsths = GetCardHuaKind(iCardList[i]);
firstpd = GetCardNum(iCardList[i]);
continue;
}
if (firsths != GetCardHuaKind(iCardList[i]) || firstpd != GetCardNum(iCardList[i])) return FALSE;
}
return TRUE;
}
//是否刀原子
BOOL CUpGradeGameLogic::IsDaoAtom(BYTE iCardList[], int iCardCount)
{
return (GetCardNum(m_iDaoCard) == GetCardNum(iCardList[0]) && IsAtom(iCardList,iCardCount));
}
//是否大王原子
BOOL CUpGradeGameLogic::IsDWAtom(BYTE iCardList[], int iCardCount)
{
return (iCardList[0] == 0x4F && IsAtom(iCardList,iCardCount));
}
//是否小王原子
BOOL CUpGradeGameLogic::IsXWAtom(BYTE iCardList[], int iCardCount)
{
return (iCardList[0] == 0x4E && IsAtom(iCardList,iCardCount));
}
//是否炸弹
BOOL CUpGradeGameLogic::IsBomb(BYTE iCardList[], int iCardCount)
{
if (iCardCount < 4) return FALSE;
int first = -1,count = 0;
for (int i = 0;i < iCardCount;i++)
{
if (iCardList[i] == 0x4E || iCardList[i] == 0x4F)//王可代牌
{
count++;
continue;
}
if (first < 0)
{
first = GetCardNum(iCardList[i]);
continue;
}
if (first != GetCardNum(iCardList[i])) return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -