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

📄 russionblock.cpp

📁 有计算机图形学、图像处理、dbms、sniffer、中游俄罗斯外挂、othello、遗传算法、舌苔分析等程序。
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	int nScope;

	int nMax=0x80000000,nScore,i,j;
	int nStatus=0,nMove1=0,nClrNum1=0;
	BYTE clr1[4]={255,255,255,255};
    bool bContinue=true;
	int stdclr=2;
	int atk_sts[7]={0,1,0,0,2,1,1};
	int lstdclr[7]={2,3,2,2,2,3,3};//低位标准擦除
	int hstdclr[7]={2,2,2,2,2,2,2};
    
	UINT uMinDown=0xFFFFFFFF,uDown;
	
	CRussionBlock cur1(cur);
	int sts=atk_sts[cur1.m_btype];//攻击状态
	while(cur1.m_bstatus!=sts)
		cur1.Rotation();
	
	int L_empty=cur1.m_pos[0].col-1;
	for(i=0;i<4;i++)
		cur1.m_pos[i].col-=L_empty;//向左
	for(i=0;i<4;i++)
	{
        uDown=cur1.m_pos[i].row-top[cur1.m_pos[i].col]-1;
		if(uDown<uMinDown)
			uMinDown=uDown;
	}
	for(i=0;i<4;i++)
		cur1.m_pos[i].row-=uMinDown;
	for(i=0;i<4;i++)
	{
		Face[cur1.m_pos[i].row][cur1.m_pos[i].col]=1;
	}
	int cutoff=cur1.CutOff();
	for(i=0;i<cutoff;i++)
	{
		if(::memcmp(Face[cur1.m_pos[i].row],full,ROW_BLOCK_COUNT+2)==0)
		{
			++nClrNum1;
            if(nClrNum1%2==0 && cur1.m_pos[i].row<clr1[nClrNum1-2])//将放第偶数行并且比前一行小
			{
				clr1[nClrNum1-1]=clr1[nClrNum1-2];
                clr1[nClrNum1-2]=cur1.m_pos[i].row;
			}
			else
				clr1[nClrNum1-1]=cur1.m_pos[i].row;
		}
	}
	
    stdclr=(uitop<9)?lstdclr[cur1.m_btype]:hstdclr[cur1.m_btype];
	if(nClrNum1>=stdclr)
	{
		nStatus=sts;
		nMove=(-L_empty);
		nClrNum=nClrNum1;
		::memcpy(clr,clr1,4*sizeof(BYTE));
		bContinue=false;
	}
	for(i=0;i<4;i++)
	{
		Face[cur1.m_pos[i].row][cur1.m_pos[i].col]=0;
	}

	if(bContinue)
	{
		i=0;
		int TurnCount[7]={0,1,1,1,3,3,3};
		
		do
		{
			::memset(downkey,0,ROW_BLOCK_COUNT*sizeof(DOWNKEY));
			if(uitop<9 && top[1]<4)
			{
				cur.GetDownInfo(1,top,downkey,nScope);
                nScore=cur._Atk1(Face,downkey,nScope,top,nMove1,nClrNum1,clr1);
			}
			else
			{
				cur.GetDownInfo(0,top,downkey,nScope);
                nScore=cur.GetScore1(Face,downkey,nScope,top,nMove1,nClrNum1,clr1);
			}
		    nScore-=(abs(nMove1)*100);
            if(nScore>nMax || nClrNum1>1)
			{
			    nMove=nMove1;
			    nStatus=cur.m_bstatus;
				nClrNum=nClrNum1;
				::memcpy(clr,clr1,4*sizeof(BYTE));
			    nMax=nScore;
			}
			if(nClrNum1<2)//只擦0或1行
			{
				++i;
				if(i<=TurnCount[cur.m_btype])
				{
					cur.Rotation();
				}
			}
		}
		while(i<=TurnCount[cur.m_btype] && nClrNum1<2);
	}
	if(nClrNum>2)//三行以上排序
		Sort(clr);
	return nStatus;*/
    return 0;
}

int CRussionBlock::Attack2(BYTE Face[][ROW_BLOCK_COUNT+2],
						  UINT top[ROW_BLOCK_COUNT+2], UINT uitop, int &nMove,
						  int& nClrNum,BYTE clr[4])
{
    CRussionBlock cur(*this);
    BOOL bSrcStatus=cur.m_bstatus;
	//DOWNKEY downkey[ROW_BLOCK_COUNT];
	int nScope;
	int nMax=0x80000000,nScore,i;
	int nStatus=0,nMove1=0,nClrNum1=0;
	BYTE clr1[4]={255,255,255,255};
    //bool bContinue=true;
    
	if(uitop<9 && top[1]<4)
	{
		int stdclr=2;
		//int hstdclr[7]={2,2,2,2,2,2,2};
		UINT uMinDown=0xFFFFFFFF,uDown;
		CRussionBlock cur1(cur);
		int sts=atk_sts[cur1.m_btype];//攻击状态
		
		while(cur1.m_bstatus!=sts)
			cur1.Rotation();
		
		int L_empty=cur1.m_pos[0].col-1;
		for(i=0;i<4;i++)
			cur1.m_pos[i].col-=L_empty;//向左
		for(i=0;i<4;i++)
		{
			uDown=cur1.m_pos[i].row-top[cur1.m_pos[i].col]-1;
			if(uDown<uMinDown)
				uMinDown=uDown;
		}
		for(i=0;i<4;i++)
			cur1.m_pos[i].row-=uMinDown;
		for(i=0;i<4;i++)
		{
			Face[cur1.m_pos[i].row][cur1.m_pos[i].col]=1;
		}
		int cutoff=cur1.CutOff();
		for(i=0;i<cutoff;i++)
		{
			if(::memcmp(Face[cur1.m_pos[i].row],full1,ROW_BLOCK_COUNT+2)==0)
			{
				++nClrNum1;
				if(nClrNum1%2==0 && cur1.m_pos[i].row<clr1[nClrNum1-2])//将放第偶数行并且比前一行小
				{
					clr1[nClrNum1-1]=clr1[nClrNum1-2];
					clr1[nClrNum1-2]=cur1.m_pos[i].row;
				}
				else
					clr1[nClrNum1-1]=cur1.m_pos[i].row;
			}
		}

		for(i=0;i<4;i++)//恢复Face
		{
			Face[cur1.m_pos[i].row][cur1.m_pos[i].col]=0;
		}

		stdclr=lstdclr[cur1.m_btype];
		//stdclr=(uitop<9)?lstdclr[cur1.m_btype]:hstdclr[cur1.m_btype];
		if(nClrNum1>=stdclr)
		{
			nStatus=sts;
			nMove=(-L_empty);
			nClrNum=nClrNum1;
			::memcpy(clr,clr1,4*sizeof(BYTE));
			//bContinue=false;
			if(nClrNum>2)//三行以上排序
		        Sort(clr);
			return nStatus;
		}
		
	}
	//if(bContinue)
	//{
		i=0;
		do
		{
			//::memset(downkey,0,ROW_BLOCK_COUNT*sizeof(DOWNKEY));
			if(uitop<9 && top[1]<4)
			{
				cur.GetDownInfo2(1,top,downkey,nScope);
                nScore=cur._Atk1(Face,downkey,nScope,top,nMove1,nClrNum1,clr1);
			}
			else
			{
				cur.GetDownInfo2(0,top,downkey,nScope);
                nScore=cur.GetScore1(Face,downkey,nScope,top,nMove1,nClrNum1,clr1);
			}
		    nScore-=(abs(nMove1)*100);
            if(nScore>nMax || nClrNum1>1)
			{
			    nMove=nMove1;
			    nStatus=cur.m_bstatus;
				nClrNum=nClrNum1;
				::memcpy(clr,clr1,4*sizeof(BYTE));
			    nMax=nScore;
			}
			if(nClrNum1<2)//只擦0或1行
			{
				++i;
				if(i<=TurnCount[cur.m_btype])
				{
					cur.Rotation();
				}
			}
		}
		while(i<=TurnCount[cur.m_btype] && nClrNum1<2);
	//}
	if(nClrNum>2)//三行以上排序
		Sort(clr);
	return nStatus;
}

int CRussionBlock::_Atk1(BYTE Face[][ROW_BLOCK_COUNT+2],DOWNKEY downkey[ROW_BLOCK_COUNT]
						 ,int nScope, UINT top[ROW_BLOCK_COUNT+2]
						 , int &nMove,int& nClrNum,BYTE clr[4])
{
    int i,j,flow,nScore=0,nMaxScore=0x80000000;
	int nClearNum=0,nNull=0,/*ntoper=0*/nSub=0,nLeftSub=0,nRightSub=0,nLeftCol,nRightCol;
	int CheckCol[4]={0,0,0,0};/*CheckRow[4]={0,0,0,0},*/
	
	int nClrNum1=0;
	BYTE clr1[4]={255,255,255,255};
	UINT top1[ROW_BLOCK_COUNT+2];
	bool chk=false,bNulOrSub;
    CRussionBlock cur(*this);
    
    for(flow=0;flow<nScope;flow++)
	{
		//ntoper=0;
		nScore=0;
		nClrNum1=0;
		nNull=nClearNum=0;
		bNulOrSub=false;
		::memcpy(top1,top,(ROW_BLOCK_COUNT+2)*sizeof(UINT));
		::memset(CheckCol,0,4*sizeof(int));
		//::memset(CheckRow,0,4*sizeof(int));
		::memset(clr1,0xFF,4*sizeof(BYTE));

		for(i=0;i<4;i++)
		{
		    cur.m_pos[i].col+=downkey[flow].nMov;//移动
            cur.m_pos[i].row-=downkey[flow].udown;//下落
		    
			nScore-=(cur.m_pos[i].row*atk_heightScore);
			Face[cur.m_pos[i].row][cur.m_pos[i].col]=1;
			if(top1[cur.m_pos[i].col]<UINT(cur.m_pos[i].row))
                top1[cur.m_pos [i].col]=UINT(cur.m_pos[i].row);
		}
		if(flow==0)//似乎只有最低处要检查擦除
		{
			int cutoff=cur.CutOff();
			for(i=0;i<cutoff;i++)
			{
				if(::memcmp(Face[cur.m_pos[i].row]+1,full2,ROW_BLOCK_COUNT+1)==0)
				{
					nClearNum++;
					if(Face[cur.m_pos[i].row][1]>0)//能真正擦除
					{
						++nClrNum1;
						if(nClrNum1%2==0 && cur.m_pos[i].row<clr1[nClrNum1-2])//将放第偶数行并且比前一行小
						{
							clr1[nClrNum1-1]=clr1[nClrNum1-2];
							clr1[nClrNum1-2]=cur.m_pos[i].row;
						}
						else
							clr1[nClrNum1-1]=cur.m_pos[i].row;
					}
				}
			}
			
			if(nClrNum1>1)//真正擦两行以上,马上返回????????????????12.6
			{
				nMove=downkey[flow].nMov;
				nClrNum=nClrNum1;
				::memcpy(clr,clr1,4*sizeof(BYTE));
				for(i=0;i<4;i++)
					Face[cur.m_pos[i].row][cur.m_pos[i].col]=0;
				return 0;
			}
			nScore+=atk_ClearScore[nClearNum];
		}
		for(i=0;i<4;i++)
		{
			nNull=0;
			chk=false;
			for(j=0;j<4&&!chk;j++)
			{
				if(CheckCol[j]==cur.m_pos[i].col)
					chk=true;
			}
			if(!chk)
			{
				CheckCol[i]=cur.m_pos[i].col;
				int to=((cur.m_pos[i].row-4)>0)?cur.m_pos[i].row-4:0;//检查下三层
				for(j=cur.m_pos[i].row-1;j>to ;--j)
				{
					if(Face[j][cur.m_pos[i].col]<=0)
					{
						nNull++;
						bNulOrSub=true;
						if(j==cur.m_pos[i].row-1)
							nScore-=3000;//遮新洞扣3000分,要擦两条以上才能弥补
					}
				}
				//if(nNull>3)
				//	nNull=3;
				nScore-=atk_NullScore[nNull];
			}
		}

        if(cur.m_btype>4 && cur.m_bstatus==3)
		{
			int checksub=(cur.m_btype==5)? cur.m_pos[0].col:cur.m_pos[3].col;
			nLeftSub=top1[checksub-1]-top1[checksub];
			nRightSub=top1[checksub]-top1[checksub+1];
			if(nLeftSub>0 && nRightSub<0)
			{
				nSub=nLeftSub<(-nRightSub)? nLeftSub:(-nRightSub);
				if(nSub>3)
					nSub=3;
				if(nSub>1)
					bNulOrSub=true;
				nScore-=atk_SubScore[nSub];
			}
		}
		nLeftCol=cur.m_pos[0].col;
		nRightCol=cur.m_pos[3].col;
		if(nLeftCol>2)//第0,1列不检查
		{
			nLeftSub=top1[nLeftCol-2]-top1[nLeftCol-1];
			nRightSub=top1[nLeftCol-1]-top1[nLeftCol];
			if(nLeftSub>0 && nRightSub<0)
			{
				nSub=nLeftSub<(-nRightSub)? nLeftSub:(-nRightSub);
				if(nSub>3)
					nSub=3;
				if(nSub>1)
					bNulOrSub=true;
				nScore-=atk_SubScore[nSub];
			}
		}
		if(nRightCol<ROW_BLOCK_COUNT)//第15列不检查
		{
			nLeftSub=top1[nRightCol]-top1[nRightCol+1];
			nRightSub=top1[nRightCol+1]-top1[nRightCol+2];
			if(nLeftSub>0 && nRightSub<0)
			{
				nSub=nLeftSub<(-nRightSub)? nLeftSub:(-nRightSub);
				if(nSub>3)
					nSub=3;
				if(nSub>1)
					bNulOrSub=true;
				nScore-=atk_SubScore[nSub];
			}
		}

		if(nScore>nMaxScore)
		{
			nMaxScore=nScore;
		    nMove=downkey[flow].nMov;
			nClrNum=nClrNum1;
			::memcpy(clr,clr1,4*sizeof(BYTE));
			if(!bNulOrSub)
			{
                for(i=0;i<4;i++)
			        Face[cur.m_pos[i].row][cur.m_pos[i].col]=0;
				return nMaxScore;
			}
		}
		for(i=0;i<4;i++)
			Face[cur.m_pos[i].row][cur.m_pos[i].col]=0;
		cur=CRussionBlock(*this);
	}
	return nMaxScore;
}

//Face[][ROW_BLOCK_COUNT+2],top[ROW_BLOCK_COUNT+2]
int CRussionBlock::GetScore1(BYTE Face[][ROW_BLOCK_COUNT+2],DOWNKEY downkey[ROW_BLOCK_COUNT]
							 ,int nScope, UINT top[ROW_BLOCK_COUNT+2]
							 , int& nMove,int& nClrNum,BYTE clr[4])
{
	int i,j,flow,nScore=0,nMaxScore=0x80000000;
	int nClrNum1=0,nNull=0,/*ntoper=0*/nSub=0,nLeftSub=0,nRightSub=0,nLeftCol,nRightCol;
	int CheckCol[4]={0,0,0,0};/*CheckRow[4]={0,0,0,0},*/
	UINT top1[ROW_BLOCK_COUNT+2];
	BYTE clr1[4]={255,255,255,255};
	bool chk=false,bNulOrSub;
    CRussionBlock cur(*this);
    
    for(flow=0;flow<nScope;flow++)
	{
		//ntoper=0;
		nScore=0;
		nNull=nClrNum1=0;
		bNulOrSub=false;
		::memcpy(top1,top,(ROW_BLOCK_COUNT+2)*sizeof(UINT));
		::memset(CheckCol,0,4*sizeof(int));
		//::memset(CheckRow,0,4*sizeof(int));
		::memset(clr1,0xFF,4*sizeof(BYTE));
		for(i=0;i<4;i++)
		{
		    cur.m_pos[i].col+=downkey[flow].nMov;//移动
            cur.m_pos[i].row-=downkey[flow].udown;//落下
		    nScore-=(cur.m_pos[i].row*ord_heightScore);/////////////////////////400??????????????
			Face[cur.m_pos[i].row][cur.m_pos[i].col]=1;
			if(top1[cur.m_pos[i].col]<UINT(cur.m_pos[i].row))
                top1[cur.m_pos[i].col]=UINT(cur.m_pos[i].row);
		}

		if(flow==0)
		{
			int cutoff=cur.CutOff();
			for(i=0;i<cutoff;i++)
			{
				if(::memcmp(Face[cur.m_pos[i].row],full1,ROW_BLOCK_COUNT+2)==0)
				{
					++nClrNum1;
					if(nClrNum1%2==0 && cur.m_pos[i].row<clr1[nClrNum1-2])//将放第偶数行并且比前一行小
					{
						clr1[nClrNum1-1]=clr1[nClrNum1-2];
						clr1[nClrNum1-2]=cur.m_pos[i].row;
					}
					else
						clr1[nClrNum1-1]=cur.m_pos[i].row;
				}
			}
			if(nClrNum1>1)//真正擦两行以上,马上返回
			{
				nMove=downkey[flow].nMov;
				nClrNum=nClrNum1;
				::memcpy(clr,clr1,4*sizeof(BYTE));
				for(i=0;i<4;i++)
					Face[cur.m_pos[i].row][cur.m_pos[i].col]=0;
				return 0;
			}
			nScore+=ord_ClearScore[nClrNum1];//此时擦除不可能超过2
		}
		
		for(i=0;i<4;i++)
		{
			nNull=0;
			chk=false;
			for(j=0;j<4&&!chk;j++)
			{
				if(CheckCol[j]==cur.m_pos[i].col)
					chk=true;
			}
			if(!chk)
			{
				CheckCol[i]=cur.m_pos[i].col;
				int to=((cur.m_pos[i].row-4)>0)?cur.m_pos[i].row-4:0;//检查下三层
				for(j=cur.m_pos[i].row-1;j>to ;--j)
				{
					if(Face[j][cur.m_pos[i].col]<=0)
					{
						nNull++;
						bNulOrSub=true;
						if(j==cur.m_pos[i].row-1)
							nScore-=5000;//遮新洞扣5000分,要擦两条以上才能弥补!!!!
					}
				}
				//if(nNull>3)
				//	nNull=3;
				nScore-=ord_NullScore[nNull];
			}
		}
        
		if(cur.m_btype>4 && cur.m_bstatus==3)
		{
			int checksub=(cur.m_btype==5)? cur.m_pos[0].col:cur.m_pos[3].col;
			nLeftSub=top1[checksub-1]-top1[checksub];
			nRightSub=top1[checksub]-top1[checksub+1];
			if(nLeftSub>0 && nRightSub<0)
			{
				nSub=nLeftSub<(-nRightSub)? nLeftSub:(-nRightSub);
				if(nSub>3)
					nSub=3;
				if(nSub>1)
					bNulOrSub=true;
				nScore-=ord_SubScore[nSub];
			}
		}
		
		nLeftCol=cur.m_pos[0].col;
		nRightCol=cur.m_pos[3].col;;
		if(nLeftCol>1)//第0列不检查
		{
			nLeftSub=top1[nLeftCol-2]-top1[nLeftCol-1];
			nRightSub=top1[nLeftCol-1]-top1[nLeftCol];
			if(nLeftSub>0 && nRightSub<0)
			{
				nSub=nLeftSub<(-nRightSub)? nLeftSub:(-nRightSub);
				if(nSub>3)
					nSub=3;
				if(nSub>1)
					bNulOrSub=true;
				nScore-=ord_SubScore[nSub];
			}
		}
		if(nRightCol<ROW_BLOCK_COUNT)//第17列不检查
		{
			nLeftSub=top1[nRightCol]-top1[nRightCol+1];
			nRightSub=top1[nRightCol+1]-top1[nRightCol+2];
			if(nLeftSub>0 && nRightSub<0)
			{
				nSub=nLeftSub<(-nRightSub)? nLeftSub:(-nRightSub);
				if(nSub>3)
					nSub=3;
				if(nSub>1)
					bNulOrSub=true;
				nScore-=ord_SubScore[nSub];
			}
		}

		if(nScore>nMaxScore)
		{
			nMaxScore=nScore;
		    nMove=downkey[flow].nMov;
			nClrNum=nClrNum1;
			::memcpy(clr,clr1,4*sizeof(BYTE));
			if(!bNulOrSub)
			{
				for(i=0;i<4;i++)
			        Face[cur.m_pos[i].row][cur.m_pos[i].col]=0;
				return nMaxScore;
			}
		}
		for(i=0;i<4;i++)
			Face[cur.m_pos[i].row][cur.m_pos[i].col]=0;
		cur=CRussionBlock(*this);
	}
	return nMaxScore;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -