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