📄 block.c
字号:
if (Score_tmp >= 100000)
Score_tmp = 99999;
pScore[0] = (unsigned short)(Score_tmp / 10000 + '0');
Score_tmp = Score_tmp % 10000;
pScore[1] = (unsigned short)(Score_tmp / 1000 + '0');
Score_tmp = Score_tmp % 1000;
pScore[2] = (unsigned short)(Score_tmp / 100 + '0');
Score_tmp = Score_tmp % 100;
pScore[3] = (unsigned short)(Score_tmp / 10 + '0');
Score_tmp = Score_tmp % 10 + '0';
pScore[4] = (unsigned short)(Score_tmp);
pScore[5] = 0;
//--------------------------------------------------------------------------
// 显示分数和等级(10000分为一级)
//--------------------------------------------------------------------------
DrawStringEx(BLOCKGAME_DISP_SCORE_X, BLOCKGAME_DISP_SCORE_Y + 14, 30, pScore, Font12X12, &col, 0);
if ((BlockGameLevel - BlockGameLevelBase) != (pScore[0] - '0'))
{
BlockGameLevel = pScore[0] - '0' + BlockGameLevelBase;
pScore[0] = BlockGameLevel / 10 + '0';
pScore[1] = BlockGameLevel % 10 + '0';
pScore[2] = 0;
DrawStringEx(BLOCKGAME_DISP_LEVEL_X + 12, BLOCKGAME_DISP_LEVEL_Y + 14, 30, pScore, Font12X12, &col, 0);
}
}
/*
**********************************************************
* Copyright (C),2004-2005, Fuzhou Rockchip Co.,Ltd.
* Function name : BlockRemove()
* Author: ZhenFu Fang
* Description: 消除方块
* Calls: BlockRefLine()
* Input:
* Return:
* Remark:
*
* History:
* <author> <time> <version> <desc>
* FZF 06/03/17 1.0 ORG
* CZS 07/01/09 1.1 增加行闪烁功能
***********************************************************
*/
void BlockRemove(void)
{
unsigned int i;
unsigned int y_tmp, deldat[4];
unsigned int RemoveLines = 0;
unsigned int *pBlockInsertFlag;
y_tmp = MoveBlock_Y;
pBlockInsertFlag = &BlockInsertFlag[y_tmp];
BlockFlashing = 1;
for (i = 0; i < 4; i++)
{
if ((*pBlockInsertFlag & ~BLOCK_LIMIT_MASK) == ((~BLOCK_LIMIT_MASK)&0xFFFF))
{
deldat[RemoveLines] = y_tmp;
//BlockFlashLine(y_tmp);
//BlockRefLine(y_tmp);
RemoveLines++;
}
if (++y_tmp >= BLOCKGAME_SCOPE_ROW)
break;
pBlockInsertFlag++;
}
if (RemoveLines)
{
//BlockFlashLine(deldat,RemoveLines);
for (i = 0;i < RemoveLines;i++)
BlockRefLine(deldat[i]);
}
BlockFlashing = 0;
if (RemoveLines)
{
i = (1 << (RemoveLines - 1));
i = i * 2;
BlockGameScore += (unsigned long)i * 100 - 100;
//BlockShowScore();
}
}
/*
**********************************************************
* Copyright (C),2004-2005, Fuzhou Rockchip Co.,Ltd.
* Function name : BlockGetNewBlock()
* Author: ZhenFu Fang
* Description: 获取新的方块
* Calls:
* Input:
* Return: 非0值时,获取新方块失败(游戏结束)
* Remark: 在
*
* History:
* <author> <time> <version> <desc>
* FZF 06/03/17 1.0 ORG
*
***********************************************************
*/
unsigned int BlockGetNewBlock(void)
{
BlockRefreshNextMat(0);
if (BlockGameState == BLOCKGAME_RUN)
{
if (BlockInsert())
{
BlockGameState = BLOCKGAME_STOP;
BlockDispInit();
//BlockDrawGameArea();
BlockValueInit();
return 1; // GAME OVER
}
//BlockDrawGameArea();
}
return 0;
}
/******************************************************
Name: BlockRefreshNextMat
Desc: 更新新方块队列
Param: unsigned int justrefresh -- 为0时,新队列的第一个数更新到全局变量CurBlock和BlockAspect中
否则不更新。
Return: 无
Global: 有
Note:
Author:czs
Log:
******************************************************/
void BlockRefreshNextMat(unsigned int justrefresh)
{
int i = 0;
if (justrefresh == 0)
{
CurBlock = BlockNextMat[0] & 0xff;//((unsigned int)BLOCKRANDFUNC())%7;///1; // 获取0-6之间的随机数
BlockAspect = (BlockNextMat[0] >> 8) & 0xff;//((unsigned int)BLOCKRANDFUNC())%4;///2; // 获取0-3之间的随机数
MoveBlock_Y = 0;
MoveBlock_X = 6;
}
for (i = 0;i < 3;i++)
BlockNextMat[i] = BlockNextMat[i+1];
BlockNextMat[3] = ((BLOCKRANDFUNC() % 7) & 0xff) | (((BLOCKRANDFUNC() % 4) << 8) & 0xff00);
//BlockDispNext();
}
/******************************************************
Name: BlockGameSetting
Desc: 游戏停止时,通过此函数对按键进行响应
Param: UINT16 KeyVal-- 按键值
Return: 无
Global: 有
Note:
Author:czs
Log:
******************************************************/
void BlockGameSetting(UINT32 KeyVal)
{
ColorDesc col;
col.backward = 0x00000000;
col.forward = 0x00ff0000;
col.mode = DSPM_Normal;
switch (KeyVal)
{
case KE_MENU_RELEASE:
{
BlockGetNewBlock();
DrawStringIdEx(BLOCKGAME_DISP_STATE_X, BLOCKGAME_DISP_STATE_Y, 30, SID_Block_Run, Font12X12, &col, 0);
m_blockTimerID = WinStartTimer(pblockwin, BLOCKTIMERDELAY - BlockGameLevel * BLOCKTIMEDECSIZE);//根据 等级来设定时间
BlockGameState = BLOCKGAME_RUN;
}
break;
case KE_UP_RELEASE:
if (BlockGameLevel < 9)
BlockGameLevel++;
BlockGameLevelBase = BlockGameLevel;
break;
case KE_DN_RELEASE:
{
if (BlockGameLevel > 0)
BlockGameLevel--;
BlockGameLevelBase = BlockGameLevel;
}
break;
default:
break;
}
BlockDispInit();
}
/******************************************************
Name: BlockMove
Desc: 根据参数进行方块的移动
Param:unsigned int key -- 按键值
Return: 无
Global: 有
Note:
Author:czs
Log:
******************************************************/
void BlockMove(unsigned int key)
{
unsigned int temp;
if (BlockGameState != BLOCKGAME_RUN || BlockFlashing == 1)
return;
switch (key)
{
case KE_UP_RELEASE:
{
temp = BlockAspect;
if (++BlockAspect >= 4)
{
BlockAspect = 0;
}
if (BlockChk(temp, MoveBlock_X, MoveBlock_Y))
{
BlockAspect = temp;
}
else
{
;// BlockDrawGameArea();
WindowInvalidateWindow(pblockwin);
}
}
break;
case KE_NEXT_RELEASE:
{
temp = MoveBlock_X;
if (MoveBlock_X > 0)
MoveBlock_X--;
if (BlockChk(BlockAspect, temp, MoveBlock_Y))
{
MoveBlock_X = temp;
}
else
{
;// BlockDrawGameArea();
WindowInvalidateWindow(pblockwin);
}
}
break;
case KE_PREV_RELEASE:
{
temp = MoveBlock_X;
if (MoveBlock_X < 16)
MoveBlock_X++;
if (BlockChk(BlockAspect, temp, MoveBlock_Y))
{
MoveBlock_X = temp;
}
else
{
;// BlockDrawGameArea();
WindowInvalidateWindow(pblockwin);
}
}
break;
case KE_DN_LONG_RELEASE:
{
do
{
BlockDrawGameArea();
temp = MoveBlock_Y;
MoveBlock_Y++;
}
while (BlockChk(BlockAspect, MoveBlock_X, temp) == 0);
MoveBlock_Y = temp;
BlockRemove();
if (BlockGetNewBlock())
{
WinStopTimer(m_blockTimerID);
break;
}
//BlockDrawGameArea();
WindowInvalidateWindow(pblockwin);
}
break;
case KE_DN_RELEASE:
{
temp = MoveBlock_Y;
MoveBlock_Y++;
if (BlockChk(BlockAspect, MoveBlock_X, temp))
{
MoveBlock_Y = temp;
BlockRemove();
if (BlockGetNewBlock())
{
WinStopTimer(m_blockTimerID);
break;
}
}
//BlockDrawGameArea();
WindowInvalidateWindow(pblockwin);
}
break;
default:
break;
}
}
/******************************************************
Name: BlockGameProcess
Desc: 游戏过程中对按键的响应
Param: UINT16 KeyVal--按键值
Return: 无
Global: 有
Note:
Author:czs
Log:
******************************************************/
void BlockGameProcess(UINT32 KeyVal)
{
ColorDesc col;
col.backward = ColorBlack;
col.forward = 0x00ff0000;
col.mode = DSPM_Normal;
switch (KeyVal)
{
case KE_PLAY_RELEASE:
if (BlockGameState != BLOCKGAME_RUN)
{
BlockGameState = BLOCKGAME_RUN;
DrawStringIdEx(BLOCKGAME_DISP_STATE_X, BLOCKGAME_DISP_STATE_Y, 30, SID_Block_Run, Font12X12, &col, 0);
m_blockTimerID = WinStartTimer(pblockwin, BLOCKTIMERDELAY - BlockGameLevel * BLOCKTIMEDECSIZE);//根据 等级来设定时间
}
else
{
BlockGameState = BLOCKGAME_PAUSE;
WinStopTimer(m_blockTimerID);
m_blockTimerID = NULL;
DrawStringIdEx(BLOCKGAME_DISP_STATE_X, BLOCKGAME_DISP_STATE_Y, 30, SID_Block_Pause, Font12X12, &col, 0);
}
break;
case KE_NEXT_RELEASE:
case KE_PREV_RELEASE:
case KE_DN_RELEASE:
case KE_DN_LONG_RELEASE:
case KE_UP_RELEASE:
BlockMove(KeyVal);
break;
case KE_MENU_RELEASE:
BlockRefreshNextMat(1);//游戏运行中可通过按Menu键刷新新方块队列,但每刷新一次扣500分。
if (BlockGameScore >= 500)
BlockGameScore -= 500;
else
BlockGameScore = 0;
//BlockShowScore();
break;
default:
break;
}
}
/******************************************************
Name: GameStartBlock
Desc: 俄罗斯方块游戏模块提供给系统的调用接口
Param: WINDOW* win--父窗口
Return: TRUE--成功,FALSE--失败
Global: 有
Note:
Author:czs
Log:
******************************************************/
UINT32 GameStartBlock(WINDOW* win , char * filePath , void* param)
{
win = WindowCreate(win ,
WS_FULLSCREEN,
WID_BlockMain,
0, 0, LCD_W, LCD_H,
0,
BID_Block_Back,
0,
0,
BlockProcMap,
NULL);
pblockwin = win;
BlockValueInit();
BlockDispInit();
m_blockTimerID = NULL;
WindowAppSetShow(ProcGetProcGuid(GUID_EXE_ToolBar), 0);
//RockOSSendMsg(MBDISP,MS_ISRDI_FlushInd,NULL);
return 0;
}
INT32U BlockOnDestroy(WINDOW* win, WMPARAM wParam, WLPARAM lParam)
{
WindowAppSetShow(ProcGetProcGuid(GUID_EXE_ToolBar), 1);
return WMPROC_UNHANDLE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -