📄 diamonds.c
字号:
#include "diamonds.h"void InitializeBlock(BLOCK BlockArray[ROWS][COLS]){ int i=0, j=0; for (i=0; i < ROWS; i++) { for (j=0; j < COLS; j++) { BlockArray[i][j].Flag_Is_Filled = FALSE; BlockArray[i][j].Flag_Is_Moveable = FALSE; BlockArray[i][j].BlockStyle = 0; } }}BOOL GameOver(BLOCK Block[ROWS][COLS]){ int i=0; 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);}void GenerateNewBlock(BLOCK BlockArray[ROWS][COLS]){ int i=0,j=0; srand((unsigned)time(NULL)); switch (rand()%7 ) { case 0: BlockArray[0][0].BlockStyle=0;BlockArray[0][0].Flag_Is_Filled=TRUE;BlockArray[0][0].Flag_Is_Moveable=TRUE; BlockArray[0][1].BlockStyle=0;BlockArray[0][1].Flag_Is_Filled=TRUE;BlockArray[0][1].Flag_Is_Moveable=TRUE; BlockArray[0][2].BlockStyle=0;BlockArray[0][2].Flag_Is_Filled=TRUE;BlockArray[0][2].Flag_Is_Moveable=TRUE; BlockArray[0][3].BlockStyle=0;BlockArray[0][3].Flag_Is_Filled=TRUE;BlockArray[0][3].Flag_Is_Moveable=TRUE; break; case 1: BlockArray[0][1].BlockStyle=1;BlockArray[0][1].Flag_Is_Filled=TRUE;BlockArray[0][1].Flag_Is_Moveable=TRUE; BlockArray[0][2].BlockStyle=1;BlockArray[0][2].Flag_Is_Filled=TRUE;BlockArray[0][2].Flag_Is_Moveable=TRUE; BlockArray[1][0].BlockStyle=1;BlockArray[1][0].Flag_Is_Filled=TRUE;BlockArray[1][0].Flag_Is_Moveable=TRUE; BlockArray[1][1].BlockStyle=1;BlockArray[1][1].Flag_Is_Filled=TRUE;BlockArray[1][1].Flag_Is_Moveable=TRUE; break; case 2: BlockArray[0][0].BlockStyle=2;BlockArray[0][0].Flag_Is_Filled=TRUE;BlockArray[0][0].Flag_Is_Moveable=TRUE; BlockArray[0][1].BlockStyle=2;BlockArray[0][1].Flag_Is_Filled=TRUE;BlockArray[0][1].Flag_Is_Moveable=TRUE; BlockArray[0][2].BlockStyle=2;BlockArray[0][2].Flag_Is_Filled=TRUE;BlockArray[0][2].Flag_Is_Moveable=TRUE; BlockArray[1][0].BlockStyle=2;BlockArray[1][0].Flag_Is_Filled=TRUE;BlockArray[1][0].Flag_Is_Moveable=TRUE; break; case 3: BlockArray[0][0].BlockStyle=3;BlockArray[0][0].Flag_Is_Filled=TRUE;BlockArray[0][0].Flag_Is_Moveable=TRUE; BlockArray[0][1].BlockStyle=3;BlockArray[0][1].Flag_Is_Filled=TRUE;BlockArray[0][1].Flag_Is_Moveable=TRUE; BlockArray[0][2].BlockStyle=3;BlockArray[0][2].Flag_Is_Filled=TRUE;BlockArray[0][2].Flag_Is_Moveable=TRUE; BlockArray[1][1].BlockStyle=3;BlockArray[1][1].Flag_Is_Filled=TRUE;BlockArray[1][1].Flag_Is_Moveable=TRUE; break; case 4: BlockArray[0][0].BlockStyle=4;BlockArray[0][0].Flag_Is_Filled=TRUE;BlockArray[0][0].Flag_Is_Moveable=TRUE; BlockArray[0][1].BlockStyle=4;BlockArray[0][1].Flag_Is_Filled=TRUE;BlockArray[0][1].Flag_Is_Moveable=TRUE; BlockArray[1][1].BlockStyle=4;BlockArray[1][1].Flag_Is_Filled=TRUE;BlockArray[1][1].Flag_Is_Moveable=TRUE; BlockArray[1][2].BlockStyle=4;BlockArray[1][2].Flag_Is_Filled=TRUE;BlockArray[1][2].Flag_Is_Moveable=TRUE; break; 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; } for(i=0; i<2; i++) for(j=0; j<COLS; j++) if(BlockArray[i][j].Flag_Is_Filled) DrawBlock(i,j,BlockArray[i][j].BlockStyle);}BOOL NeedGenerateNewBlock(BLOCK Block[ROWS][COLS]){ int i=0,j=0; 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);}void KillFullLine(BLOCK BlockArray[ROWS][COLS]){ int i=0, j=0, m=0, n=0, Flag=0; for(i=ROWS-1; i >= 4; i--) { Flag=TRUE; for(j=0;j<COLS;j++) if (BlockArray[i][j].Flag_Is_Filled == FALSE) Flag=FALSE; 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(m,n,BlockArray[m][n].BlockStyle); else EraseBlock(m,n); } } i++; } }}BOOL CanBlockMoveDown(BLOCK Block[ROWS][COLS]){ int i=0, j=0; 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=0, j=0; 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=0, j=0; 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 MoveBlockFromSrcToDes (BLOCK BlockArray[ROWS][COLS],int SrcRow, int SrcCol, int DesRow, int DesCol){ BlockArray[DesRow][DesCol].Flag_Is_Filled = BlockArray[SrcRow][SrcCol].Flag_Is_Filled; BlockArray[DesRow][DesCol].Flag_Is_Moveable = BlockArray[SrcRow][SrcCol].Flag_Is_Moveable; BlockArray[DesRow][DesCol].BlockStyle = BlockArray[SrcRow][SrcCol].BlockStyle; BlockArray[SrcRow][SrcCol].Flag_Is_Filled = FALSE; BlockArray[SrcRow][SrcCol].Flag_Is_Moveable = FALSE; BlockArray[SrcRow][SrcCol].BlockStyle = 0;}void MoveBlockFromPreviewToGameArea(BLOCK BlockArray[ROWS][COLS]){ int i=0, j=0; for (i=0; i < 2; i++) { for (j=0; j < COLS; j++) { if (BlockArray[i][j].Flag_Is_Filled == TRUE) { MoveBlockFromSrcToDes(BlockArray,i, j, i+2, j+3 ); DrawBlock(i+2, j+3, BlockArray[i+2][j+3 ].BlockStyle); EraseBlock(i, j); } } }}void MoveBlockDown(BLOCK Block[ROWS][COLS]){ int i=0, j=0; 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(i+1, j, Block[i+1][j].BlockStyle); EraseBlock(i, j); } } }}void MoveBlockRight(BLOCK BlockArray[ROWS][COLS]){ int i=0, j=0; 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(j, i+1, BlockArray[j][i+1].BlockStyle); EraseBlock(j, i); } } }}void MoveBlockLeft(BLOCK BlockArray[ROWS][COLS]){ int i=0, j=0; 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(j, i-1, BlockArray[j][i-1].BlockStyle); EraseBlock(j, i); } } }}void Moveable2Stable(BLOCK Block[ROWS][COLS]){ int i=0, j=0; 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 RefreshWindow(BLOCK BlockArray[ROWS][COLS]){ int i=0, j=0; DrawBackground(); for(i = 0;i < ROWS; i++) { for(j = 0; j < COLS; j++) { if(BlockArray[i][j].Flag_Is_Filled) DrawBlock(i, j, BlockArray[i][j].BlockStyle); } } }int JudgeBlockStyle(BLOCK BlockArray[ROWS][COLS]){ int style=0, i=0, j=0; 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 ChangeBlockStyleToGray(BLOCK BlockArray[ROWS][COLS]){ int i=0, j=0; for(i = ROWS-1;i >= 2;i--) { for(j = 0; j <= COLS - 1; j++) { if(BlockArray[i][j].Flag_Is_Filled) BlockArray[i][j].BlockStyle = 7; } } for(i = 2;i <= 3; i ++) { for(j = 0;j <= COLS - 1;j ++) { BlockArray[i][j].Flag_Is_Filled = FALSE; } }}void RotateStyleZero(BLOCK BlockArray[ROWS][COLS]){ int i=0, j=0, m=0, n=0; 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(i-1, j+1, 0); EraseBlock(i, j); MoveBlockFromSrcToDes(BlockArray, i, j+2, i+1, j+1); DrawBlock(i+1, j+1, 0); EraseBlock(i, j+2); MoveBlockFromSrcToDes(BlockArray, i, j+3, i+2, j+1); DrawBlock(i+2, j+1, 0); EraseBlock(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(i+1, j-1, 0); EraseBlock(i, j); MoveBlockFromSrcToDes(BlockArray, i+2, j, i+1, j+1); DrawBlock(i+1, j+1, 0); EraseBlock(i+2, j); MoveBlockFromSrcToDes(BlockArray, i+3 , j, i+1, j+2); DrawBlock(i+1, j+2, 0); EraseBlock(i+3, j); } }}void RotateStyleOne(BLOCK BlockArray[ROWS][COLS]){ int i=0, j=0, m=0; 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(i-1, j, 1); EraseBlock(i+1, j); MoveBlockFromSrcToDes(BlockArray, i+1, j-1, i+1, j+1); DrawBlock(i+1, j+1, 1); EraseBlock(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(i+2, j, 1); EraseBlock(i, j); MoveBlockFromSrcToDes(BlockArray, i+2, j+1, i+2, j--); DrawBlock(i+2, j-1, 1); EraseBlock(i+2, j+1); } }}void RotateStyleTwo(BLOCK BlockArray[ROWS][COLS]){ int i=0, j=0, m=0; 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 ) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -