📄 game.c
字号:
BYTE i,j;
Game_get_matrix(nblock);
for(i=0;i<3;i++)
for(j=0;j<3;j++)
{
if(TempMatrix[i][j]==0)
{
BOOL Flag_1=FALSE;
if(Game_gridMatrix[nblock.x+i][nblock.y+j]==1)
Flag_1=TRUE;
if(Flag_1)
return TRUE;
}
}
return FALSE;
}
void Game_ini_grid(void)
{
BYTE i,j;
for(i=0;i<MaxColume;i++)
for(j=0;j<MaxLine;j++)
{
Game_gridMatrix[i][j]=0;
}
}
void Game_draw_grid(Gameblock drblock)
{
BYTE i,j;
Osd_SetTextColor(drblock.color, CP_BlackColor);
for(i=1;i<MaxColume;i++)
for(j=MinLine+2;j<MaxLine;j++)
{
if(Game_gridMatrix[i][j]==1)
Osd_DrawStr(i,j,"\x087");
else
Osd_DrawStr(i,j,"\x088");
}
}
Gameblock Game_createblock()
{
XDATA Gameblock newblock ;
BYTE r;
r=rand();
r+=(g_uwGameMsCounter%11);
r=r%6;
switch(r)
{case(0):newblock.type=CP_Gameblock_I;newblock.color=CP_SeaBlueColor; break;
case(1):newblock.type=CP_Gameblock_O;newblock.color=CP_BlueColor; break;
case(2):newblock.type=CP_Gameblock_SO;newblock.color=CP_GreenColor; break;
case(3):newblock.type=CP_Gameblock_T;newblock.color=CP_YellowColor; break;
case(4):newblock.type=CP_Gameblock_L;newblock.color=CP_RedColor; break;
case(5):newblock.type=CP_Gameblock_Z;newblock.color=CP_WhiteColor; break;
}
newblock.shape=1;
newblock.x=3;
newblock.y=0;
if(GameBlockFastDownFlag)
Clr_GameBlockFastDownFlag();
return newblock;
}
Gameblock Game_change(Gameblock nblock)
{
switch(nblock.type)
{case CP_Gameblock_I:
switch(nblock.shape)
{
case(1):
if((nblock.x<MinColume)||(nblock.x+2==MaxColume)||Game_check_change(nblock))
//printf("ID %d", nblock.x);
return nblock;
Game_clear_block(nblock);
nblock.shape++;
break;
case(2):
if(Game_check_change(nblock))
return nblock;
Game_clear_block(nblock);
nblock.shape--;
break;
}
break;
case CP_Gameblock_T:
switch(nblock.shape)
{
case(1):
if((nblock.x<MinColume)||Game_check_change(nblock))
//printf("ID %d", nblock.x);
return nblock;
Game_clear_block(nblock);
nblock.shape++;
break;
case(2):
if((nblock.y+2==MaxLine)||Game_check_change(nblock))
return nblock;
Game_clear_block(nblock);
nblock.shape++;
break;
case(3):
if((nblock.x+2==MaxColume)||Game_check_change(nblock))
return nblock;
Game_clear_block(nblock);
nblock.shape++;
break;
case(4):
if(Game_check_change(nblock))
return nblock;
Game_clear_block(nblock);
nblock.shape=1;
break;
}
break;
case CP_Gameblock_L:
switch(nblock.shape)
{
case(1):
if(Game_check_change(nblock))
return nblock;
Game_clear_block(nblock);
nblock.shape++;
break;
case(2):
if((nblock.x<MinColume)||Game_check_change(nblock))
return nblock;
Game_clear_block(nblock);
nblock.shape++;
break;
case(3):
if(Game_check_change(nblock))
return nblock;
Game_clear_block(nblock);
nblock.shape++;
break;
case(4):
if((nblock.x+2==MaxLine)||Game_check_change(nblock))
return nblock;
Game_clear_block(nblock);
nblock.shape=1;
break;
}
break;
case CP_Gameblock_Z:
switch(nblock.shape)
{
case(1):
if((Game_gridMatrix[nblock.x+1][nblock.y])||(Game_gridMatrix[nblock.x][nblock.y+1]))
return nblock;
Game_clear_block(nblock);
nblock.shape++;
break;
case(2):
if((Game_gridMatrix[nblock.x][nblock.y])||(Game_gridMatrix[nblock.x+1][nblock.y+1]))
return nblock;
Game_clear_block(nblock);
nblock.shape--;
break;
}
break;
default:
break;
}
return nblock;
}
void Game_draw_delline(BYTE nline,BOOL Line1,BOOL Line2,BOOL Line3)
{
BYTE i,j,k;
for(k=0;k<2;k++)
{
Osd_SetTextColor(CP_BlueColor, CP_BlackColor);
for(j=nline;j<nline+3;j++)
for(i=1;i<MaxColume;i++)
{
if(j==nline)
{
if(!Line1)
break;
}
else if(j==nline+1)
{
if(!Line2)
break;
}
else
{
if(!Line3)
break;
}
Osd_DrawStr(i,j,"\x087");
}
Delay1ms(200);
Osd_SetTextColor(CP_BlackColor, CP_BlackColor);
for(j=nline;j<nline+3;j++)
for(i=1;i<MaxColume;i++)
{
if(j==nline)
{
if(!Line1)
break;
}
else if(j==nline+1)
{
if(!Line2)
break;
}
else
{
if(!Line3)
break;
}
Osd_DrawStr(i,j,"\x088");
}
Delay1ms(200);
}
}
BOOL Game_del_line(BYTE nline)
{
BYTE i,j,k,m;
BOOL Flag_1=FALSE;
BOOL Flag_del1=FALSE,Flag_del2=FALSE,Flag_del3=FALSE;
for(j=nline;j<nline+3;j++)
for(i=1;i<MaxColume;i++)
{
if(j>=MaxLine)
break;
if(!Game_gridMatrix[i][j])
break;
if(i==MaxColume-1)
{
Score++;
if(j==nline)
Flag_del1=TRUE;
else if(j==nline+1)
Flag_del2=TRUE;
else
Flag_del3=TRUE;
Flag_1=TRUE;
for(m=j;m>0;m--)
for(k=0;k<MaxColume;k++)
Game_gridMatrix[k][m]=Game_gridMatrix[k][m-1];
}
}
if(Flag_1)
Game_draw_delline(nline,Flag_del1,Flag_del2,Flag_del3);
return Flag_1;
}
void GameVariableInitial(void)
{
g_bGameEnable=0;
g_ucGameKeyControlStatus=GK_GameKeyNop;
}
BOOL Game_initial(void)
{
Score=0;
g_bGameEnable=1;
g_ucGameStatus=GS_GameReStart;
return TRUE;
}
BOOL Game_Start(void)
{
g_ucGameStatus=GS_GameRunning;
Game_MenuExec();
Game_ini_grid();
g_GameNowBlock=Game_createblock();
g_GameNextBlock=Game_createblock();
Game_draw_next(g_GameNextBlock);
Game_draw_block(g_GameNowBlock);
return TRUE;
}
void GameOverCheck(void)
{
if(Game_check_top(g_GameNextBlock))
{
g_ucGameStatus=GS_GameStop;
Game_restart();
}
else
{
g_GameNowBlock=g_GameNextBlock;
g_GameNextBlock=Game_createblock();
Game_draw_next(g_GameNextBlock);
Game_draw_block(g_GameNowBlock);
}
}
void Gameprocess(void)
{
if(g_ucGameKeyControlStatus)
{
switch(g_ucGameKeyControlStatus)
{
case GK_GameKeyDown://for change block
Set_GameBlockFastDownFlag();
g_uwGameMsCounter=GameFastTick;
break;
case GK_GameKeyTurn://for change block
g_GameNowBlock=Game_change(g_GameNowBlock);
Game_draw_block(g_GameNowBlock);
if(Game_check_bottom(g_GameNowBlock))
{
if(Game_del_line(g_GameNowBlock.y))
{Game_draw_score();}
Game_draw_grid(g_GameNowBlock);
GameOverCheck();
}
break;
case GK_GameKeyLeft:
if(!Game_check_lborder(g_GameNowBlock)&&!Game_check_bottom(g_GameNowBlock))
{
Game_clear_block(g_GameNowBlock);
g_GameNowBlock.x-=1;
Game_draw_block(g_GameNowBlock);
}
break;
case GK_GameKeyRight:
if(!Game_check_rborder(g_GameNowBlock)&&!Game_check_bottom(g_GameNowBlock))
{
Game_clear_block(g_GameNowBlock);
g_GameNowBlock.x+=1;
Game_draw_block(g_GameNowBlock);
}
break;
default:
break;
}
g_ucGameKeyControlStatus=GK_GameKeyNop;
}
if (GameBlockDownFlag)
{
Clr_GameBlockDownFlag() ;
if(!Game_check_bottom(g_GameNowBlock))
{
Game_clear_block(g_GameNowBlock);
g_GameNowBlock.y+=1;
Game_draw_block(g_GameNowBlock);
}
else
{
if(Game_del_line(g_GameNowBlock.y))
{
Game_draw_score();
}
Game_draw_grid(g_GameNowBlock);
GameOverCheck();
}
}
}
void GameHandle(void)
{
if (!g_bGameEnable)
return;
switch(g_ucGameStatus)
{
case GS_GameRunning:
Gameprocess();
break;
case GS_GameReStart:
Game_Start();
break;
case GS_GameExit:
Osd_Hide();
g_ucMenuPageIndex=RootMenu;
g_ucMenuItemIndex=0;
g_bGameEnable=0;
Set_InputTimingChangeFlag();
break;
case GS_GameStop:
break;
}
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -