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

📄 snake.c

📁 瑞星微公司RK27XX系列芯片的SDK开发包
💻 C
📖 第 1 页 / 共 3 页
字号:
        case 2://up
            indexX = m_ptSnake[0].x;
            indexY = m_ptSnake[0].y - 1;
            if (!m_bsnakeCanThrough)//禁止穿越边界
            {
                if (indexY < 0)//出了边界
                    return TRUE;
            }
            break;
        case 3://left
            indexX = m_ptSnake[0].x - 1;
            indexY = m_ptSnake[0].y;
            if (!m_bsnakeCanThrough)//禁止穿越边界
            {
                if (indexX < 0)//出了边界
                    return TRUE;
            }
            break;
        case 4://right
            indexX = m_ptSnake[0].x + 1;
            indexY = m_ptSnake[0].y;
            if (!m_bsnakeCanThrough)//禁止穿越边界
            {
                if (indexX >= SNAKEGAME_SCOPE_ROW)//出了边界
                    return TRUE;
            }
            break;
    }
    ////////////////////
    indexY = indexY % SNAKEGAME_SCOPE_COL;
    indexX = indexX % SNAKEGAME_SCOPE_ROW;
    if (indexX == -1)
        indexX = SNAKEGAME_SCOPE_ROW - 1;
    if (indexY == -1)
        indexY = SNAKEGAME_SCOPE_COL - 1;
    //////////////check block///////////////////
    if (m_snakeArray[indexY][indexX] == SNAKEGAME_CELLTYPE_STONE)
        return TRUE;
    else
    {
        for (i = 2;i < m_snakeLen - 1;i++)
        {
            if ((indexY == m_ptSnake[i].y) && (indexX == m_ptSnake[i].x))
                return TRUE;
        }
    }
    return FALSE;
}
/******************************************************
Name: SnakeDrawFood
Desc: 画食物
Param:int indexX--坐标x
   int indexY--坐标y
   int nFoodType--食物的类型
Return: 无
Global: 有
Note:
Author:czs
Log:
******************************************************/
void SnakeDrawFood(int indexX, int indexY, int nFoodType)
{
    UHRECT rect;
    rect.x = indexX;
    rect.y = indexY;
    rect.w = SNAKEGAME_CELL_XSIZE;
    rect.h = SNAKEGAME_CELL_YSIZE;


    switch (nFoodType)
    {
        case SNAKEGAME_CELLTYPE_FOOD:
            DrawBmpIdEx((INT16S)(SNAKEGAME_BOARD_XPOS + indexX*SNAKEGAME_CELL_XSIZE), (INT16S)(SNAKEGAME_BOARD_YPOS + indexY*SNAKEGAME_CELL_YSIZE), BID_Snake_Food, 0, DSPM_Normal);
            break;
        case SNAKEGAME_CELLTYPE_AWARD:
            DrawBmpIdEx((INT16S)(SNAKEGAME_BOARD_XPOS + indexX*SNAKEGAME_CELL_XSIZE), (INT16S)(SNAKEGAME_BOARD_YPOS + indexY*SNAKEGAME_CELL_YSIZE), BID_Snake_Award, 0, DSPM_Normal);
            break;
        case SNAKEGAME_CELLTYPE_LIFE:
            DrawBmpIdEx((INT16S)(SNAKEGAME_BOARD_XPOS + indexX*SNAKEGAME_CELL_XSIZE), (INT16S)(SNAKEGAME_BOARD_YPOS + indexY*SNAKEGAME_CELL_YSIZE), BID_Snake_Life, 0, DSPM_Normal);
            break;
        default:
            break;
    }
// LCD_FLUSH();
}
/******************************************************
Name: SnakeCreateNewFood
Desc: 产生新的食物
Param:  int nFoodType--食物的类型
Return: 无
Global: 有
Note:
Author:czs
Log:
******************************************************/
void SnakeCreateNewFood(int nFoodType)
{
    SnakePoint ptRand[SNAKEGAME_SCOPE_ROW*SNAKEGAME_SCOPE_COL];
    int i, j, k, len, bSame;
    len = 0;
    for (j = 0;j < SNAKEGAME_SCOPE_COL;j++)
    {
        for (i = 0;i < SNAKEGAME_SCOPE_ROW;i++)
        {
            if (m_snakeArray[j][i] != SNAKEGAME_CELLTYPE_NULL)//有障碍物
                continue;
            bSame = FALSE;
            for (k = 0;k < m_snakeLen;k++)
            {//"蛇"
                if ((m_ptSnake[k].x == i) && (m_ptSnake[k].y == j))
                {
                    bSame = TRUE;
                    break;
                }
            }
            if (!bSame)
            {
                ptRand[len].x = i;
                ptRand[len].y = j;
                len++;
            }
        }

    }
    i = rand() % len;
    m_snakeArray[ptRand[i].y][ptRand[i].x] = nFoodType;
    SnakeDrawFood(ptRand[i].x, ptRand[i].y, nFoodType);
    //LCD_FLUSH();
}
/******************************************************
Name: SnakeDrawStone
Desc: 画石头障碍物
Param:  int indexX--坐标x
        int indexY--坐标y
Return: 无
Global: 有
Note:
Author:czs
Log:
******************************************************/
void SnakeDrawStone(int indexX, int indexY)
{
    DrawBmpIdEx((INT16S)(SNAKEGAME_BOARD_XPOS + indexX*SNAKEGAME_CELL_XSIZE), (INT16S)(SNAKEGAME_BOARD_YPOS + indexY*SNAKEGAME_CELL_YSIZE),  BID_Snake_Stone, 0, DSPM_Normal);
// LCD_FLUSH();

}

