📄 diamonds.c
字号:
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(i+1, j+1, 2); EraseBlock(i, j); MoveBlockFromSrcToDes(BlockArray, i, j+2, i-1, j+1); DrawBlock(i-1, j+1, 2); EraseBlock(i, j+2); MoveBlockFromSrcToDes(BlockArray, i+1, j, i+1, j+2); DrawBlock(i+1, j+2, 2); EraseBlock(i+1, j ); } 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(i+1, j-1, 2); EraseBlock(i, j); MoveBlockFromSrcToDes(BlockArray, i+2, j, i+1, j+1); DrawBlock(i+1, j+1, 2); EraseBlock(i+2, j); MoveBlockFromSrcToDes(BlockArray, i+2, j+1, i, j+1); DrawBlock(i, j+1, 2); EraseBlock(i+2, j+1); } return ; } if ( BlockArray[i+1][j-1].Flag_Is_Moveable == TRUE ) { if(i == ROWS-2) return ; if(BlockArray[i][j-1].Flag_Is_Filled == TRUE || BlockArray[i][j-2].Flag_Is_Filled == TRUE) return; if(BlockArray[i+2][j-1].Flag_Is_Filled == TRUE || BlockArray[i+2][j-2].Flag_Is_Filled == TRUE) return; if(BlockArray[i][j-1].Flag_Is_Filled == TRUE) return; { MoveBlockFromSrcToDes(BlockArray, i, j, i, j-2); DrawBlock(i, j-2, 2); EraseBlock(i, j); MoveBlockFromSrcToDes(BlockArray, i+1, j, i, j-1); DrawBlock(i, j-1, 2); EraseBlock(i+1, j); MoveBlockFromSrcToDes(BlockArray, i+1, j-2, i+2, j-1); DrawBlock(i+2, j-1, 2); EraseBlock(i+1, j-2); } return ; } if (BlockArray[i][j+1].Flag_Is_Moveable == TRUE && BlockArray[i+1][j+1].Flag_Is_Moveable == TRUE) { if(j == COLS - 2) return; if(BlockArray[i+1][j].Flag_Is_Filled == TRUE || BlockArray[i+2][j].Flag_Is_Filled == TRUE) return; if(BlockArray[i+1][j+2].Flag_Is_Filled == TRUE || BlockArray[i+2][j+2].Flag_Is_Filled == TRUE) return; { MoveBlockFromSrcToDes(BlockArray, i, j, i+2, j); DrawBlock(i+2, j, 2); EraseBlock(i, j); MoveBlockFromSrcToDes(BlockArray, i, j+1, i+1, j); DrawBlock(i+1, j, 2); EraseBlock(i, j+1); MoveBlockFromSrcToDes(BlockArray,i + 2, j+1, i+1, j+2); DrawBlock(i+1, j+2, 2); EraseBlock(i+2, j+1); } return; } }void RotateStyleThree(BLOCK BlockArray[ROWS][COLS]){ int i=0, j=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][j+2].Flag_Is_Moveable == TRUE) { if (i == 2) return; if (BlockArray[i+1][j].Flag_Is_Filled == TRUE) return; if (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(i-1, j+1, 3); EraseBlock(i, j); } return ; } if (BlockArray[i+1][j+1].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+2][j+1].Flag_Is_Filled == TRUE ) return; if (BlockArray[i][j+1].Flag_Is_Filled == TRUE) return; { MoveBlockFromSrcToDes(BlockArray, i+2, j, i+1, j-1); DrawBlock(i+1, j-1, 3); EraseBlock(i+2, j); } return ; } if (BlockArray[i+1][j-1].Flag_Is_Moveable == TRUE && BlockArray[i+1][j+1].Flag_Is_Moveable == TRUE) { if(i == ROWS-2) return ; if(BlockArray[i][j-1].Flag_Is_Filled == TRUE ) return; if(BlockArray[i+2][j].Flag_Is_Filled == TRUE || BlockArray[i+2][j-1].Flag_Is_Filled == TRUE) return; if(BlockArray[i][j+1].Flag_Is_Filled == TRUE) return; { MoveBlockFromSrcToDes(BlockArray, i+1, j+1, i+2, j); DrawBlock(i+2, j, 3); EraseBlock(i+1, j+1); } return ; } if (BlockArray[i+2][j].Flag_Is_Moveable == TRUE && BlockArray[i+1][j-1].Flag_Is_Moveable == TRUE) { if(j == COLS-1) return ; if(BlockArray[i][j-1].Flag_Is_Filled == TRUE) return; if(BlockArray[i+2][j-1].Flag_Is_Filled == TRUE) return; if(BlockArray[i+1][j+1].Flag_Is_Filled == TRUE || BlockArray[i+2][j+1].Flag_Is_Filled == TRUE) return; { MoveBlockFromSrcToDes(BlockArray, i, j, i+1, j+1); DrawBlock(i+1, j+1, 3); EraseBlock(i, j); } return; }}void RotateStyleFour(BLOCK BlockArray[ROWS][COLS]){ int i=0, j=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(BlockArray[i+1][j].Flag_Is_Filled == TRUE) return; if(BlockArray[i][j+2].Flag_Is_Filled == TRUE) return; if(BlockArray[i-1][j+2].Flag_Is_Filled == TRUE) return; { MoveBlockFromSrcToDes(BlockArray, i, j ,i, j+2); DrawBlock(i, j+2, 4); EraseBlock(i, j ); MoveBlockFromSrcToDes(BlockArray, i+1, j+2, i-1, j+2); DrawBlock(i-1, j+2, 4); EraseBlock(i+1, j+2); } } else { if (j == 1) return; if (BlockArray[i+2][j].Flag_Is_Filled == TRUE) return; if (BlockArray[i+2][j-2].Flag_Is_Filled == TRUE || BlockArray[i+1][j-2].Flag_Is_Filled == TRUE) return; { MoveBlockFromSrcToDes(BlockArray, i, j, i+2, j); DrawBlock(i+2, j, 4); EraseBlock(i, j); MoveBlockFromSrcToDes(BlockArray, i+1, j, i+1, j-2); DrawBlock(i+1, j-2, 4); EraseBlock(i+1, j); } }}void RotateStyleSix(BLOCK BlockArray[ROWS][COLS]){ int i=0, j=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][j+2].Flag_Is_Moveable == TRUE ) { if (i == 2) return; if (BlockArray[i+1][j].Flag_Is_Filled == TRUE || 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; { MoveBlockFromSrcToDes(BlockArray, i, j, i+1, j+1); DrawBlock(i+1, j+1, 6); EraseBlock(i, j); MoveBlockFromSrcToDes(BlockArray, i, j+2, i-1, j+1); DrawBlock(i-1, j+1, 6); EraseBlock(i, j+2); MoveBlockFromSrcToDes(BlockArray, i+1, j+2, i-1, j+2); DrawBlock(i-1, j+2, 6); EraseBlock(i+1, j+2); } return ; } if ( BlockArray[i+1][j].Flag_Is_Moveable == TRUE && BlockArray[i][j+1].Flag_Is_Moveable == TRUE) { if (i == 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; if (BlockArray[i][j-1].Flag_Is_Filled == TRUE) return; if (BlockArray[i+1][j+1].Flag_Is_Filled == TRUE || BlockArray[i+2][j+1].Flag_Is_Filled == TRUE) return; { MoveBlockFromSrcToDes(BlockArray, i, j, i+1, j-1); DrawBlock(i+1, j-1, 6); EraseBlock(i, j); MoveBlockFromSrcToDes(BlockArray, i, j+1, i, j-1); DrawBlock (i, j-1, 6); EraseBlock(i, j+1); MoveBlockFromSrcToDes(BlockArray, i+2, j , i+1, j+1); DrawBlock(i+1, j+1, 6); EraseBlock(i+2, j); } return ; } if ( BlockArray[i+1][j].Flag_Is_Moveable == TRUE && BlockArray[i+1][j+1].Flag_Is_Moveable == TRUE) { if(i == ROWS-2) return ; if(BlockArray[i+2][j].Flag_Is_Filled == TRUE) return; if(BlockArray[i+2][j].Flag_Is_Filled == TRUE || BlockArray[i+2][j+1].Flag_Is_Filled == TRUE) return; if(BlockArray[i][j+1].Flag_Is_Filled == TRUE || BlockArray[i][j+2].Flag_Is_Filled == TRUE) return; { MoveBlockFromSrcToDes(BlockArray, i, j, i+2, j); DrawBlock(i+2, j, 6); EraseBlock(i, j); MoveBlockFromSrcToDes(BlockArray, i+1, j, i+2, j+1); DrawBlock(i+2, j+1, 6); EraseBlock(i+1, j); MoveBlockFromSrcToDes(BlockArray, i+1, j+2, i , j+1); DrawBlock(i, j+1, 6); EraseBlock(i+1, j+2); } return ; } if ( BlockArray[i+1][j].Flag_Is_Moveable == TRUE && BlockArray[i+2][j-1].Flag_Is_Moveable == TRUE) { if(j == COLS-1) return ; if(BlockArray[i][j-1].Flag_Is_Filled == TRUE || BlockArray[i+1][j-1].Flag_Is_Filled == TRUE ) return; if(BlockArray[i+2][j+1].Flag_Is_Filled == TRUE) return; if(BlockArray[i+2][j+1].Flag_Is_Filled == TRUE || BlockArray[i+1][j+1].Flag_Is_Filled == TRUE) return; { MoveBlockFromSrcToDes(BlockArray, i, j, i+1, j-1); DrawBlock(i+1, j-1, 6); EraseBlock(i, j); MoveBlockFromSrcToDes(BlockArray, i+2, j-1, i+2, j+1); DrawBlock(i+2, j+1, 6); EraseBlock(i+2, j-1); MoveBlockFromSrcToDes(BlockArray, i+2, j, i+1, j+1); DrawBlock(i+1, j+1, 6); EraseBlock(i+2, j); } return; }}void DrawBackground(){ fb_draw_rect(BG_COLOR, x_offset, y_offset, BLOCKSIZE*COLS+LINE_WIDTH*2+OriginXPos*2, BLOCKSIZE*ROWS+LINE_WIDTH*2); fb_draw_horizontal_line(LINE_COLOR, x_offset+OriginXPos, y_offset+BLOCKSIZE*ROWS, BLOCKSIZE*COLS+LINE_WIDTH*2, LINE_WIDTH); fb_draw_vertical_line(LINE_COLOR, x_offset+OriginXPos, y_offset, BLOCKSIZE*ROWS, LINE_WIDTH); fb_draw_vertical_line(LINE_COLOR, x_offset+OriginXPos+LINE_WIDTH+BLOCKSIZE*COLS, y_offset, BLOCKSIZE*ROWS, LINE_WIDTH);}void DrawBlock(int row,int column,int BlockStyle){ int x=0, y=0; x = x_offset + OriginXPos + LINE_WIDTH + column* BLOCKSIZE; y = y_offset + row* BLOCKSIZE; fb_draw_rect(ITEM_COLOR, x, y, BLOCKSIZE-1, BLOCKSIZE-1);}void EraseBlock(int row,int column){ int x=0, y=0; x = x_offset + OriginXPos + LINE_WIDTH + column* BLOCKSIZE; y = y_offset + row* BLOCKSIZE; fb_draw_rect(BG_COLOR, x, y, BLOCKSIZE, BLOCKSIZE); }void Init_GameTimer(){ struct timeval tm; memset(&GameTimer, 0x00, sizeof(GAME_TIMER)); gettimeofday(&tm, NULL); GameTimer.old_second = tm.tv_sec; GameTimer.old_msecond = tm.tv_usec; GameTimer.curent_second = tm.tv_sec; GameTimer.curent_msecond = tm.tv_usec;}unsigned long Game_Interval(){ unsigned long ilong=0; struct timeval tm; gettimeofday(&tm, NULL); GameTimer.curent_second = tm.tv_sec; GameTimer.curent_msecond = tm.tv_usec; ilong = (1000000*(tm.tv_sec - GameTimer.old_second) + (tm.tv_usec - GameTimer.old_msecond))/1000; return ilong;}void move_down(){ if(NeedGenerateNewBlock(BlockArray)) { KillFullLine(BlockArray); if(GameOver(BlockArray)) { ChangeBlockStyleToGray(BlockArray); RefreshWindow(BlockArray); } else { MoveBlockFromPreviewToGameArea(BlockArray); GenerateNewBlock(BlockArray); } } else { if (CanBlockMoveDown(BlockArray)) MoveBlockDown(BlockArray); else Moveable2Stable(BlockArray); }}void move_left(){ if(CanBlockMoveLeft(BlockArray)) MoveBlockLeft(BlockArray);}void move_right(){ if(CanBlockMoveRight(BlockArray)) MoveBlockRight(BlockArray);}void Item_rotate(){ switch(JudgeBlockStyle(BlockArray)) { case 0: RotateStyleZero(BlockArray); break; case 1: RotateStyleOne(BlockArray); break; case 2: RotateStyleTwo(BlockArray); break; case 3: RotateStyleThree(BlockArray); break; case 4: RotateStyleFour(BlockArray); break; case 5: break; case 6: RotateStyleSix(BlockArray); break; }}int main(){ unsigned long lInterval=0; fb_mmap_buffer(); DrawBackground(); InitializeBlock(BlockArray); RefreshWindow(BlockArray); Init_GameTimer(); while (1) { lInterval = Game_Interval(); if (lInterval > 1000) { move_down(BlockArray); GameTimer.old_second = GameTimer.curent_second; GameTimer.old_msecond = GameTimer.curent_msecond; } else continue; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -