📄 terris.cpp
字号:
case 5:
BlockArray[0][0].BlockStyle=5;BlockArray[0][0].Flag_Is_Filled=TRUE;BlockArray[0][0].Flag_Is_Moveable=TRUE;
BlockArray[0][1].BlockStyle=5;BlockArray[0][1].Flag_Is_Filled=TRUE;BlockArray[0][1].Flag_Is_Moveable=TRUE;
BlockArray[1][0].BlockStyle=5;BlockArray[1][0].Flag_Is_Filled=TRUE;BlockArray[1][0].Flag_Is_Moveable=TRUE;
BlockArray[1][1].BlockStyle=5;BlockArray[1][1].Flag_Is_Filled=TRUE;BlockArray[1][1].Flag_Is_Moveable=TRUE;
break;
case 6:
BlockArray[0][0].BlockStyle=6;BlockArray[0][0].Flag_Is_Filled=TRUE;BlockArray[0][0].Flag_Is_Moveable=TRUE;
BlockArray[0][1].BlockStyle=6;BlockArray[0][1].Flag_Is_Filled=TRUE;BlockArray[0][1].Flag_Is_Moveable=TRUE;
BlockArray[0][2].BlockStyle=6;BlockArray[0][2].Flag_Is_Filled=TRUE;BlockArray[0][2].Flag_Is_Moveable=TRUE;
BlockArray[1][2].BlockStyle=6;BlockArray[1][2].Flag_Is_Filled=TRUE;BlockArray[1][2].Flag_Is_Moveable=TRUE;
break;
}
hdc=GetDC(hwnd);
for(i=0;i<2;i++)
for(j=0;j<COLS;j++)
if(BlockArray[i][j].Flag_Is_Filled)
DrawBlock(hdc,i,j,BlockArray[i][j].BlockStyle);
ReleaseDC(hwnd,hdc);
}
BOOL GameOver(BLOCK Block[ROWS][COLS])
{
int i;
BOOL Flag=FALSE;
for(i=0;i<COLS;i++)
if (Block[4][i].Flag_Is_Moveable==FALSE && Block[4][i].Flag_Is_Filled==TRUE)
Flag=TRUE;
return (Flag);
}
BOOL NeedGenerateNewBlock(BLOCK Block[ROWS][COLS])
{
int i,j;
BOOL Flag=TRUE;
for(i = 2;i < ROWS ;i ++)
for(j = 0;j < COLS; j ++)
if (Block[i][j].Flag_Is_Moveable==TRUE)
Flag=FALSE;
return (Flag);
}
BOOL CanBlockMoveDown(BLOCK Block[ROWS][COLS])
{
int i,j;
int Flag=TRUE;
for(i = 2; i < ROWS; i++)
for(j = 0; j < COLS; j++)
{
if (Block[i][j].Flag_Is_Moveable==TRUE)
{
if (i==ROWS-1)
Flag=FALSE;
if(Block[i+1][j].Flag_Is_Filled==TRUE && Block[i+1][j].Flag_Is_Moveable==FALSE)
Flag=FALSE;
}
}
return (Flag);
}
BOOL CanBlockMoveRight(BLOCK BlockArray[ROWS][COLS])
{
int i,j;
int Flag=TRUE;
for(i = 2 ;i < ROWS; i ++)
for(j = 0 ; j < COLS; j ++)
{
if (BlockArray[i][j].Flag_Is_Moveable==TRUE)
{
if (j==COLS-1)
Flag=FALSE;
if(BlockArray[i][j+1].Flag_Is_Filled==TRUE && BlockArray[i][j+1].Flag_Is_Moveable==FALSE)
Flag=FALSE;
}
}
return (Flag);
}
BOOL CanBlockMoveLeft(BLOCK BlockArray[ROWS][COLS])
{
int i,j;
int Flag=TRUE;
for(i = 2; i < ROWS; i ++)
for(j = 0;j <COLS ;j ++)
{
if (BlockArray[i][j].Flag_Is_Moveable==TRUE)
{
if (j==0)
Flag=FALSE;
if(BlockArray[i][j-1].Flag_Is_Filled==TRUE && BlockArray[i][j-1].Flag_Is_Moveable==FALSE)
Flag=FALSE;
}
}
return (Flag);
}
void Moveable2Stable(BLOCK Block[ROWS][COLS])
{
int i,j;
for(i = 2; i < ROWS; i++)
for(j = 0;j < COLS; j++)
if (Block[i][j].Flag_Is_Filled==TRUE)
Block[i][j].Flag_Is_Moveable=FALSE;
}
void KillFullLine(HWND hwnd,BLOCK BlockArray[ROWS][COLS])
{
HDC hdc;
int i,j; int m,n;
int Flag;
hdc=GetDC(hwnd);
for(i=ROWS-1;i >= 4;i--) //由游戏区的最下面一行从下至上扫描至游戏区的最上面一行
{
Flag=TRUE; //Flag的默认值为真,即假定所扫描的每一行都是可以消去的
for(j=0;j<COLS;j++)
if (BlockArray[i][j].Flag_Is_Filled == FALSE) //一旦发现某一个方块没有填满
Flag=FALSE; //Flag就赋值为假.也就是说这一行是不能消去的.
if(Flag==TRUE)
{
for(m=i;m >= 4;m--) //从这个可以消去的行开始,每一行的上面的一行方块由下往上全部向下移动一行
for(n=0;n<COLS;n++) //也就是每一行都被它上面的一行覆盖了.
{ //最终结果就是将当前行消去了.
MoveBlockFromSrcToDes(BlockArray,m - 1, n, m, n);//先将每一行的上面一行一个方块一个方块向下移动
if(BlockArray[m][n].Flag_Is_Filled==TRUE) //移动后,如果这个方块是被填充了的则把这个方块画出来
DrawBlock(hdc,m,n,BlockArray[m][n].BlockStyle);
else
EraseBlock(hdc,m,n); //没有填充的则要将它涂掉
}
i++; //当前这行消去之后,它上面的行落到了它的位置.而这一行有可能也是可以消去的.
//所以需要对当前行再一次进行判断,因此i的值不能改变.
}
}
ReleaseDC(hwnd,hdc);
}
void MoveBlockDown(HWND hwnd,BLOCK Block[ROWS][COLS])
{
int i,j;
HDC hdc;
hdc=GetDC(hwnd);
/*请注意扫描的方向只能是最下面一行由下往上开始扫描,原因在于积木是向下方移动的. */
/*先必须将下面的位置腾出来,再移上面的. */
/*所以只能先将下面的方块向下移,而不能先将上面的方块向下移. */
/*如果先移上面的方块的话,下面的可移动的方块就有可能会被覆盖,产生错误. */
/*如下面的情况
@
@ @
@
如果从上往下移次往下移的话,最终移动的结果就是 @ @ */
for(i = ROWS-1;i >= 2;i--)
for(j=0;j<COLS;j++)
if (Block[i][j].Flag_Is_Moveable==TRUE)
{
MoveBlockFromSrcToDes(Block,i,j,i+1,j);
DrawBlock(hdc,i+1,j,Block[i+1][j].BlockStyle);
EraseBlock(hdc,i,j);
}
ReleaseDC(hwnd,hdc);
}
void MoveBlockRight(HWND hwnd, BLOCK BlockArray[ROWS][COLS])
{
int i,j;
HDC hdc;
hdc=GetDC(hwnd);
/*请注意扫描的方向只能由右往左开始扫描,原因在于积木是向右边移动的. */
/*先必须将右边的位置腾出来,再移左边的. */
/*所以只能先将右边的方块向右移,而不能先将左边的方块向右移. */
/*如果先移左边的方块的话,右边的可移动的方块就有可能会被覆盖,产生错误. */
/*如下面的情况
@ @ @ @
如果从左往右移次往右移的话,最终移动的结果就是
@ */
for(i = COLS-1 ;i >= 0; i--)
for(j = 2;j < ROWS; j++)
{
if (BlockArray[j][i].Flag_Is_Moveable==TRUE)
{
MoveBlockFromSrcToDes(BlockArray,j,i,j,i+1);
DrawBlock(hdc,j,i+1,BlockArray[j][i+1].BlockStyle);
EraseBlock(hdc,j,i);
}
}
ReleaseDC(hwnd,hdc);
}
void MoveBlockLeft(HWND hwnd,BLOCK BlockArray[ROWS][COLS])
{
int i,j;
HDC hdc;
hdc=GetDC(hwnd);
/*请注意扫描的方向只能由左往右开始扫描,原因在于积木是向左边移动的. */
/*先必须将左边的位置腾出来,再移右边的. */
/*所以只能先将左边的方块向左移,而不能先将右边的方块向左移. */
/*如果先移右边的方块的话,左边的可移动的方块就有可能会被覆盖,产生错误. */
/*如下面的情况
@ @ @ @
如果从右往左移次往左移的话,最终移动的结果就是
@ */
for(i = 0 ;i < COLS; i++)
for(j = 2;j < ROWS; j++)
{
if (BlockArray[j][i].Flag_Is_Moveable==TRUE)
{
MoveBlockFromSrcToDes(BlockArray,j,i,j,i-1);
DrawBlock(hdc,j,i-1,BlockArray[j][i-1].BlockStyle);
EraseBlock(hdc,j,i);
}
}
ReleaseDC(hwnd,hdc);
}
int JudgeBlockStyle(BLOCK BlockArray[ROWS][COLS])
{
int style;
int i,j;
for(i = 2; i < ROWS ; i++)
{
for(j = 0; j < COLS; j++)
if(BlockArray[i][j].Flag_Is_Moveable==TRUE)
{
style=BlockArray[i][j].BlockStyle;
break;
}
if (j < COLS) break;
}
return (style);
}
void RotateStyleZero(HWND hwnd,BLOCK BlockArray[ROWS][COLS])
{
int i,j;
int m,n;
HDC hdc;
hdc=GetDC(hwnd);
/* 这一段for循环的代码是用来寻找当前移动的积木最左上角的那个方块所对应的矩阵中的位置 */
for(i = 2 ; i < ROWS ; i++)
{
for(j = 0 ;j < COLS ;j++)
{
if (BlockArray[i][j].Flag_Is_Moveable == TRUE)
break;;
}
if ( j < COLS ) break;
}
/* @ @ @ @ */
if(BlockArray[i][j + 1].Flag_Is_Moveable == TRUE)
{
/* 判定是否可以旋转积木 */
if (i == 2)
return;
if (i >= ROWS -2)
return ;
if (BlockArray[i-1][j].Flag_Is_Filled==TRUE || BlockArray[i-1][j+1].Flag_Is_Filled==TRUE)
return ;
for(m= i + 1 ;m <= i + 2 ; m++)
{
for (n = j + 1; n <= j + 3; n++ )
{
if ( BlockArray[m][n].Flag_Is_Filled == TRUE )
return ;
}
}
/* 可以则旋转积木,同时更新画面 */
{
MoveBlockFromSrcToDes(BlockArray, i, j, i - 1,j + 1);
DrawBlock(hdc,i-1,j+1,0);
EraseBlock(hdc,i,j);
MoveBlockFromSrcToDes(BlockArray,i,j + 2,i + 1,j + 1);
DrawBlock(hdc,i + 1, j + 1,0);
EraseBlock(hdc,i,j + 2);
MoveBlockFromSrcToDes(BlockArray, i,j + 3, i + 2,j + 1);
DrawBlock(hdc,i + 2, j + 1,0);
EraseBlock(hdc,i,j + 3);
}
}
/*
@
@
@
@
*/
else
{
/* 判定是否可以旋转积木 */
if (j >= COLS - 2)
return ;
if (j == 0)
return ;
if (BlockArray[i][j-1].Flag_Is_Filled==TRUE || BlockArray[i+1][j-1].Flag_Is_Filled==TRUE)
return ;
for(m= i + 1 ;m <= i + 3 ; m++)
{
for (n = j + 1; n <= j + 2; n++ )
{
if ( BlockArray[m][n].Flag_Is_Filled == TRUE )
return ;
}
}
/* 可以则旋转积木,同时更新画面 */
{
MoveBlockFromSrcToDes(BlockArray, i, j, i + 1,j - 1);
DrawBlock(hdc,i + 1,j - 1,0);
EraseBlock(hdc,i,j);
MoveBlockFromSrcToDes(BlockArray,i + 2,j ,i + 1,j + 1);
DrawBlock(hdc,i + 1, j + 1,0);
EraseBlock(hdc,i + 2, j );
MoveBlockFromSrcToDes(BlockArray, i + 3 , j , i + 1,j + 2);
DrawBlock( hdc, i + 1, j + 2,0);
EraseBlock( hdc , i + 3, j );
}
}
ReleaseDC(hwnd,hdc);
}
void RotateStyleOne(HWND hwnd,BLOCK BlockArray[ROWS][COLS])
{
int i, j;
int m ;
HDC hdc;
hdc=GetDC(hwnd);
/* 这一段for循环的代码是用来寻找当前移动积木的最左上角的那个方块所对应的矩阵中的的位置 */
for(i = 2 ; i < ROWS ; i++)
{
for(j = 0 ;j < COLS ;j++)
{
if (BlockArray[i][j].Flag_Is_Moveable == TRUE)
break;
}
if ( j < COLS )
break;
}
/* @ @
@ @ */ /* 当前积木所处的形态 */
if ( BlockArray[i][j + 1].Flag_Is_Moveable == TRUE )
{
if( i == 2)
return;
if( i >= ROWS - 2)
return;
if( BlockArray[i - 1][ j ].Flag_Is_Filled == TRUE) return;
if( BlockArray[i - 1][j + 1].Flag_Is_Filled == TRUE) return;
if( BlockArray[i + 1][j + 1].Flag_Is_Filled == TRUE ) return;
for(m = j -1 ; m <= j + 1; m++)
if (BlockArray[i + 2][ m ].Flag_Is_Filled == TRUE )
return;
{
MoveBlockFromSrcToDes(BlockArray, i + 1, j ,i -1,j);
DrawBlock(hdc, i - 1, j, 1);
EraseBlock(hdc,i + 1, j );
MoveBlockFromSrcToDes(BlockArray, i + 1, j - 1, i + 1,j + 1);
DrawBlock(hdc, i + 1, j + 1, 1);
EraseBlock(hdc,i + 1, j - 1);
}
}
/* @
@ @
@ */ /* 当前积木所处的形态 */
else
{
if ( i >= ROWS -3)
return;
if ( j < 1 )
return;
if ( BlockArray[ i ][j + 1].Flag_Is_Filled == TRUE) return;
if ( BlockArray[i + 2][ j ].Flag_Is_Filled == TRUE) return;
if ( BlockArray[i + 2][j - 1].Flag_Is_Filled == TRUE) return;
for(m = j ; m <= j + 1; m ++)
if (BlockArray[i + 3][ m ].Flag_Is_Filled == TRUE )
return;
{
MoveBlockFromSrcToDes(BlockArray, i, j, i + 2, j);
DrawBlock(hdc, i + 2, j, 1);
EraseBlock(hdc, i, j);
MoveBlockFromSrcToDes(BlockArray, i + 2, j + 1, i + 2, j - 1);
DrawBlock(hdc, i + 2,j - 1,1);
EraseBlock(hdc,i + 2,j + 1);
}
}
ReleaseDC(hwnd,hdc);
}
void RotateStyleTwo(HWND hwnd,BLOCK BlockArray[ROWS][COLS])
{
int i, j;
int m ;
HDC hdc;
hdc=GetDC(hwnd);
/* 这一段for循环的代码是用来寻找当前移动积木的最左上角的那个方块所对应的矩阵中的的位置 */
for(i = 2 ; i < ROWS ; i++)
{
for(j = 0 ;j < COLS ;j++)
{
if (BlockArray[i][j].Flag_Is_Moveable == TRUE)
break;
}
if (j < COLS)
break;
}
/* @ @ @
@ */ /*当前积木所处的形态*/
if( BlockArray[i][j + 1].Flag_Is_Moveable == TRUE && \
BlockArray[i + 1][j].Flag_Is_Moveable == TRUE )
{
if ( i == 2 ) return; // 叛定积木是不是在最上面一行
if ( BlockArray[i + 1][j + 1].Flag_Is_Filled == TRUE)
return;
if ( BlockArray[i - 1][j + 1].Flag_Is_Filled == TRUE || \
BlockArray[i - 1][j + 2].Flag_Is_Filled == TRUE)
return;
if ( BlockArray[i + 1][j + 1].Flag_Is_Filled == TRUE ||
BlockArray[i + 1][j + 2].Flag_Is_Filled == TRUE)
return;
{
MoveBlockFromSrcToDes(BlockArray, i, j, i + 1, j + 1);
DrawBlock(hdc, i + 1, j + 1, 2);
EraseBlock(hdc, i, j);
MoveBlockFromSrcToDes(BlockArray, i, j + 2, i - 1, j + 1);
DrawBlock(hdc, i - 1, j + 1, 2);
EraseBlock(hdc, i, j + 2);
MoveBlockFromSrcToDes(BlockArray, i + 1, j, i + 1, j + 2);
DrawBlock(hdc, i + 1, j + 2, 2);
EraseBlock(hdc, i + 1, j );
}
ReleaseDC(hwnd,hdc);
return ;
}
/* @
@
@ @ */ /*当前积木所处的形态*/
if ( BlockArray[i + 1][ j ].Flag_Is_Moveable == TRUE && \
BlockArray[i + 2][ j ].Flag_Is_Moveable == TRUE)
{
if ( j == 0 ) return;
if ( BlockArray[ i ][j - 1].Flag_Is_Filled == TRUE || \
BlockArray[i + 1][j - 1].Flag_Is_Filled == TRUE )
return;
if ( BlockArray[i + 3][ j ].Flag_Is_Filled == TRUE || \
BlockArray[i + 1][j + 1].Flag_Is_Filled == TRUE )
return;
if ( BlockArray[ i ][j + 1].Flag_Is_Filled == TRUE)
return;
for(m = i; m < i + 3; m ++)
if( BlockArray[ m ][j + 2].Flag_Is_Filled == TRUE)
return;
{
MoveBlockFromSrcToDes(BlockArray, i, j, i + 1, j - 1);
DrawBlock(hdc, i + 1, j - 1, 2);
EraseBlock(hdc, i, j);
MoveBlockFromSrcToDes(BlockArray, i + 2, j, i + 1, j + 1);
DrawBlock (hdc, i + 1, j + 1, 2);
EraseBlock(hdc, i + 2, j);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -