📄 diamonddlg.cpp
字号:
for(int j=0;j<10;j++)
m_Matrix[i][j][0]=m_Matrix[i][j][1]=0;
DrawAll();
char str[128];
m_Score=0;
sprintf(str,"%d",m_Score);
m_ScoreCtrl.SetWindowText(str);
sprintf(str,"%d",m_Level);
m_LevelCtrl.SetWindowText(str);
CTime Time;
i=Time.GetCurrentTime().GetSecond();
srand(i); //以时间为种子
m_Index=abs(rand()%8); //计算方块形状
if(m_Index==0) m_Index=1;
DrawInitBlock();
SetTimer(1,600-50*m_Level,NULL);
}
void CDiamondDlg::DropDown() //自由下落
{
CString str;
for(int i=0;i<4;i++)
if(m_Matrix[m_CurBlock[i].y+1][m_CurBlock[i].x][0]==1||m_CurBlock[i].y==21) //如果已经下降到底
{
m_Matrix[m_CurBlock[0].y][m_CurBlock[0].x][0]=1; //
m_Matrix[m_CurBlock[1].y][m_CurBlock[1].x][0]=1;
m_Matrix[m_CurBlock[2].y][m_CurBlock[2].x][0]=1;
m_Matrix[m_CurBlock[3].y][m_CurBlock[3].x][0]=1;
m_Matrix[m_CurBlock[0].y][m_CurBlock[0].x][1]=m_CurBlockMap; //
m_Matrix[m_CurBlock[1].y][m_CurBlock[1].x][1]=m_CurBlockMap;
m_Matrix[m_CurBlock[2].y][m_CurBlock[2].x][1]=m_CurBlockMap;
m_Matrix[m_CurBlock[3].y][m_CurBlock[3].x][1]=m_CurBlockMap;
for(int j=0;j<10;j++)
if(m_Matrix[0][j][0]==1) //结束
{
KillTimer(1);
if(m_maxScore<m_Score)
{
NewRecord();
}
else
{
str.Format("----------------------GAME OVER--------------------\n\n\tYour Score\t\tLevel\n\t%ld\t\t\t%d\t\n\n------------WELCOME TO PLAY AGAIN------------",m_Score,m_Level);
MessageBox(str,"THE END");
}
return;
}
GetScore(); //判断是否得分
DrawInitBlock();
return;
}
EraseLastBlock(); //删除上次的
m_CurBlock[0].y+=1;
m_CurBlock[1].y+=1;
m_CurBlock[2].y+=1;
m_CurBlock[3].y+=1;
DrawCurBlock();
return;
}
void CDiamondDlg::DrawCurBlock()
{
CDC MemDC;
MemDC.CreateCompatibleDC(m_pBlockDC);
MemDC.SelectObject(m_Bitmap+m_CurBlockMap);
for(int i=0;i<4;i++)
{
m_pBlockDC->BitBlt(m_CurBlock[i].x*20+1,m_CurBlock[i].y*20+1,18,18,&MemDC,0,0,SRCCOPY);
m_pBlockDC->Draw3dRect(m_CurBlock[i].x*20,m_CurBlock[i].y*20,20,20,m_RasterColor,m_RasterColor);
}
}
void CDiamondDlg::GetScore()
{
int count;
int row=0; //计算消掉几行
char str[128];
for(int i=21;i>=0;i--) //从下至上判断
{
count=0;
for(int j=0;j<10;j++)
count+=m_Matrix[i][j][0];
if(count==10) //如果i行已经满
{
row++;
HighLightIt(i);
for(int k=i;k>0;k--) //从数据上删除
for(int w=0;w<10;w++)
{
m_Matrix[k][w][1]=m_Matrix[k-1][w][1];
m_Matrix[k][w][0]=m_Matrix[k-1][w][0];
}
for(int w=0;w<10;w++) { m_Matrix[0][w][0]=0; m_Matrix[0][w][1]=0; }
i++; //再判断该行一次
DrawAll();
m_Score+=(long)(50*sqrt(m_Level)); //增加分值
sprintf(str,"%d",m_Score);
m_ScoreCtrl.SetWindowText(str);
sprintf(str,"%d",m_Level);
m_LevelCtrl.SetWindowText(str);
}
}
if(row>1)
{
m_Score+=(long)(10*pow(2,(row-1))); //Get extra score
sprintf(str,"%d",m_Score);
m_ScoreCtrl.SetWindowText(str);
sprintf(str,"%d",m_Level);
m_LevelCtrl.SetWindowText(str);
}
m_Level=m_SettingLevel+(int)(m_Score/1000);
if(m_Level>10) m_Level=10;
SetTimer(1,600-50*m_Level,NULL);
sprintf(str,"%d",m_Score);
m_ScoreCtrl.SetWindowText(str);
sprintf(str,"%d",m_Level);
m_LevelCtrl.SetWindowText(str);
return;
}
void CDiamondDlg::HighLightIt(int Row)
{
//SetTimer(2,200,NULL);
CBrush Brush;
Brush.CreateSolidBrush(RGB(255,255,255));
CBrush* pOldBrush=m_pBlockDC->SelectObject(&Brush);
RECT rect;
for(int j=0;j<4;j++)
{
for(int i=0;i<10;i++)
{
rect.left=20*i;
rect.top=20*Row;
rect.right=rect.left;
rect.bottom=rect.top;
m_pBlockDC->FillRect(&rect,&Brush);
}
}
m_pBlockDC->SelectObject(pOldBrush);
}
void CDiamondDlg::DrawAll()
{
CDC MemDC;
MemDC.CreateCompatibleDC(m_pBlockDC);
CBrush Brush;
Brush.CreateSolidBrush(m_bkColor);
CBrush* pOldBrush=m_pBlockDC->SelectObject(&Brush);
RECT rect;
for(int i=0;i<22;i++)
for(int j=0;j<10;j++)
if(m_Matrix[i][j][0]==1)
{
MemDC.SelectObject(m_Bitmap+m_Matrix[i][j][1]);
m_pBlockDC->BitBlt(20*j+1,20*i+1,18,18,&MemDC,0,0,SRCCOPY);
m_pBlockDC->Draw3dRect(20*j,20*i,20,20,m_RasterColor,m_RasterColor);
}
else //没有的地方清除
{
rect.left=20*j;
rect.top=20*i;
rect.right=rect.left+20;
rect.bottom=rect.top+20;
m_pBlockDC->FillRect(&rect,&Brush);
if(m_bShowRaster==TRUE) m_pBlockDC->Draw3dRect(20*j,20*i,20,20,m_RasterColor,m_RasterColor);
}
m_pBlockDC->SelectObject(pOldBrush);
DrawNextBlock(m_Index);
}
void CDiamondDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
DropDown();
CDialog::OnTimer(nIDEvent);
}
void CDiamondDlg::DrawInitBlock()
{
m_CurBlock[0].y=m_CurBlock[1].y=m_CurBlock[2].y=m_CurBlock[3].y=0;
switch(m_Index)
{
case 1:
m_CurBlock[0].x=3;
m_CurBlock[1].x=4;
m_CurBlock[2].x=5;
m_CurBlock[3].x=6;
break;
case 2:
m_CurBlock[0].x=4;
m_CurBlock[1].x=5;
m_CurBlock[2].x=5;
m_CurBlock[2].y=1;
m_CurBlock[3].x=6;
m_CurBlock[3].y=1;
break;
case 3:
m_CurBlock[0].x=4;
m_CurBlock[0].y=1;
m_CurBlock[1].x=5;
m_CurBlock[1].y=1;
m_CurBlock[2].x=5;
m_CurBlock[3].x=6;
break;
case 4:
m_CurBlock[0].x=4;
m_CurBlock[1].x=5;
m_CurBlock[2].x=6;
m_CurBlock[3].x=5;
m_CurBlock[3].y=1;
break;
case 5:
m_CurBlock[0].x=4;
m_CurBlock[1].x=5;
m_CurBlock[2].x=4;
m_CurBlock[2].y=1;
m_CurBlock[3].x=5;
m_CurBlock[3].y=1;
break;
case 6:
m_CurBlock[0].x=4;
m_CurBlock[1].x=5;
m_CurBlock[2].x=6;
m_CurBlock[3].x=6;
m_CurBlock[3].y=1;
break;
case 7:
m_CurBlock[0].x=4;
m_CurBlock[1].x=5;
m_CurBlock[2].x=6;
m_CurBlock[3].x=4;
m_CurBlock[3].y=1;
break;
default:
break;
}
m_OldIndex=m_Index;
CTime Time;
int i=Time.GetCurrentTime().GetSecond()+1;
srand(i); //产生下一个方块
m_Index=rand()%8; //计算方块形状
if(m_Index==0) m_Index=1;
m_CurBlockMap=abs(rand()%12); //计算当前方块图案
DrawCurBlock();
DrawNextBlock(m_Index);
}
void CDiamondDlg::MoveLeft()
{
for(int i=0;i<4;i++) //如果已经到边
{
if(m_CurBlock[i].x==0) return;
if(m_CurBlock[i].x>0&&m_Matrix[m_CurBlock[i].y][m_CurBlock[i].x-1][0]==1) return; //如果左边已经有方块
}
EraseLastBlock();
for(i=0;i<4;i++)
m_CurBlock[i].x--;
DrawCurBlock();
}
void CDiamondDlg::EraseLastBlock()
{
RECT rect;
CBrush Brush;
Brush.CreateSolidBrush(m_bkColor);
CBrush* pOldBrush=m_pBlockDC->SelectObject(&Brush);
for(int i=0;i<4;i++) //擦掉前一次的
{
rect.left=20*m_CurBlock[i].x;
rect.top=20*m_CurBlock[i].y;
rect.right=rect.left+20;
rect.bottom=rect.top+20;
m_pBlockDC->FillRect(&rect,&Brush);
if(m_bShowRaster==TRUE) m_pBlockDC->Draw3dRect(rect.left-1,rect.top-1,20,20,m_RasterColor,m_RasterColor);
} //End of for
m_pBlockDC->SelectObject(pOldBrush);
return;
}
void CDiamondDlg::MoveRight()
{
for(int i=0;i<4;i++) //如果已经到边
{
if(m_CurBlock[i].x==9) return;
if(m_CurBlock[i].x<9&&m_Matrix[m_CurBlock[i].y][m_CurBlock[i].x+1][0]==1) return; //如果右边已经有方块
}
EraseLastBlock();
for(i=0;i<4;i++)
m_CurBlock[i].x++;
DrawCurBlock();
}
void CDiamondDlg::Rotation()
{
EraseLastBlock();
int count=0,i,j;
switch(m_OldIndex)
{
case 1:
//首先判断m_CurBlock[1]上下是否有连续的四个空位
i=m_CurBlock[1].y+1;
j=m_CurBlock[1].x;
count=0;
while(m_Matrix[i][j][0]==0) { count++; i++;} //向下搜索
i=m_CurBlock[1].y-1;
while(m_Matrix[i][j][0]==0) { count++; i--;} //向上搜索
if(count>=4) //以m_CurBlock[1]为中心逆时针旋转
{
//////////////////////////
m_CurBlock[0].x=m_CurBlock[1].x;
m_CurBlock[0].y=m_CurBlock[1].y+1;
m_CurBlock[2].x=m_CurBlock[1].x;
m_CurBlock[2].y=m_CurBlock[1].y-1;
m_CurBlock[3].x=m_CurBlock[1].x;
m_CurBlock[3].y=m_CurBlock[1].y-2;
while(m_CurBlock[3].y<0||m_Matrix[m_CurBlock[3].y][m_CurBlock[3].x][0]==1) //如果顶出边界或有BLOCK
for(i=0;i<4;i++) m_CurBlock[i].y++;
while(m_CurBlock[0].y>21||m_Matrix[m_CurBlock[0].y][m_CurBlock[0].x][0]==1) //如果底出边界或有BLOCK
for(i=0;i<4;i++) m_CurBlock[i].y--;
}
else //以m_CurBlock[2]为中心顺时针旋转
{
//首先判断m_CurBlock[1]上下是否有连续的四个空位
i=m_CurBlock[2].y+1;
j=m_CurBlock[2].x;
count=0;
while(m_Matrix[i][j][0]==0) { count++; i++;} //向下搜索
i=m_CurBlock[2].y-1;
while(m_Matrix[i][j][0]==0) { count++; i--;} //向上搜索
if(count<4) break;
//////////////////////////
m_CurBlock[3].x=m_CurBlock[2].x;
m_CurBlock[3].y=m_CurBlock[2].y+1;
m_CurBlock[1].x=m_CurBlock[2].x;
m_CurBlock[1].y=m_CurBlock[2].y-1;
m_CurBlock[0].x=m_CurBlock[2].x;
m_CurBlock[0].y=m_CurBlock[2].y-2;
while(m_CurBlock[0].y<0||m_Matrix[m_CurBlock[0].y][m_CurBlock[0].x][0]==1) //如果顶出边界或有BLOCK
for(int i=0;i<4;i++) m_CurBlock[i].y++;
while(m_CurBlock[3].y>21||m_Matrix[m_CurBlock[3].y][m_CurBlock[3].x][0]==1) //如果底出边界或有BLOCK
for(int i=0;i<4;i++) m_CurBlock[i].y--;
}
m_OldIndex=8;
break;
case 2:
//以m_CurBlock[1]为中心逆时针旋转
i=m_CurBlock[1].y;
j=m_CurBlock[1].x;
if(m_Matrix[i+1][j][0]+m_Matrix[i][j+1][0]+m_Matrix[i-1][j+1][0]==0) //如果有空位
{
m_CurBlock[0].x=j;
m_CurBlock[0].y=i+1;
m_CurBlock[2].x=j+1;
m_CurBlock[2].y=i;
m_CurBlock[3].x=j+1;
m_CurBlock[3].y=i-1;
}
else //以m_CurBlock[2]为中心逆时针旋转
{
i=m_CurBlock[2].y;
j=m_CurBlock[2].x;
if(m_Matrix[i+1][j-1][0]+m_Matrix[i][j-1][0]+m_Matrix[i-1][j][0]==0) //如果有空位
{
m_CurBlock[0].x=j-1;
m_CurBlock[0].y=i+1;
m_CurBlock[1].x=j-1;
m_CurBlock[1].y=i;
m_CurBlock[3].x=j;
m_CurBlock[3].y=i-1;
}
else break; //不能旋转
}
while(m_CurBlock[3].y<0)
{
m_CurBlock[0].y++;
m_CurBlock[1].y++;
m_CurBlock[2].y++;
m_CurBlock[3].y++;
}
m_OldIndex=9;
break;
case 3:
//先以m_CurBlock[1]为中心旋转
i=m_CurBlock[1].y;
j=m_CurBlock[1].x;
if(m_Matrix[i+1][j][0]+m_Matrix[i][j-1][0]+m_Matrix[i-1][j-1][0]==0) //如果有空位
{
m_CurBlock[0].x=j;
m_CurBlock[0].y=i+1;
m_CurBlock[2].x=j-1;
m_CurBlock[2].y=i;
m_CurBlock[3].x=j-1;
m_CurBlock[3].y=i-1;
}
else //先以m_CurBlock[2]为中心旋转
{
i=m_CurBlock[2].y;
j=m_CurBlock[2].x;
if(m_Matrix[i+1][j+1][0]+m_Matrix[i][j+1][0]+m_Matrix[i-1][j][0]==0) //如果有空位
{
m_CurBlock[0].x=j+1;
m_CurBlock[0].y=i+1;
m_CurBlock[1].x=j+1;
m_CurBlock[1].y=i;
m_CurBlock[3].x=j;
m_CurBlock[3].y=i-1;
}
else break; //不能旋转
}
while(m_CurBlock[0].y>21)
for(i=0;i<4;i++)
m_CurBlock[i].y--;
m_OldIndex=10;
break;
case 4:
i=m_CurBlock[1].y;
j=m_CurBlock[1].x;
if(m_Matrix[i+1][j][0]+m_Matrix[i-1][j][0]+m_Matrix[i][j+1][0]==0) //逆转成11
{
m_CurBlock[0].x=j;
m_CurBlock[0].y=i+1;
m_CurBlock[2].x=j;
m_CurBlock[2].y=i-1;
m_CurBlock[3].x=j+1;
m_CurBlock[3].y=i;
m_OldIndex=11;
}
else if(m_Matrix[i-1][j][0]+m_Matrix[i+1][j][0]+m_Matrix[i][j-1][0]==0) //顺转成13
{
m_CurBlock[0].x=j;
m_CurBlock[0].y=i-1;
m_CurBlock[2].x=j;
m_CurBlock[2].y=i+1;
m_CurBlock[3].x=j-1;
m_CurBlock[3].y=i;
m_OldIndex=13;
}
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -