⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 block.c

📁 瑞星微公司RK27XX系列芯片的SDK开发包
💻 C
📖 第 1 页 / 共 3 页
字号:
    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 + -