📄 games_tetris.c
字号:
ARGUMENTS PASSED:
RETURN VALUE:
IMPORTANT NOTES:
==================================================================================================*/
static void ClearRect(OP_UINT8 col,OP_UINT8 row)
{
LCD_POINT ptLT,ptRB;
ptLT.x = XLEFTLINE+LINEWIDTH+col*SQUARELENGTH;
ptLT.y = row*SQUARELENGTH;
ptRB.x = ptLT.x+SQUARELENGTH-1;
ptRB.y = ptLT.y+SQUARELENGTH-1;
ds_fill_rect((OP_UINT16)ptLT.x, (OP_UINT16)ptLT.y, (OP_UINT16)ptRB.x, (OP_UINT16)ptRB.y, TETRIS_BG_COLOR);
}
/*==================================================================================================
FUNCTION: DrawColorRect
DESCRIPTION:
ARGUMENTS PASSED:
RETURN VALUE:
IMPORTANT NOTES:
==================================================================================================*/
static void DrawColorRect(OP_INT8 col,OP_INT8 row,DS_COLOR color)
{
LCD_POINT ptLT,ptRB;
ptLT.x = XLEFTLINE+LINEWIDTH+col*SQUARELENGTH;
ptLT.y = row*SQUARELENGTH;
ptRB.x = ptLT.x+SQUARELENGTH-1;
ptRB.y = ptLT.y+SQUARELENGTH-1;
ds_draw_button((OP_INT16)ptLT.x,
(OP_INT16)ptLT.y,
(OP_INT16)ptRB.x,
(OP_INT16)ptRB.y,
COLOR_LIGHT_GRAY,
COLOR_DARK_GRAY,
color);
}
/*==================================================================================================
FUNCTION: TetrisPutSTRnLINE
DESCRIPTION:
ARGUMENTS PASSED:
RETURN VALUE:
IMPORTANT NOTES:
==================================================================================================*/
static void TetrisPutSTRnLINE(void)
{
LCD_POINT ptLT,ptLB,pt;
OP_UINT8 i;
DrawPiece(indicator);
ptLT.x=0;
ptLT.y=0;
ptLB.x=ptLT.x;
ptLB.y=DS_SCRN_MAX_Y -1;
for (i=0;i<LINEWIDTH;i++)
{
ds_draw_line((OP_UINT16)(ptLT.x+i),(OP_UINT16)ptLT.y,(OP_UINT16)(ptLB.x+i),(OP_UINT16)ptLB.y,COLOR_DARK_BLUE);
}
ptLT.x=XLEFTLINE;
ptLB.x=ptLT.x;
for (i=0;i<LINEWIDTH;i++)
{
ds_draw_line((OP_UINT16)(ptLT.x+i),(OP_UINT16)ptLT.y,(OP_UINT16)(ptLB.x+i),(OP_UINT16)ptLB.y,COLOR_DARK_BLUE);
}
ptLT.x=XLEFTLINE+colNum*SQUARELENGTH+LINEWIDTH;
ptLB.x=ptLT.x;
for (i=0;i<LINEWIDTH;i++)
{
ds_draw_line((OP_UINT16)(ptLT.x+i),(OP_UINT16)ptLT.y,(OP_UINT16)(ptLB.x+i),(OP_UINT16)ptLB.y,COLOR_DARK_BLUE);
}
pt.x=5;
pt.y=10;
ds_draw_text_rm((OP_UINT16)pt.x, (OP_UINT16)pt.y, PMPT_TEXT_SCORE, FONT_SIZE_SMALL, TEXT_COLOR, TETRIS_BG_COLOR);
pt.y=52;
ds_draw_text_rm((OP_UINT16)pt.x, (OP_UINT16)pt.y,PMPT_TEXT_LINES, FONT_SIZE_SMALL, TEXT_COLOR, TETRIS_BG_COLOR);
pt.y=115;
ds_draw_text_rm((OP_UINT16)pt.x, (OP_UINT16)pt.y,PMPT_TEXT_NEXT, FONT_SIZE_SMALL, TEXT_COLOR, TETRIS_BG_COLOR);
}
/*==================================================================================================
FUNCTION: InitSquare
DESCRIPTION:
ARGUMENTS PASSED:
RETURN VALUE:
IMPORTANT NOTES:
==================================================================================================*/
static OP_BOOLEAN InitSquare(LPTSquare lpsq,OP_UINT8 col,OP_UINT8 row,DS_COLOR color,OP_BOOLEAN Data)
{
if(lpsq==OP_NULL)
return OP_FALSE;
lpsq->row=row;
lpsq->col=col;
lpsq->color=color;
lpsq->data=Data;
return OP_TRUE;
}
/*==================================================================================================
FUNCTION: DrawPiece
DESCRIPTION:
ARGUMENTS PASSED:
RETURN VALUE:
IMPORTANT NOTES:
==================================================================================================*/
static void DrawPiece(TSquare sq[])
{
OP_UINT8 i;
for(i=0;i<curPieceNum;i++)
{
DrawColorRect(sq[i].col,sq[i].row, sq[i].color);
}
ds_refresh();
}
/*==================================================================================================
FUNCTION: ClearPiece
DESCRIPTION:
ARGUMENTS PASSED:
RETURN VALUE:
IMPORTANT NOTES:
==================================================================================================*/
static void ClearPiece(TSquare sq[])
{
OP_UINT8 i;
for(i=0;i<curPieceNum;i++)
{
ClearRect(sq[i].col,sq[i].row);
}
ds_refresh();
}
/*==================================================================================================
FUNCTION: InBounds
DESCRIPTION:
ARGUMENTS PASSED:
RETURN VALUE:
IMPORTANT NOTES:
==================================================================================================*/
static OP_BOOLEAN InBounds(LPTSquare lpsq)
{
return (lpsq->col>=0 && lpsq->col<colNum
&& lpsq->row>=0 && lpsq->row<rowNum);
}
/*==================================================================================================
FUNCTION: FieldIsNull
DESCRIPTION:
ARGUMENTS PASSED:
RETURN VALUE:
IMPORTANT NOTES:
==================================================================================================*/
static OP_BOOLEAN FieldIsNull(OP_UINT8 row,OP_UINT8 col)
{
return (Tetris.field[row][col].isOccupied==OP_FALSE);
}
/*==================================================================================================
FUNCTION: IsLastLine
DESCRIPTION:
ARGUMENTS PASSED:
RETURN VALUE:
IMPORTANT NOTES:
==================================================================================================*/
static OP_BOOLEAN IsLastLine(TSquare sq[])
{
OP_UINT8 i;
for (i=0;i<curPieceNum;i++)
{
if (sq[i].row<=0)
return OP_TRUE;
}
return OP_FALSE;
}
/*==================================================================================================
FUNCTION: ChangeSqValue
DESCRIPTION:
ARGUMENTS PASSED:
RETURN VALUE:
IMPORTANT NOTES:
==================================================================================================*/
static OP_BOOLEAN ChangeSqValue(LPTSquare lps,LPTSquare lpd)
{
TSquare tempSq;
if(lps==OP_NULL || lpd==OP_NULL)
return OP_FALSE;
tempSq.row=lps->row;
tempSq.col=lps->col;
lps->row=lpd->row;
lps->col=lpd->col;
lpd->row=tempSq.row;
lpd->col=tempSq.col;
return OP_TRUE;
}
/*==================================================================================================
FUNCTION: DrawDigit
DESCRIPTION:
ARGUMENTS PASSED:
RETURN VALUE:
IMPORTANT NOTES:
==================================================================================================*/
static void DrawDigit(OP_INT16 wInteger,LCD_POINT pt)
{
OP_UINT8 buffer[8];
OP_UINT8 strINT[16];
op_sprintf((char *)buffer, "%d", wInteger);
AtoU(strINT, buffer);
ds_draw_text((OP_UINT16)pt.x, (OP_UINT16)pt.y, strINT, FONT_SIZE_SMALL, TEXT_COLOR, TETRIS_BG_COLOR);
}
/*==================================================================================================
FUNCTION: Repaint
DESCRIPTION:
ARGUMENTS PASSED:
RETURN VALUE:
IMPORTANT NOTES:
==================================================================================================*/
static void Repaint(void)
{
OP_UINT8 i,j;
LCD_POINT pt;
LCD_RECT_T u_rect;
TetrisPutSTRnLINE();
pt.x = 5;
pt.y = 26;
DrawDigit(Tetris.theScore,pt);
pt.y = 68;
DrawDigit(Tetris.destroyLines,pt);
for(i=0;i<rowNum;i++)
for(j=0;j<colNum;j++)
{
if(Tetris.field[i][j].isOccupied==OP_TRUE)
{
DrawColorRect(j,i,Tetris.field[i][j].color);
}
};
u_rect.left = ds.rcUpdate.left;
u_rect.top = ds.rcUpdate.top;
u_rect.right = ds.rcUpdate.right;
u_rect.bottom = ds.rcUpdate.bottom;
}
/*==================================================================================================
FUNCTION: MovePiece
DESCRIPTION:
ARGUMENTS PASSED:
RETURN VALUE:
IMPORTANT NOTES:
==================================================================================================*/
static OP_BOOLEAN canMoveTo(TSquare to[],OP_UINT8 num)
{
OP_UINT8 i;
for(i=0;i<num;i++)
{
if(InBounds(&to[i])==OP_FALSE)
return OP_FALSE;
if(Tetris.field[to[i].row][to[i].col].isOccupied==OP_TRUE)
return OP_FALSE;
}
return OP_TRUE;
}
/*==================================================================================================
FUNCTION: MovePiece
DESCRIPTION:
ARGUMENTS PASSED:
RETURN VALUE:
IMPORTANT NOTES:
==================================================================================================*/
static OP_BOOLEAN MovePiece(TSquare from[],TSquare to[],OP_UINT8 num)
{
OP_UINT8 i;
if (!canMoveTo(to, curPieceNum))
{
return OP_FALSE;
}
/* redraw square */
ClearPiece(from);
DrawPiece(to);
/* change current square value */
for(i=0;i<num;i++)
{
ChangeSqValue(&from[i],&to[i]);
}
return OP_TRUE;
}
/*==================================================================================================
FUNCTION: CopyPiece
DESCRIPTION:
ARGUMENTS PASSED:
RETURN VALUE:
IMPORTANT NOTES:
==================================================================================================*/
static void CopyPiece(TSquare from[],TSquare to[],OP_UINT8 num)
{
OP_UINT8 i;
for(i=0;i<num;i++)
{
to[i]=from[i];
}
}
/*==================================================================================================
FUNCTION: InitIndicator
DESCRIPTION:
ARGUMENTS PASSED:
RETURN VALUE:
IMPORTANT NOTES:
==================================================================================================*/
static void InitIndicator(void)
{
OP_UINT8 i;
OP_INT8 offset_col,offset_row;
offset_col = (colNum + ((XLEFTLINE + LINEWIDTH*2) / SQUARELENGTH))/2;
offset_row = rowNum -curPieceNum;
for(i=0;i<curPieceNum;i++)
{
indicator[i].row=Tetris.nextPiece[i].row + offset_row;
indicator[i].col=Tetris.nextPiece[i].col - offset_col;
indicator[i].color=Tetris.nextPiece[i].color;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -