📄 snake.c
字号:
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 + -