📄 russionblock.cpp
字号:
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 + -