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