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

📄 russionblock.cpp

📁 有计算机图形学、图像处理、dbms、sniffer、中游俄罗斯外挂、othello、遗传算法、舌苔分析等程序。
💻 CPP
📖 第 1 页 / 共 3 页
字号:
				{
					nSub=nLeftSub<(-nRightSub)? nLeftSub:(-nRightSub);
					if(nSub>3)
						nSub=3;
					nScore-=SubScore[nSub];
				}
				nLeftCol=(nLeftCol<CheckCol[i])? nLeftCol:CheckCol[i];
				nRightCol=(nRightCol>CheckCol[i])? nRightCol:CheckCol[i];
			}
		}
        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;
				nScore-=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;
				nScore-=SubScore[nSub];
			}
		}

		if(nScore>nMaxScore)
		{
			nMaxScore=nScore;
		    nMove=R_empty;
			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;
		cur=CRussionBlock(*this);
		--R_empty;
	}
	return nMaxScore;
}
BOOL CRussionBlock::Rotation()
{
    switch(m_btype)
		{
		case 1:
			Rot1();
			break;
		case 2:
			Rot2();
			break;
		case 3:
			Rot3();
			break;
		case 4:
			Rot4();
			break;
		case 5:
			Rot5();
			break;
		case 6:
			Rot6();
			break;
		default:
			return FALSE;
	}
	return TRUE;
}

BOOL CRussionBlock::GetStatus()
{
    return m_bstatus;
}



BOOL CRussionBlock::operator ==(const CRussionBlock &block)
{
    return (m_btype==block.m_btype && m_bstatus==block.m_bstatus);
}

int CRussionBlock::Attack(BYTE Face[][ROW_BLOCK_COUNT+2],
						  UINT top[ROW_BLOCK_COUNT+2], UINT uitop, int &nMove,
						  int& nClrNum,BYTE clr[4])
{
	/*ASSERT(this);
	CRussionBlock cur(*this);
    BOOL bSrcStatus=cur.m_bstatus;
    const BYTE full[ROW_BLOCK_COUNT+2]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
	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
		{
			if(uitop<9 && top[1]<4)
                nScore=cur._Atk(Face,top,nMove1,nClrNum1,clr1);
			else
                nScore=cur.GetScore(Face,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::_Atk(BYTE Face[][ROW_BLOCK_COUNT+2], 
						UINT top[ROW_BLOCK_COUNT+2], int &nMove,int& nClrNum,BYTE clr[4])
{
    int i,j,nScore=0,nMaxScore=0x80000000;
	const BYTE full[ROW_BLOCK_COUNT+1]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
	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},*/ClearScore[5]={0,1000,2000,3000,4000}
	,NullScore[4]={0,1000,1500,4000},SubScore[4]={0,0,1000,8000};
	int nClrNum1=0;
	BYTE clr1[4]={255,255,255,255};
	UINT top1[ROW_BLOCK_COUNT+2];
	bool chk=false;
    UINT uMinDown,uDown;
	CRussionBlock cur(*this);
    int L_empty,R_empty;
	L_empty=cur.m_pos[0].col-1-1;
	R_empty=ROW_BLOCK_COUNT-cur.m_pos[3].col;
    
    while((L_empty+R_empty)>=0)
	{
		//ntoper=0;
		nScore=0;
		uMinDown=0xFFFFFFFF;
		nClrNum1=0;
		nNull=nClearNum=0;
		nLeftCol=ROW_BLOCK_COUNT;
		nRightCol=1;
		::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+=R_empty;//向右
        for(i=0;i<4;i++)
		{
            uDown=cur.m_pos[i].row-top[cur.m_pos[i].col]-1;
			if(uDown<uMinDown)
				uMinDown=uDown;
		}
		for(i=0;i<4;i++)
			cur.m_pos[i].row-=uMinDown;
		for(i=0;i<4;i++)
		{
			nScore-=(cur.m_pos[i].row*300);
			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);
		}
		
		int cutoff=cur.CutOff();
		for(i=0;i<cutoff;i++)
		{
			if(::memcmp(Face[cur.m_pos[i].row]+1,full,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)//真正擦两行以上,马上返回
		{
            nMove=R_empty;
			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+=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-6)>0)?cur.m_pos[i].row-6:0;
				for(j=cur.m_pos[i].row-1;j>to && nNull<=3;--j)
				{
					if(Face[j][cur.m_pos[i].col]<=0)
					{
						nNull++;
						if(j==cur.m_pos[i].row-1)
							nScore-=3000;//遮新洞扣3000分,要擦两条以上才能弥补
					}
				}
				if(nNull>3)
					nNull=3;
				nScore-=NullScore[nNull];

				nLeftSub=top1[CheckCol[i]-1]-top1[CheckCol[i]];
				nRightSub=top1[CheckCol[i]]-top1[CheckCol[i]+1];
				if(nLeftSub>0 && nRightSub<0)
				{
					nSub=nLeftSub<(-nRightSub)? nLeftSub:(-nRightSub);
					if(nSub>3)
						nSub=3;
					nScore-=SubScore[nSub];
				}
				nLeftCol=(nLeftCol<CheckCol[i])? nLeftCol:CheckCol[i];
				nRightCol=(nRightCol>CheckCol[i])? nRightCol:CheckCol[i];
			}
		}
        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;
				nScore-=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;
				nScore-=SubScore[nSub];
			}
		}

		if(nScore>nMaxScore)
		{
			nMaxScore=nScore;
		    nMove=R_empty;
			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;
		cur=CRussionBlock(*this);
		--R_empty;
	}
	return nMaxScore;
}

CRussionBlock & CRussionBlock::operator =(const CRussionBlock& block)
{
	if(this==&block)
		return (*this);
    m_btype=block.m_btype;
	m_bstatus=block.m_bstatus;
	m_bpaste=block.m_bpaste;
	::memcpy(m_pos,block.m_pos,4*sizeof(POS));
	::memcpy(m_oldpos,block.m_oldpos,4*sizeof(POS));
	return (*this);
}
//对于三种方块,有三中情形不于考虑
int CRussionBlock::CutOff()
{
    int index=mask_cutoff[m_btype]+m_bstatus;
	return cutoff[index];
}
//负:左,正:右
BOOL CRussionBlock::Move(int nMove)
{
    int i;
	for(i=0;i<4;i++)
	    m_pos[i].col+=nMove;
	return TRUE;
}

int CRussionBlock::Sort(BYTE clr[4])
{
	int a=0,b=2,i=0;
    BYTE clr1[4];
	::memcpy(clr1,clr,4*sizeof(BYTE));
	
	while(a<2 && b<4)
	{
		if(clr1[a]<clr1[b])
		{
			clr[i++]=clr1[a++];
		}
		else
		{
			clr[i++]=clr1[b++];
		}
	}
	while(a<2)
	{
		clr[i++]=clr1[a++];
	}
	while(b<4)
	{
		clr[i++]=clr1[b++];
	}
	return 0;
}

void CRussionBlock::GetDownInfo(BOOL bAtk,UINT top[ROW_BLOCK_COUNT+2]
								, DOWNKEY downkey[ROW_BLOCK_COUNT], int& nScope)
{
	int i,j=0;//j记录移动次数
	::memcpy(m_oldpos,m_pos,4*sizeof(POS));//保存状态
	unsigned int uDown,uBlockDown,uMinDown=0xFFFFFFFF,uMaxDown=0;
    int L_empty=m_pos[0].col-1,R_empty=ROW_BLOCK_COUNT-m_pos[3].col;
	DOWNKEY** button=NULL;
	DOWNKEY dk[ROW_BLOCK_COUNT];
	::memset(dk,0,ROW_BLOCK_COUNT*sizeof(DOWNKEY));
	//至右移
	for(i=0;i<4;i++)
		m_pos[i].col+=R_empty;

	nScope=m_pos[0].col-bAtk;
	//
    while(m_pos[0].col>bAtk)
	{
		uBlockDown=0xFFFFFFFF;
		for(i=0;i<4;i++)
		{
			uDown=m_pos[i].row-top[m_pos[i].col]-1;
			if(uDown<uBlockDown)
				uBlockDown=uDown;
		}
		if(uBlockDown<uMinDown)
			uMinDown=uBlockDown;
		if(uBlockDown>uMaxDown)
			uMaxDown=uBlockDown;
        
		dk[j].nMov=R_empty;
		dk[j].udown=uBlockDown;
		j++;

		for(i=0;i<4;i++)
			m_pos[i].col--;//左移

		R_empty--;
	}
	::memcpy(m_pos,m_oldpos,4*sizeof(POS));//恢复block原来状态
	//排序
	j=0;
	DOWNKEY* pdown;
	//TRACE1("\nMax:%u",uMaxDown);
	//TRACE1("\nMIN:%u",uMinDown);
	button=new DOWNKEY* [uMaxDown-uMinDown+1];
	::memset(button,0,(uMaxDown-uMinDown+1)*sizeof(DOWNKEY*));
    for(i=nScope-1;i>=0;i--)
	{
		dk[i].next=button[dk[i].udown-uMinDown];
		button[dk[i].udown-uMinDown]=&dk[i];
	}
	for(i=uMaxDown-uMinDown;i>=0;i--)
	{
        pdown=button[i];
		while(pdown)
		{
			downkey[j].nMov=pdown->nMov;
			downkey[j].udown=pdown->udown;
			pdown=pdown->next;
            j++;
        }
	}
	//
	delete []button;
}

void CRussionBlock::GetDownInfo2(BOOL bAtk,UINT top[ROW_BLOCK_COUNT+2]
								, DOWNKEY downkey[ROW_BLOCK_COUNT], int& nScope)
{
	int i,j=0;//j记录移动次数
	::memcpy(m_oldpos,m_pos,4*sizeof(POS));//保存状态
	unsigned int uDown,uBlockDown,uMinDown=0xFFFFFFFF,uMaxDown=0;
    int /*L_empty=m_pos[0].col-1,*/R_empty=ROW_BLOCK_COUNT-m_pos[3].col;
	::memset(button,0,(COL_BLOCK_COUNT)*sizeof(DOWNKEY*));
    ::memset(dk,0,ROW_BLOCK_COUNT*sizeof(DOWNKEY));
	//至右移
	for(i=0;i<4;i++)
		m_pos[i].col+=R_empty;
	
	nScope=m_pos[0].col-bAtk;
    //
    while(m_pos[0].col>bAtk)
	{
		uBlockDown=0xFFFFFFFF;
		for(i=0;i<4;i++)
		{
			uDown=m_pos[i].row-top[m_pos[i].col]-1;
			if(uDown<uBlockDown)
				uBlockDown=uDown;
		}
		if(uBlockDown<uMinDown)
			uMinDown=uBlockDown;
		if(uBlockDown>uMaxDown)
			uMaxDown=uBlockDown;
        
		dk[j].nMov=R_empty;
		dk[j].udown=uBlockDown;
		j++;

		for(i=0;i<4;i++)
			m_pos[i].col--;//左移

		R_empty--;
	}
	::memcpy(m_pos,m_oldpos,4*sizeof(POS));//恢复block原来状态
	//排序
	j=0;
	DOWNKEY* pdown;
	//TRACE1("\nMax:%u",uMaxDown);
	//TRACE1("\nMIN:%u",uMinDown);
	
    for(i=nScope-1;i>=0;i--)
	{
		dk[i].next=button[dk[i].udown-uMinDown];
		button[dk[i].udown-uMinDown]=&dk[i];
	}
	for(i=uMaxDown-uMinDown;i>=0;i--)
	{
        pdown=button[i];
		while(pdown)
		{
			downkey[j].nMov=pdown->nMov;
			downkey[j].udown=pdown->udown;
			pdown=pdown->next;
            j++;
        }
	}
}
int CRussionBlock::Attack1(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];
	const BYTE full[ROW_BLOCK_COUNT+2]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};

⌨️ 快捷键说明

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