/******************************************************
Name: SnakeDrawBlock
Desc: 画贪吃蛇的躯干单元
Param:  int ix--坐标x
        int iy--坐标y
  BOOL bErase--是否擦除
  BOOL bDie--蛇是否死亡
Return: 无
Global: 有
Note:
Author:czs
Log:
******************************************************/
void SnakeDrawBlock(int ix, int iy, BOOL bErase, BOOL bDie)
{
    UHRECT rct;
    rct.x = ix * SNAKEGAME_CELL_XSIZE + SNAKEGAME_BOARD_XPOS;
    rct.y = iy * SNAKEGAME_CELL_XSIZE + SNAKEGAME_BOARD_YPOS;
    rct.w = SNAKEGAME_CELL_XSIZE;
    rct.h = SNAKEGAME_CELL_YSIZE;
    if (bErase)//擦除
    {
        GuiDspFillRect(&rct, ColorBlack);
    }
    else
    {


        if (bDie)
            DrawBmpIdEx((INT16S)(SNAKEGAME_BOARD_XPOS + ix*SNAKEGAME_CELL_XSIZE), (INT16S)(SNAKEGAME_BOARD_YPOS + iy*SNAKEGAME_CELL_YSIZE), BID_Snake_Snake_Gray, 0, DSPM_Normal);
        else
            DrawBmpIdEx((INT16S)(SNAKEGAME_BOARD_XPOS + ix*SNAKEGAME_CELL_XSIZE), (INT16S)(SNAKEGAME_BOARD_YPOS + iy*SNAKEGAME_CELL_YSIZE), BID_Snake_Snake, 0, DSPM_Normal);

    }
    //LCD_FLUSH();
}
/******************************************************
Name: SnakeDrawGame
Desc: 重画游戏的整个屏幕
Param:  无
Return: 无
Global: 有
Note:
Author:czs
Log:
******************************************************/
void SnakeDrawGame(void)
{
    int i, j;

    if (m_bsnakeDied)
    {
        for (i = 0;i < m_snakeLen;i++)
            SnakeDrawBlock(m_ptSnake[i].x, m_ptSnake[i].y, FALSE, TRUE);
    }
    else
    {
        for (i = 0;i < m_snakeLen;i++)
            SnakeDrawBlock(m_ptSnake[i].x, m_ptSnake[i].y, FALSE, FALSE);
    }
    for (j = 0;j < SNAKEGAME_SCOPE_COL;j++)
    {
        for (i = 0;i < SNAKEGAME_SCOPE_ROW;i++)
        {
            switch (m_snakeArray[j][i])
            {
                case SNAKEGAME_CELLTYPE_STONE:
                    SnakeDrawStone(i, j);
                    break;
                case SNAKEGAME_CELLTYPE_FOOD:
                    SnakeDrawFood(i, j, SNAKEGAME_CELLTYPE_FOOD);
                    break;
                case SNAKEGAME_CELLTYPE_AWARD:
                    SnakeDrawFood(i, j, SNAKEGAME_CELLTYPE_AWARD);
                    break;
            }
        }
    }
    //LCD_FLUSH();
}

//UINT32 SnakeOnDestroy( WINDOW* win , WMPARAM wParam, WLPARAM lParam )
//{
// return TRUE;
//}
UINT32 SnakeOnPaint(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
    SnakeCleanWindow();
    SnakeDrawBoard();
    SnakeShowSnakeLife();
    SnakeShowSnakeLen();
    SnakeDrawDispSectionTitle();
    SnakeDrawGameState();
    SnakeDrawThroughState();
    SnakeShowLevel();
    SnakeDrawGame();
    return TRUE;
}
/******************************************************
Name: SnakeOnTimer
Desc: 定时器回调函数
Param:  WINDOW* win--父窗口
        WMPARAM wParam--窗口参数
  WLPARAM lParam--窗口参数
Return: TRUE--成功,FALSE--失败
Global: 有
Note:
Author:czs
Log:
******************************************************/
UINT32 SnakeOnTimer(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{

    SnakeTimerWork(win);
//if(m_bsnakeShowMessage==0)
//RockOSSendMsg(MBDISP,MS_ISRDI_FlushInd,NULL);//采用此方式会造成对话框不能显示
//DoLcdFlush( gGuiDspLcdLogic );
    WindowInvalidateWindow(win);
    return TRUE;
}
/******************************************************
Name: SnakeOnKey
Desc: 按键处理函数
Param:  WINDOW* win--父窗口
        WMPARAM wParam--窗口参数
  WLPARAM lParam--窗口参数
Return: TRUE--成功,FALSE--失败
Global: 有
Note:
Author:czs
Log:
******************************************************/
UINT32 SnakeOnKey(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
    UINT16  keyPress = (UINT16)((wParam) >> 16);
    UINT16  KEY_EV = (UINT16)(wParam);


    switch (KEY_EV)
    {
        case SNAKE_KEY_DOWN_PRESS:
            if ((m_snakeCurDir != SNAKEUP) && (!m_bsnakePause) && (m_snakeCurDirTemp != SNAKEUP))
            {
                m_snakeCurDir = SNAKEDOWN;
            }
            break;
        case SNAKE_KEY_RIGHT_PRESS://left
            if ((m_snakeCurDir != SNAKERIGHT) && (!m_bsnakePause) && (m_snakeCurDirTemp != SNAKERIGHT))
            {
                m_snakeCurDir = SNAKELEFT;
            }
            break;
        case SNAKE_KEY_UP_PRESS:
            if ((m_snakeCurDir != SNAKEDOWN) && (!m_bsnakePause) && (m_snakeCurDirTemp != SNAKEDOWN))
            {
                m_snakeCurDir = SNAKEUP;
            }
            break;

        case SNAKE_KEY_LEFT_PRESS: //right
            if ((m_snakeCurDir != SNAKELEFT) && (!m_bsnakePause) && (m_snakeCurDirTemp != SNAKELEFT))
            {
                m_snakeCurDir = SNAKERIGHT;
            }
            break;
        case KE_MENU_LONG_RELEASE://llx added 080416
        case SNAKE_KEY_EXIT_PRESS://退出游戏
            WinStopTimer(m_snakeTimerID);
            RKWindowDestroyEx(win, 0, NULL);
            // WindowDestroy(win);
            break;
        case SNAKE_KEY_MENU_PRESS://游戏暂停或运行
            if (m_bsnakePause)
                m_snakeTimerID = WinStartTimer(win, SNAKETIMERDELAY);
            else
            {
                WinStopTimer(m_snakeTimerID);
            }

            m_bsnakePause = !m_bsnakePause;
            //SnakeDrawGameState();
            break;
        case SNAKE_KEY_PLAY_PRESS://设置游戏是否可以穿越边界
            m_bsnakeCanThrough = !m_bsnakeCanThrough;
            //SnakeDrawThroughState();
            break;
    }
    //RockOSSendMsg(MBDISP,MS_ISRDI_FlushInd,NULL);
    return TRUE;
}
/******************************************************
Name: SnakeOnCommand
Desc: 信息显示对话框返回后,利用此函数判断进一步的工作
Param:  WINDOW* win--父窗口
        WMPARAM wParam--窗口参数
  WLPARAM lParam--窗口参数
Return: TRUE--成功,FALSE--失败
Global: 有
Note:
Author:czs
Log:
******************************************************/
INT32U SnakeOnCommand(WINDOW* win, WMPARAM wParam, WLPARAM lParam)
{
    INT16U ID = WM_CMD_GETCWID(wParam);
    INT16U Event = WM_CMD_GETEVENT(wParam);
    if (Event == EV_Confirm)
    {
        switch (m_bsnakeShowMessage)
        {
            case 0:
                break;
            case 1:
                m_bsnakeShowMessage = 0;
                //SnakeDrawBoard();
                SnakeReDoLevel();
                m_snakeTimerID = WinStartTimer(win, SNAKETIMERDELAY);
                break;
            case 2:
                m_bsnakeShowMessage = 0;
                RKWindowDestroyEx(win, 0, NULL);


                //DoLcdFlush(gGuiDspLcdLogic);
                break;
            case 3:
                m_bsnakeShowMessage = 0;
                //SnakeDrawBoard();
                SnakeDoNextLevel();
                m_snakeTimerID = WinStartTimer(win, SNAKETIMERDELAY);
                break;
        }
    }
    return TRUE;


}
/******************************************************
Name: SnakeOnCreat
Desc: 贪吃蛇游戏创建时的回调函数,负责游戏的初始化
Param:  WINDOW* win--父窗口
        WMPARAM wParam--窗口参数
  WLPARAM lParam--窗口参数
Return: TRUE--成功,FALSE--失败
Global: 有
Note:
Author:czs
Log:
******************************************************/
UINT32 SnakeOnCreat(WINDOW* win , WMPARAM wParam, WLPARAM lParam)
{
    srand(0);
    SnakeGameInit();
    m_snakeTimerID = WinStartTimer(win, SNAKETIMERDELAY);
    return TRUE;
}

/******************************************************
Name: SnakeShowDialog
Desc: 贪吃蛇游戏信息显示对话框
Param:  WINDOW* win--父窗口
        INT16U captionID--字串资源的ID
Return: TRUE--成功,FALSE--失败
Global: 有
Note:
Author:czs
Log:
******************************************************/
UINT32 SnakeShowDialog(WINDOW* win, INT16U captionID)
{

    WINDOW *pw;
    DISPUPDATE_ENABLE();
    pw = WindowCreateDilog(win,
                           WES_DilogOK,
                           WID_SnakeDialog,
                           50, 70,
                           170, 100,
                           captionID,//SID_Txt_Warn,
                           BID_DilogBack76_70,
                           NULL,
                           WinDilogProcMap,
                           NULL);
    WindowInvalidateWindow(pw);
    //WindowSendMessage(pw,WM_PAINT,NULL,NULL);
    return TRUE;
}
/******************************************************
Name: GameStartSnake
Desc: 贪吃蛇游戏模块提供给系统的调用接口
Param:  WINDOW* win--父窗口
Return: TRUE--成功,FALSE--失败
Global: 有
Note:
Author:czs
Log:
******************************************************/
UINT32 GameStartSnake(WINDOW* win ,  char * filePath , void* param)
{
    win = WindowCreate(win ,
                       WS_FULLSCREEN,
                       WID_SnakeMain,
                       0, 0, LCD_W, LCD_H,
                       0,
                       BID_AudioPlayer5,
                       0,
                       0,
                       SnakeProcMap,
                       NULL);
    WindowInvalidateWindow(win);
    return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -