📄 game.cpp
字号:
// game.cpp: implementation of the Cgame class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "空当接龙.h"
#include "game.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
Cgame::Cgame()
{
for(int i=0;i<13;i++)
{
m_allp[i].ds=i+1;
m_allp[i].ys=HEI;
m_allp[i].hs=HEIT;
m_allp[i].zb=i;
m_allp[i+13].ds=i+1;
m_allp[i+13].ys=HONG;
m_allp[i+13].hs=HONGT;
m_allp[i+13].zb=i+13;
m_allp[i+26].ds=i+1;
m_allp[i+26].ys=HEI;
m_allp[i+26].hs=MEIH;
m_allp[i+26].zb=i+26;
m_allp[i+39].ds=i+1;
m_allp[i+39].ys=HONG;
m_allp[i+39].hs=FANGP;
m_allp[i+39].zb=i+39;
}
}
Cgame::~Cgame()
{
}
void Cgame::xipai()
{
for(int i=0;i<8;i++)
{
m_pshu[i]=0;
for(int j=0;j<19;j++)
{
m_gamep[i][j].ds=0;
m_gamep[i][j].hs=0;
m_gamep[i][j].ys=0;
m_gamep[i][j].zb=-1;
}
}
int fp[52];//存放发排的牌号
int sjs;//产生的随机数
int bzw=0;//是否存该随机数 0:存 1:已经有了不存
int yy=0;//已经存的不重复随机数
srand(time(NULL));
for(yy=0;yy<52;)
{
sjs=rand()%52;
bzw=0;
for(int j=0;j<yy;j++)
if(fp[j]==sjs)
{
bzw=1;
break;
}
if(bzw!=1)
{
fp[yy++]=sjs;
}
}
yy=0;
for(i=0;i<4;i++)//发左边4列牌,为7张
{
m_pshu[i]=7;
for(int j=0;j<7;j++)
{
m_gamep[i][j]=m_allp[fp[yy++]];
}
}
for(i=4;i<8;i++)//发右边4列牌,为6张
{
m_pshu[i]=6;
for(int j=0;j<6;j++)
{
m_gamep[i][j]=m_allp[fp[yy++]];
}
}
for(i=0;i<4;i++)
{
m_cunp[i].ds=0;
m_cunp[i].hs=0;
m_cunp[i].ys=0;
m_cunp[i].zb=-1;
m_shoup[i].ds=0;
m_shoup[i].hs=HEIT+i;
m_shoup[i].ys=0;
m_shoup[i].zb=-1;
}
m_cunps=4;
for(i=0;i<13;i++)
{
m_xuanp[i].ds=0;
m_xuanp[i].hs=0;
m_xuanp[i].ys=0;
m_xuanp[i].zb=-1;
}
m_xzps=0;
m_lies=-1;
m_rlies=-1;
m_rhangs=-1;
m_sps=52;
m_oldlies=-1;
m_ynnp=1;
m_npws=0;
m_ynzl=false;
}
bool Cgame::cunp(int lies)
{
if(m_cunps==0)
{
m_xuanp[0].ds=0;//取消第一下点击时的标记
return false;
}
if(m_pshu[lies]>0)
{
for(int i=0;i<4;i++)
{
if(m_cunp[i].zb==-1)
{
m_cunp[i]=m_gamep[lies][m_pshu[lies]-1];
m_gamep[lies][m_pshu[lies]-1].ds=0;//删除挪走的牌
m_gamep[lies][m_pshu[lies]-1].hs=0;
m_gamep[lies][m_pshu[lies]-1].ys=0;
m_gamep[lies][m_pshu[lies]-1].zb=-1;
break;
}
}
m_pshu[lies]-=1;//此列牌数减1
m_cunps-=1;//减少一个存牌位置
m_xuanp[0].ds=0;//取消第一下点击时的标记
m_xuanp[0].hs=0;
m_xuanp[0].ys=0;
m_xuanp[0].zb=-1;
m_lies=-1;
m_xzps=0;
return true;
}
return false;
}
void Cgame::ynxuan(int lies)
{
if(lies<10)
{
if(m_lies==lies)//两次电击同一列时,取消标记
{
for(int i=0;i<m_xzps;i++)
{
m_xuanp[i].ds=0;
m_xuanp[i].hs=0;
m_xuanp[i].ys=0;
m_xuanp[i].zb=-1;
}
m_lies=-1;
m_xzps=0;
}
else
{
if(m_xuanp[0].zb==-1)//表示还没有选中的牌时
{
if(m_pshu[lies]>0)
{
m_xuanp[0]=m_gamep[lies][m_pshu[lies]-1];
m_xzps=1;
for(int i=m_pshu[lies]-2;i>=0;i--)//选出可以一次挪动的牌
{
if(m_gamep[lies][i].ds-1==m_gamep[lies][i+1].ds&&m_gamep[lies][i].ys*(-1)==m_gamep[lies][i+1].ys)
{
m_xuanp[m_xzps++]=m_gamep[lies][i];
}
else
{
break;
}
}
m_lies=lies;
m_ynnp=1;
}
}//if(m_xuanp[0].zb==-1)
else//有选中的牌的时候
{
if(m_xzps<20)//选种的是下面的牌的时候
{
int cs=0;
if(m_xzps>1)
{
for(int i=1;i<m_xzps;i++)
{
if(m_xuanp[i].ds==m_gamep[lies][m_pshu[lies]-1].ds&&m_gamep[lies][m_pshu[lies]-1].ys==m_xuanp[i].ys)
{
m_npws=i;
cs=1;
break;
}
}
}
if(cs==0)
{
if(m_xuanp[m_xzps-1].ds+1==m_gamep[lies][m_pshu[lies]-1].ds&&m_gamep[lies][m_pshu[lies]-1].ys==m_xuanp[m_xzps-1].ys*(-1))
{
cs=1;
m_npws=m_xzps;
}
}
if(cs==0)
{
if(m_pshu[lies]==0&&m_ynzl==false)//判断是否移动整列
{
m_npws=1;
cs=1;
m_ynzl=false;
}
if(m_pshu[lies]==0&&m_ynzl==true)
{
if(m_xzps>m_cunps+1)
{
m_npws=m_cunps+1;
}
else
{
m_npws=m_xzps;
}
cs=1;
m_ynzl=false;
}
}
if(cs==0)//不能挪牌
{
m_ynnp=0;
if(m_xzps<=13)
{
for(int i=0;i<m_xzps;i++)
{
m_xuanp[i].ds=0;
m_xuanp[i].hs=0;
m_xuanp[i].ys=0;
m_xuanp[i].zb=-1;
}
m_lies=-1;
m_xzps=0;
}
}//if(cs==0)
else//可以挪牌时判断位置够不够
{
if(m_npws<=m_cunps+1)//位置够的时候
{
for(int i=m_npws-1;i>=0;i--)
{
m_gamep[lies][m_pshu[lies]-1+m_npws-i]=m_xuanp[i];
}
for(i=0;i<m_npws;i++)
{
m_gamep[m_lies][m_pshu[m_lies]-1].ds=0;
m_gamep[m_lies][m_pshu[m_lies]-1].hs=0;
m_gamep[m_lies][m_pshu[m_lies]-1].ys=0;
m_gamep[m_lies][m_pshu[m_lies]-1].zb=-1;
m_pshu[m_lies]-=1;
}
m_pshu[lies]+=m_npws;
for(i=0;i<m_xzps;i++)
{
m_xuanp[i].ds=0;
m_xuanp[i].hs=0;
m_xuanp[i].ys=0;
m_xuanp[i].zb=-1;
}
m_ynnp=1;
m_oldlies=m_lies;
m_lies=lies;
}//if(m_npws<=m_cunps+1)
else//位置不够时
{
m_ynnp=2;
for(int i=0;i<m_xzps;i++)
{
m_xuanp[i].ds=0;
m_xuanp[i].hs=0;
m_xuanp[i].ys=0;
m_xuanp[i].zb=-1;
}
}//if(m_npws<=m_cunps+1) else
}//if(cs==0) else
}//if(m_xzps<20)
else//当选种的是左上脚的牌的时候
{
if(m_gamep[lies][m_pshu[lies]-1].ds-1==m_xuanp[0].ds&&m_gamep[lies][m_pshu[lies]-1].ys*(-1)==m_xuanp[0].ys||m_pshu[lies]==0)
{
m_gamep[lies][m_pshu[lies]++]=m_xuanp[0];
m_xuanp[0].ds=0;
m_xuanp[0].hs=0;
m_xuanp[0].ys=0;
m_xuanp[0].zb=-1;
m_cunp[m_lies-10].ds=0;
m_cunp[m_lies-10].hs=0;
m_cunp[m_lies-10].ys=0;
m_cunp[m_lies-10].zb=-1;
m_cunps+=1;
m_oldlies=m_lies;
m_lies=lies;
m_ynnp=3;
m_xzps=0;
}
else
{
m_xuanp[0].ds=0;
m_xuanp[0].hs=0;
m_xuanp[0].ys=0;
m_xuanp[0].zb=-1;
m_lies=-1;
m_xzps=0;
m_ynnp=0;
m_xzps=0;
}
}
}//if(m_xuanp[0].zb==-1) else
}//if(m_lies==lies) else
}//if(lies<10)
if(lies>=10)
{
if(m_cunp[lies-10].zb==m_xuanp[0].zb)
{
m_xuanp[0].ds=0;
m_xuanp[0].hs=0;
m_xuanp[0].ys=0;
m_xuanp[0].zb=-1;
m_lies=-1;
m_xzps=0;
}
else
{
m_xuanp[0]=m_cunp[lies-10];
m_lies=lies;
m_xzps=21;
}
}
}
bool Cgame::ynshoup(int lies)
{
if(lies<10)
{
if(m_gamep[lies][m_pshu[lies]-1].hs==m_shoup[m_gamep[lies][m_pshu[lies]-1].hs-2].hs&&m_gamep[lies][m_pshu[lies]-1].ds-1==m_shoup[m_gamep[lies][m_pshu[lies]-1].hs-2].ds)
{
if(m_pshu[lies]>0)
{
m_shoup[m_gamep[lies][m_pshu[lies]-1].hs-2]=m_gamep[lies][m_pshu[lies]-1];
m_gamep[lies][m_pshu[lies]-1].ds=0;//删除收走的牌
m_gamep[lies][m_pshu[lies]-1].hs=0;
m_gamep[lies][m_pshu[lies]-1].ys=0;
m_gamep[lies][m_pshu[lies]-1].zb=-1;
m_pshu[lies]-=1;//此列牌数减1
m_xuanp[0].ds=0;
m_xuanp[0].hs=0;
m_xuanp[0].ys=0;
m_xuanp[0].zb=-1;
m_xzps=0;
m_sps-=1;//剩牌数减1
m_lies=-1;
return true;
}
}
}
if(lies>=10)
{
lies-=10;
if(m_cunp[lies].hs==m_shoup[m_cunp[lies].hs-2].hs&&m_cunp[lies].ds-1==m_shoup[m_cunp[lies].hs-2].ds)
{
m_shoup[m_cunp[lies].hs-2]=m_cunp[lies];
m_cunp[lies].ds=0;
m_cunp[lies].hs=0;
m_cunp[lies].ys=0;
m_cunp[lies].zb=-1;
m_cunps+=1;
m_xuanp[0].ds=0;
m_xuanp[0].hs=0;
m_xuanp[0].ys=0;
m_xuanp[0].zb=-1;
m_xzps=0;
m_sps-=1;//剩牌数减1
m_lies=-1;
return true;
}
}
m_xuanp[0].ds=0;
m_xuanp[0].hs=0;
m_xuanp[0].ys=0;
m_xuanp[0].zb=-1;
m_lies=-1;
m_xzps=0;
return false;
}
void Cgame::zdsp()
{
for(int i=0;i<8;i++)
{
for(int j=12;j>=0;j--)
{
if(m_gamep[i][j].zb!=-1)
{
if(m_gamep[i][j].hs==m_shoup[m_gamep[i][j].hs-2].hs&&m_gamep[i][j].ds-1==m_shoup[m_gamep[i][j].hs-2].ds)
{
m_shoup[m_gamep[i][j].hs-2]=m_gamep[i][j];
m_gamep[i][j].ds=0;//删除收走的牌
m_gamep[i][j].hs=0;
m_gamep[i][j].ys=0;
m_gamep[i][j].zb=-1;
m_pshu[i]-=1;//此列牌数减1
m_sps-=1;//剩牌数减1
zdsp();
}
else
break;
}
}
}
for(i=0;i<4;i++)
{
if(m_cunp[i].zb!=-1)
{
if(m_cunp[i].hs==m_shoup[m_cunp[i].hs-2].hs&&m_cunp[i].ds-1==m_shoup[m_cunp[i].hs-2].ds)
{
m_shoup[m_cunp[i].hs-2]=m_cunp[i];
m_cunp[i].ds=0;
m_cunp[i].hs=0;
m_cunp[i].ys=0;
m_cunp[i].zb=-1;
m_cunps+=1;//可存牌数+1
m_sps-=1;//剩牌数减1
zdsp();
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -