⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 game.cpp

📁 实习时做的空档接龙纸牌游戏
💻 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 + -