两人斗地主客户端源码(一)
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 ();
}
下一篇:两人斗地主客户端源码(二)
#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 ();
}
下一篇:两人斗地主客户端源码(二)
相关文章推荐
- 两人斗地主客户端源码(三)
- 搭建windows server 2008 r2 FTP 后 开启防火墙无法访问的解决办法
- java中List和Map的去重
- java保存报错解决for column 'name' at r
- Eclipse 用法、快捷键;Android DDMS
- 《重构:改善既有代码的设计》——关于代码注释的唠叨
- C语言指针的初始化和赋值
- 用于windbg检查堆是否被破坏的python脚本
- Python实现有道翻译
- 【转载】学习C++和编程的几个要点
- eclipse中PYTHONPATH作用以及设置
- java中类与继承类内初始化顺序的测试
- 自己简单封装spring容器
- ASP TreeView控件介绍及下载使用指南
- java读取图片属性---判断手机拍照上传的图片是否被翻转
- java关键字——transient
- 主题: 为kindsoft编辑器替换SyntaxHighlighter代码高亮,整合DEDECMS
- java.lang.ClassNotFoundException和java.lang.NoClassDefFoundError的区别
- 面向GC的Java编程
- Python学习笔记2——Python built-in functions学习