您的位置:首页 > 编程语言

两人斗地主客户端源码(一)

2014-05-08 10:46 621 查看
新开的博客,本博客主要给大家分享棋牌游戏中的两人斗地主源代码(客户端)。由于代码过长,没办法一次性提供完全,请见谅。

#include "StdAfx.h"
#include "Cardparserddz.h"
#include "UpGradeLogic.h"

bool CCardParserDDZ::Is1(int &firstpd)
{///单张
if(m_iAllPaiCount != 1)return false;
firstpd =m_ifirstpd;
return true;

}
bool CCardParserDDZ::Is2(int &firstpd)
{////单对
if(m_iAllPaiCount != 2)return false;
firstpd =m_ifirstpd;
if(mList.GetCount () > 1)return false;
return true;
}

bool CCardParserDDZ::Is3 (int &firstpd)
{///3顺不带 最少2顺
if(m_iAllPaiCount != 3)return false;
firstpd =m_ifirstpd;
if(mList.GetCount () > 1)return false;
return true;
}

bool CCardParserDDZ::IsBomb(int &firstpd)
{////炸蛋
if(m_iAllPaiCount < 4)return false;
firstpd =m_ifirstpd;
if(mList.GetCount () > 1)return false;
return true;
}

bool CCardParserDDZ::Is1s(int &firstpd)
{///单顺 最少5顺
if(m_iAllPaiCount < 5)return false;
return IsShunAndDai(
mList,
m_iLaiZiCount,////赖子数
true,

-1,////上一手3牌牌点,如=-1则为入口位
firstpd,
1,

0,
0
);
}
bool CCardParserDDZ::Is2s(int &firstpd)
{///2顺 最少3顺
if(m_iAllPaiCount < 6)return false;
return IsShunAndDai(
mList,
m_iLaiZiCount,////赖子数
true,

-1,////上一手3牌牌点,如=-1则为入口位
firstpd,
2,

0,
0
);
}

bool CCardParserDDZ::Is3s(int &firstpd)
{///3顺不带 最少2顺
if(m_iAllPaiCount < 3)return false;
return IsShunAndDai(
mList,
m_iLaiZiCount,////赖子数
true,
-1,////上一手3牌牌点,如=-1则为入口位
firstpd,
3,
0,
0
);
}
bool CCardParserDDZ::Is3s1s(int &firstpd)
{///3顺带单 最少2顺
if(m_iAllPaiCount < 4)return false;
return IsShunAndDai(
mList,
m_iLaiZiCount,////赖子数
true,

-1,////上一手3牌牌点,如=-1则为入口位
firstpd,
3,
1,
1
);
}

bool CCardParserDDZ::Is3s2s(int &firstpd)
{///3顺带对 最少2顺
if(m_iAllPaiCount < 4)return false;
return IsShunAndDai(
mList,
m_iLaiZiCount,////赖子数
true,

-1,////上一手3牌牌点,如=-1则为入口位
firstpd,
3,
2,
1
);
}
bool CCardParserDDZ::Is4s1s1s(int &firstpd)
{
if(m_iAllPaiCount < 6)return false;
return IsShunAndDai(
mList,
m_iLaiZiCount,////赖子数
true,

-1,////上一手3牌牌点,如=-1则为入口位
firstpd,
4,
1,
2
);
}
bool CCardParserDDZ::Is4s2s(int &firstpd)
{
if(m_iAllPaiCount < 6)return false;
return IsShunAndDai(
mList,
m_iLaiZiCount,////赖子数
true,

-1,////上一手3牌牌点,如=-1则为入口位
firstpd,
4,
2,
1
);
}

bool CCardParserDDZ::Is4s2d(int &firstpd)//2对
{
if(m_iAllPaiCount < 8)return false;
return IsShunAndDai(
mList,
m_iLaiZiCount,////赖子数
true,

-1,////上一手3牌牌点,如=-1则为入口位
firstpd,
4,
2,
2
);
}

CCardParserDDZ::CCardParserDDZ(BYTE cardArr[],int allcount,int lzpaidian)
{
m_iLaiZiCount = 0;
m_iAllPaiCount=allcount;
m_iLaiZiPaiDian = lzpaidian;
m_ifirstpd=-1;
for(int i=0;i<m_iAllPaiCount;i++)
{
int pd=CUpGradeGameLogic::GetCardNum (cardArr[i]);
if(m_ifirstpd < 0)m_ifirstpd=pd;
else if(lzpaidian == m_ifirstpd) m_ifirstpd = pd;

if(lzpaidian == pd)
{
m_iLaiZiCount ++;
continue;
}
bool f=false;

for (POSITION pos = mList.GetHeadPosition();pos != NULL;)
{
PSTypeNode * ps = (PSTypeNode *) mList.GetNext(pos);
if (!ps) continue;
if (pd == ps->mps)
{
ps->mcount++;
f=true;
break;
}
}
if(f)continue;
PSTypeNode * ps = new PSTypeNode ;
ps->mps = pd;
ps->mcount = 1;
mList.AddTail (ps);
}
}

PSTypeNode *CCardParserDDZ::pFind(
CPtrListN &listn,
int lzcnt,////赖子数
int n,/////要找的牌的张数
bool bFindShunPai,////要找的牌是顺牌(TRUE,)带牌(FALSE)
int cur3paidian////要找的牌是顺牌牌点,如=-1则为入口位
)
{
if(n < 1)return NULL;
PSTypeNode * maxps = NULL;
int maxdd = 0;

for(POSITION pos=listn.mList.GetHeadPosition ();pos != NULL;)
{
PSTypeNode * ps = (PSTypeNode *) listn.mList.GetNext(pos);
if (!ps) continue;
if(ps->mcount <= 0)continue;

if(ps->mcount > n)continue;/////个数>N,不合格牌
if(ps->mcount + lzcnt < n)continue;////数量不够
if(!bFindShunPai)
{///优先找牌点与cur3paidian差得最多的
///return ps;
int dd= ps->mps - cur3paidian;
if(dd < 0)dd = - dd;
if(cur3paidian < 0)dd= 0;
if(dd > maxdd)
{
maxdd = dd;
maxps=ps;
}
continue;
}

{//要找的牌是顺牌
if(ps->mps < 0)continue;////已检测过不能当三牌标识

if(cur3paidian < 0)return ps;///找到了
int dd=cur3paidian - ps->mps;
if(dd != 0)continue;
///找到了
return ps;
}

}
if(!bFindShunPai)return maxps;

return NULL;
}

bool CCardParserDDZ::IsShunAndDai(
CPtrList& lst,/////全部要分析牌的LIST
int lzcnt,////赖子数
bool bstart,/////是否第一次调用
/////顺牌信息:
int last3paidian,////上一手顺牌牌点,如=-1则为入口位
int &firstpd,////最大成顺牌点,返回直
int nShunPai,////顺牌张数,如四顺则为4

/////带牌信息:
int nDaiPaiYuan,////带牌张数,如四带单则为1,四带对则为2
int nDaiPai////带牌单元个数,如四带一单则为1,四带二单则为2
)
{/////3顺带单 递归

CPtrListN t(lst);
if(t.GetMaxPaiCount() > nShunPai)return false;
////if(t.mList.IsEmpty () && lzcnt == 0)return true;/////结束条件1
bool bb=t.bSucceed();
if(bb)
{
if(lzcnt == 0)return true;
///return lzcnt == 0;
}
if(t.bFailed())return false;

int lzcnt0=lzcnt;
if(bstart)last3paidian=-1;
bool bNeedFind3=true;

PSTypeNode *p=NULL;

int p3cnt=-1;

int cur3paidian=(last3paidian - 1);
if(cur3paidian < 0)
{
bNeedFind3=false;
if(bstart)bNeedFind3=true;
}
else if(cur3paidian <= 2)
{
lzcnt -= nShunPai;
if(lzcnt < 0)return false;
bNeedFind3=false;
}
else bNeedFind3=true;

if(bNeedFind3)
{
p=pFind
(
t,
lzcnt,//int lzcnt,////赖子数
nShunPai,//int n,/////要找的牌的张数
true,//bool bFindShunPai,////要找的牌是顺牌(TRUE,)带牌(FALSE)
cur3paidian//int cur3paidian////要找的牌是顺牌牌点,如=-1则为入口位
);
}
if(!p)
{
lzcnt -= nShunPai;
if(lzcnt < 0)return false;
}
else
{
if(bstart)
{
cur3paidian=p->mps;
firstpd=cur3paidian;
}
p3cnt=p->mcount;
p->mps = -1;
lzcnt -= nShunPai - p->mcount;
if(lzcnt < 0)return false;
p->mcount = 0;
}

const int DAIPAISHU_COUNT=10;/////最大带牌单元个数(不是带牌张数)

int p1cnt[DAIPAISHU_COUNT] ;

int daic=0;/////当前带牌单元个数(不是带牌张数)

PSTypeNode *pnDaiPai[DAIPAISHU_COUNT] ;
for(int i=0;i<nDaiPai;i++)
{
p1cnt[i]= -1;
pnDaiPai[i]=NULL;
}

for(int i=0;i<nDaiPai;i++)
{
PSTypeNode *p1=pFind
(
t,
lzcnt,//int lzcnt,////赖子数
nDaiPaiYuan,//int n,/////要找的牌的张数
false,//bool bFindShunPai,////要找的牌是顺牌(TRUE,)带牌(FALSE)
cur3paidian//-1//cur3paidian//int cur3paidian////要找的牌是顺牌牌点,如=-1则为入口位
);

if(!p1)
{
lzcnt -= nDaiPaiYuan;
if(lzcnt < 0)return false;
}
else
{
p1cnt[daic]=p1->mcount;
lzcnt -= nDaiPaiYuan - p1->mcount;
p1->mcount = 0;
pnDaiPai[daic]=p1;

daic ++;
if(lzcnt < 0)return false;
}
}

int fpd=-1;

bb= IsShunAndDai(
t.mList,
lzcnt,
false,

cur3paidian ,
fpd,
nShunPai,

nDaiPaiYuan,////带牌张数,如四带单则为1,四带对则为2
nDaiPai
);
if(bb)return true;

///这一次找不到,恢复数据: 重新开始找
if(daic > 0)
{
for(int i=0;i<daic;i++)
{
if(pnDaiPai[i])pnDaiPai[i]->mcount=p1cnt[i];
}
///p1->mcount = p1cnt;
}
if(p)
{
p->mcount = p3cnt;
}

lzcnt=lzcnt0;

return IsShunAndDai(
t.mList,
lzcnt,
true,

last3paidian ,
firstpd,
nShunPai,

nDaiPaiYuan,////带牌张数,如四带单则为1,四带对则为2
nDaiPai
);

/* CPtrListN t(lst);
if(t.GetMaxPaiCount() > nShunPai)return false;
if(t.mList.IsEmpty () )return false;

int ll=t.mList.GetCount () ;//+ lzcnt;////最大循环次数

int cur3paidian=last3paidian;//(last3paidian - 1);
bstart = true;
int lzcnt0=lzcnt;
PSTypeNode *p=NULL;//顺单元
int p3cnt = -1;

const int DAIPAISHU_COUNT=10;/////最大带牌单元个数(不是带牌张数)
int p1cnt[DAIPAISHU_COUNT] ;
int daic=0;/////当前带牌单元个数(不是带牌张数)
PSTypeNode *pnDaiPai[DAIPAISHU_COUNT] ;

while(1)////for(int ii=0;ii<ll;ii++)
{
bool bb=t.bSucceed();
if(bb)
{
if(lzcnt == 0)return true;
///return lzcnt == 0;
}
if(t.bFailed())return false;

////分析出一个结构,即一个顺单元+一个带牌单元(顺单元如由赖子组成则不算一次循环)
for(int i=0;i<nDaiPai;i++)
{
p1cnt[i]= -1;
pnDaiPai[i]=NULL;
}
daic=0;

while(1)
{
cur3paidian=cur3paidian - 1;
bool bNeedFind3=true;
if(cur3paidian < 0)
{
bNeedFind3=false;
if(bstart)bNeedFind3=true;
}
else if(cur3paidian <= 2)
{
lzcnt -= nShunPai;
if(lzcnt < 0)goto falied2;/////此次查找失败
bNeedFind3=false;
}
else bNeedFind3=true;

///找顺单元
if(bNeedFind3)
p=pFind(
t,
lzcnt,//int lzcnt,////赖子数
nShunPai,//int n,/////要找的牌的张数
true,//bool bFindShunPai,////要找的牌是顺牌(TRUE,)带牌(FALSE)
cur3paidian//int cur3paidian////要找的牌是顺牌牌点,如=-1则为入口位
);
if(!p)
{
lzcnt -= nShunPai;
if(lzcnt < 0)goto falied2;
}
else
{
if(bstart)
{
bstart = false;
cur3paidian=p->mps;
firstpd=cur3paidian;
}
p3cnt=p->mcount;
p->mps = -1;
lzcnt -= nShunPai - p->mcount;
p->mcount = 0;
if(lzcnt < 0)goto falied1;
8eaa
}

////找带牌单元
for(int i=0;i<nDaiPai;i++)
{
PSTypeNode *p1=pFind
(
t,
lzcnt,//int lzcnt,////赖子数
nDaiPaiYuan,//int n,/////要找的牌的张数
false,//bool bFindShunPai,////要找的牌是顺牌(TRUE,)带牌(FALSE)
cur3paidian//-1//cur3paidian//int cur3paidian////要找的牌是顺牌牌点,如=-1则为入口位
);

if(!p1)
{
lzcnt -= nDaiPaiYuan;
if(lzcnt < 0)goto falied1;
}
else
{
p1cnt[daic]=p1->mcount;
daic ++;
lzcnt -= nDaiPaiYuan - p1->mcount;
if(lzcnt < 0)goto falied1;
p1->mcount = 0;
pnDaiPai[daic]=p1;

}
}///for(int i=0;i<nDaiPai;i++)

}////while(1)

falied1:
{////恢复数据
///这一次找不到,恢复数据: 重新开始找
if(daic > 0)
{
for(int i=0;i<daic;i++)
{
if(pnDaiPai[i])pnDaiPai[i]->mcount=p1cnt[i];
}
}
if(p)
{
p->mcount = p3cnt;
}

lzcnt=lzcnt0;
bstart = true;
continue;
}

falied2:
{////恢复数据
bstart = true;
continue;
}

suc:
{
bstart = false;
continue;
}

}//for(int ii=0;ii<ll;ii++)

return false;*/

}

/*
bool CCardParserDDZ::Is4s1s1s(
CCardParserDDZ * pparser,
CPtrList& lst,
int lzcnt,////赖子数
int &firstpd
)
{
if(!pparser)return false;
return pparser->IsShunAndDai(
lst,
lzcnt,////赖子数
true,

-1,////上一手3牌牌点,如=-1则为入口位
firstpd,
4,

1,
2
);

}

bool CCardParserDDZ::Is3s1s(
CCardParserDDZ * pparser,
CPtrList& lst,
int lzcnt,////赖子数
int &firstpd
)
{
if(!pparser)return false;
return pparser->IsShunAndDai(
lst,
lzcnt,////赖子数
true,

-1,////上一手3牌牌点,如=-1则为入口位
firstpd,
3,

1,
1
);

}
*/

CCardParserDDZ::~CCardParserDDZ(void)
{
while(!mList.IsEmpty ())
{
PSTypeNode *p=(PSTypeNode*)mList.RemoveHead ();
if(p)delete p;
}
mList.RemoveAll ();
}

下一篇:两人斗地主客户端源码(二)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  棋牌源代码