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

📄 snake.c

📁 瑞星微公司RK27XX系列芯片的SDK开发包
💻 C
📖 第 1 页 / 共 3 页
字号:
/**********************************************************
*  Copyright (C),2004-2007, Fuzhou Rockchip Co.,Ltd.
*  Module name : snake game
*  Author:         Zushang Chen
*  Description:    贪吃蛇游戏
*  Calls:
*  Input:          无
*  Return:         无
*  Remark:
*
*  History:
*           <author>      <time>     <version>       <desc>
*           CZS          2007/08/13      1.0           ORG
*
$Log: snake.c,v $
Revision 1.4  2008/06/19 04:42:27  Administrator
代码整理!

Revision 1.3  2008/06/06 03:14:56  XXX
更改游戏在RGB屏情况的问题

Revision 1.1.1.1  2008/03/06 13:28:25  Lingzhaojun
no message

Revision 1.9  2008/01/15 07:06:55  Lingzhaojun
RGB屏系统支持

Revision 1.8  2008/01/14 07:27:18  Chenzushang
去除DoLCDFlush函数

Revision 1.7  2008/01/10 13:02:35  Chenzushang
修改窗口ID

Revision 1.6  2008/01/07 08:23:39  Chenzushang
修改左右按键相反问题
修改对话框不能弹出问题

Revision 1.5  2007/11/03 01:52:01  Chenzushang
修改了部分的游戏按键

Revision 1.4  2007/10/26 03:53:02  Chenzushang
添加CVS版本自动注释脚本

***********************************************************/
#include "snake.h"
#include "..\..\system\gui\guictrl\uidilog.h"
extern void RKWindowDestroyEx(WINDOW *win  , WMPARAM wParam, WLPARAM lParam);
//snake variable
int m_snakeCurDirTemp;
int m_snakeTotalScore;
int m_snakeLife;
int m_snakeLevel;
UINT8 m_bsnakePause;
int m_snakeArray[SNAKEGAME_SCOPE_COL][SNAKEGAME_SCOPE_ROW];
int m_snakeCurDir;
SnakePoint m_ptSnake[SNAKEGAME_SNAKE_MAXLEN];
int m_snakeLen;
int m_snakeInitY;
int m_snakeInitX;
int m_snakeBlockLen;
int m_snakeLenY;
int m_snakeLenX;
SnakePoint m_ptDisplay;
UINT8 m_bsnakeDied;
UINT8 m_bsnakeCanThrough;
UINT8 m_snakeGameState;
HTIMER m_snakeTimerID;
UINT8 m_bsnakeShowMessage;

BEGIN_CHILDMESSAGE_MAP(SnakeProcMap , NULL)
ON_MESSAGE(WM_PAINT ,   SnakeOnPaint)
// ON_MESSAGE( WM_DESTROY ,  SnakeOnDestroy)
ON_MESSAGE(WM_CREATE,   SnakeOnCreat)
ON_MESSAGE(WM_TIMER,   SnakeOnTimer)
ON_MESSAGE(WM_KEY,    SnakeOnKey)
ON_MESSAGE(WM_COMMAND,  SnakeOnCommand)
END_MESSAGE_MAP()
/******************************************************
Name: SnakeDrawBoard
Desc: 画游戏的底板 
Param:无
Return: 无
Global: 有
Note:
Author:czs
Log:
******************************************************/
void SnakeDrawBoard()
{
    UHRECT rct;
    COLOR col = ColorBlack;
    rct.x = SNAKEGAME_BOARD_XPOS;
    rct.y = SNAKEGAME_BOARD_YPOS;
    rct.w = SNAKEGAME_BOARD_XSIZE;
    rct.h = SNAKEGAME_BOARD_YSIZE;
    GuiDspFillRect(&rct, col);
}
/******************************************************
Name: SnakeCleanWindow
Desc: 清除整个游戏窗口 
Param:无
Return: 无
Global: 有
Note:
Author:czs
Log:
******************************************************/
void SnakeCleanWindow()
{
    UHRECT rct;
    COLOR col = ColorWhite;
    rct.x = 0;
    rct.y = 0;
    rct.w = SNAKEGAME_WINDOW_XSIZE;
    rct.h = SNAKEGAME_WINDOW_YSIZE;
    GuiDspFillRect(&rct, col);

}
/******************************************************
Name: SnakeTimerWork
Desc: 游戏定时器的回调函数 
Param:WINDOW* win--父窗口
Return: 无
Global: 有
Note:
Author:czs
Log:
******************************************************/
void SnakeTimerWork(WINDOW* win)
{
    int i;
    if (SnakeCheckDie())
    {
        WinStopTimer(m_snakeTimerID);
        m_snakeGameState = SNAKEGAME_STOP;
        //if(m_bsnakeEnableSound)
        // ::PlaySound(MAKEINTRESOURCE(IDR_WAVDIE),AfxGetApp()->m_hInstance,SND_RESOURCE|SND_ASYNC);
        for (i = 0;i < m_snakeLen;i++)
            SnakeDrawBlock(m_ptSnake[i].x, m_ptSnake[i].y, FALSE, TRUE);
        m_snakeLife--;
        if (m_snakeLife >= 0)
        {
            //SnakeShowSnakeLife();
            // CreateDialogEx( focusWindow, DIALOG_NOTIFY, T_S_SNAKE_REDO , IDW_NOTIFY_DIALOG , 0 );
            SnakeShowDialog(win, SID_Snake_FailMessage);
            m_bsnakeShowMessage = 1;
            // SnakeDrawBoard();
            // SnakeReDoLevel();
        }
        else
        {
            // CreateDialogEx( focusWindow, DIALOG_NOTIFY, T_S_SNAKE_REDO , IDW_NOTIFY_DIALOG , 0 );
            SnakeShowDialog(win, SID_Snake_EndMessage);
            m_bsnakeShowMessage = 2;
            //  DestroyWindow(win);
        }

        return;
    }
    if (SnakeCheckCanEat())
    {
        m_snakeTotalScore += 10;
        SnakeDrawBlock(m_ptSnake[0].x, m_ptSnake[0].y, FALSE, FALSE);
        //  SnakeShowSnakeLen();
        //SnakeShowScore();
        //if(m_bsnakeEnableSound)
        // ::PlaySound(MAKEINTRESOURCE(IDR_WAVEAT),AfxGetApp()->m_hInstance,SND_RESOURCE|SND_ASYNC);
        if (m_snakeLen == SNAKEGAME_SNAKE_MAXLEN)
        {
            WinStopTimer(m_snakeTimerID);
            if (m_snakeLevel == SNAKEGAME_MAX_LEVEL)
            {
                SnakeShowDialog(win, SID_Snake_FinishMessage);
                m_bsnakeShowMessage = 2;
            }
            else
            {
                WinStopTimer(m_snakeTimerID);
                m_snakeLevel++;
                SnakeShowDialog(win, SID_Snake_PassMessage);
                m_bsnakeShowMessage = 3;

            }
        }
        else
        {
            SnakeCreateNewFood(SNAKEGAME_CELLTYPE_FOOD);
            if ((rand() % 5) == 0)
                SnakeCreateNewFood(SNAKEGAME_CELLTYPE_AWARD);
            if ((rand() % 25) == 0)
                SnakeCreateNewFood(SNAKEGAME_CELLTYPE_LIFE);
        }
    }
    else
    {

        m_snakeCurDirTemp = m_snakeCurDir;
        SnakeMoveSnake();
    }
}
/******************************************************
Name: SnakeDrawDispSectionTitle
Desc: 显示游戏显示区的标题 
Param:无
Return: 无
Global: 有
Note:
Author:czs
Log:
******************************************************/
void SnakeDrawDispSectionTitle()
{
    ColorDesc col;
    col.backward = ColorBlack;
    col.forward = 0x000000ff;
    col.mode = DSPM_Normal;
    DrawStringIdEx(SNAKEGAME_DISP_LEVEL_X, SNAKEGAME_DISP_LEVEL_Y, 60, SID_Snake_Level, Font12X12, &col, 0);
    DrawStringIdEx(SNAKEGAME_DISP_LENGTH_X, SNAKEGAME_DISP_LENGTH_Y, 60, SID_Snake_Length, Font12X12, &col, 0);
    DrawStringIdEx(SNAKEGAME_DISP_SCORE_X, SNAKEGAME_DISP_SCORE_Y, 60, SID_Snake_Score, Font12X12, &col, 0);
    DrawStringIdEx(SNAKEGAME_DISP_LIFE_X, SNAKEGAME_DISP_LIFE_Y, 60, SID_Snake_Life, Font12X12, &col, 0);

}
/******************************************************
Name: SnakeDrawGameState
Desc: 显示游戏的当前状态 
Param:无
Return: 无
Global: 有
Note:
Author:czs
Log:
******************************************************/
void SnakeDrawGameState()
{
    ColorDesc col;
    col.backward = ColorBlack;
    col.forward = 0x00ff0000;
    col.mode = DSPM_Normal;
    if (m_bsnakePause)
        DrawStringIdEx(SNAKEGAME_DISP_STATE_X, SNAKEGAME_DISP_STATE_Y, 60, SID_Snake_GamePause, Font12X12, &col, 0);
    else
        DrawStringIdEx(SNAKEGAME_DISP_STATE_X, SNAKEGAME_DISP_STATE_Y, 60, SID_Snake_GameRun, Font12X12, &col, 0);
}
/******************************************************
Name: SnakeDrawThroughState
Desc: 显示游戏是否可以穿越边界 
Param:无
Return: 无
Global: 有
Note:
Author:czs
Log:
******************************************************/
void SnakeDrawThroughState()
{
    ColorDesc col;
    col.backward = ColorBlack;
    col.forward = 0x00ff0000;
    col.mode = DSPM_Normal;
    if (m_bsnakeCanThrough)
        DrawStringIdEx(SNAKEGAME_DISP_THROUGH_X, SNAKEGAME_DISP_THROUGH_Y, 60, SID_Snake_CanThrough, Font12X12, &col, 0);
    else
        DrawStringIdEx(SNAKEGAME_DISP_THROUGH_X, SNAKEGAME_DISP_THROUGH_Y, 60, SID_Snake_NoThrough, Font12X12, &col, 0);
}
/******************************************************
Name: SnakeShowLevel
Desc: 显示当前的关卡数 
Param:无
Return: 无
Global: 有
Note:
Author:czs
Log:
******************************************************/
void SnakeShowLevel()
{
    WCHAR strlevel[2];
    ColorDesc col;
    col.backward = 0x00000000;
    col.forward = 0x00ff0000;
    col.mode = DSPM_Normal;
    strlevel[0] = m_snakeLevel + '0';
    strlevel[1] = 0;
    DrawStringEx(SNAKEGAME_DISP_LEVEL_X, SNAKEGAME_DISP_LEVEL_Y + SNAKEGAME_DISP_H, 30, strlevel, Font12X12, &col, 0);


}
/******************************************************
Name: SnakeShowSnakeLen
Desc: 显示贪吃蛇的长度 
Param:无
Return: 无
Global: 有
Note:
Author:czs
Log:
******************************************************/
void SnakeShowSnakeLen()
{
    WCHAR strsnakelen[3];
    ColorDesc col;
    col.backward = 0x00000000;
    col.forward = 0x00ff0000;
    col.mode = DSPM_Normal;
    strsnakelen[0] = m_snakeLen / 10 + '0';
    strsnakelen[1] = m_snakeLen % 10 + '0';
    strsnakelen[2] = 0;
    DrawStringEx(SNAKEGAME_DISP_LENGTH_X, SNAKEGAME_DISP_LENGTH_Y + SNAKEGAME_DISP_H, 30, strsnakelen, Font12X12, &col, 0);
}
/******************************************************
Name: SnakeShowSnakeLife
Desc: 显示贪吃蛇的生命数 
Param:无
Return: 无
Global: 有
Note:
Author:czs
Log:
******************************************************/
void SnakeShowSnakeLife()
{
    WCHAR strsnakelife[2];
    ColorDesc col;
    col.backward = 0x00000000;
    col.forward = 0x00ff0000;
    col.mode = DSPM_Normal;
    strsnakelife[0] = m_snakeLife + '0';
    strsnakelife[1] = 0;
    DrawStringEx(SNAKEGAME_DISP_LIFE_X, SNAKEGAME_DISP_LIFE_Y + SNAKEGAME_DISP_H, 30, strsnakelife, Font12X12, &col, 0);

}
/******************************************************
Name: SnakeGameInit
Desc: 进行游戏的初始化 
Param:无
Return: 无
Global: 有
Note:
Author:czs
Log:
******************************************************/
void SnakeGameInit(void)
{
    m_snakeTotalScore = 0;
    m_snakeLife = SNAKEGAME_MAX_LIFE;
    m_snakeLen = 1;
    m_snakeLevel = 1;
    m_bsnakeDied = FALSE;
    SnakeClearArray();
    m_ptSnake[0].x = 7;
    m_ptSnake[0].y = 0;
    m_snakeCurDir = SNAKEDOWN;//1:down 2:Up 3:left 4:right
    m_snakeCurDirTemp = 1;
    ////////////////////////////////////////
    m_bsnakePause = FALSE;
    m_bsnakeCanThrough = 0;
    m_bsnakeDied = FALSE;
    m_bsnakeShowMessage = 0;
    //SnakeCleanWindow();
    //SnakeDrawBoard();
    SnakeSetLevel_00();
    SnakeCreateNewFood(SNAKEGAME_CELLTYPE_FOOD);
    //SnakeDrawGame();
    ////////////////////////////////////////
    //关值
    //SnakeDrawDispSectionTitle();
    //SnakeShowScore();
    //SnakeShowLevel();
    //SnakeShowSnakeLen();
    //SnakeShowSnakeLife();
    ////////////////////////////////////////
    m_snakeGameState = SNAKEGAME_RUN;
    //SnakeDrawThroughState();
    //SnakeDrawGameState();


}
/******************************************************
Name: SnakeShowScore
Desc: 显示游戏的分数 
Param:无
Return: 无
Global: 有
Note:
Author:czs
Log:
******************************************************/
void SnakeShowScore()
{

    WCHAR pScore[6];
    unsigned long Score_tmp;
    ColorDesc col;
    col.backward = 0x00000000;
    col.forward = 0x00ff0000;
    col.mode = DSPM_Normal;
    Score_tmp = m_snakeTotalScore;
    pScore[0] = (INT16U)(Score_tmp / 10000 + '0');
    Score_tmp = Score_tmp % 10000;
    pScore[1] = (INT16U)(Score_tmp / 1000 + '0');
    Score_tmp = Score_tmp % 1000;
    pScore[2] = (INT16U)(Score_tmp / 100  + '0');
    Score_tmp = Score_tmp % 100;
    pScore[3] = (INT16U)(Score_tmp / 10   + '0');
    Score_tmp = Score_tmp % 10   + '0';
    pScore[4] = (INT16U)(Score_tmp);
    pScore[5] = 0;
    DrawStringEx(SNAKEGAME_DISP_SCORE_X, SNAKEGAME_DISP_SCORE_Y + SNAKEGAME_DISP_H, 60, pScore, Font12X12, &col, 0);
}
/******************************************************
Name: SnakeMoveSnake
Desc: 移动蛇,清除蛇的历史痕迹,重画蛇的现在位置 
Param:无
Return: 无
Global: 有
Note:
Author:czs
Log:
******************************************************/
void SnakeMoveSnake()
{
    int i;
    SnakePoint pt[SNAKEGAME_SNAKE_MAXLEN];
    int nDir;
    nDir = m_snakeCurDir;
    for (i = 0;i < SNAKEGAME_SNAKE_MAXLEN;i++)
        pt[i] = m_ptSnake[i];
    switch (nDir)
    {
        case 1://down
            m_ptSnake[0].y++;
            m_ptSnake[0].y = m_ptSnake[0].y % SNAKEGAME_SCOPE_COL;
            break;
        case 2://up
            m_ptSnake[0].y--;
            if (m_ptSnake[0].y == -1)
                m_ptSnake[0].y = (SNAKEGAME_SCOPE_COL - 1);
            break;
        case 3://left
            m_ptSnake[0].x--;
            if (m_ptSnake[0].x == -1)
                m_ptSnake[0].x = (SNAKEGAME_SCOPE_ROW - 1);
            break;
        case 4://right
            m_ptSnake[0].x++;
            m_ptSnake[0].x = m_ptSnake[0].x % SNAKEGAME_SCOPE_ROW;
            break;
    }

    if (m_snakeLen == 1)
        SnakeDrawBlock(pt[0].x, pt[0].y, TRUE, FALSE);
    if (m_snakeLen >= 2)
    {
        SnakeDrawBlock(m_ptSnake[m_snakeLen-1].x, m_ptSnake[m_snakeLen-1].y, TRUE, FALSE);
        for (i = 1;i < m_snakeLen;i++)
        {
            m_ptSnake[i] = pt[i-1];
        }
    }
    SnakeDrawBlock(m_ptSnake[0].x, m_ptSnake[0].y, FALSE, FALSE);
}

⌨️ 快捷键说明

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