游戏编程笔记-起步
3.贪吃蛇游戏实现
代码下载:http://download.csdn.net/detail/you_lan_hai/3738025
核心代码实现如下,算法描述见 “起步(一)”:
#include "app.h"
#include
#include
int g_nHeight = 514;//窗口高度int g_rows = 0; //地图行数
int g_cols = 0; //地图列数
int g_nSize = 30; //地图方格尺寸struct Point//二维点
{int r;//行int c;//列
};Point g_snake[1000]; //蛇
int g_nLength = 0; //蛇的长度
int g_nSpeed;
bool g_bLive = true; //是否存活
int g_nSnakeDir = 0; //蛇的当前移动方向。0-左,1-右,2-上,3-下const Point g_direction[4] = {{0,-1},{0,1},{-1,0},{1,0}};//四个方向运动增量。Point g_prizePos; //奖子坐标bool g_bPause = true; //是否暂停HBRUSH g_brushs[4]; //背景画刷void setSnakeDir(int dir)//设置蛇的运动方向。
{if ((dir==0 && g_nSnakeDir==1)|| (dir==1 && g_nSnakeDir==0)|| (dir==2 && g_nSnakeDir==3)|| (dir==3 && g_nSnakeDir==2))//反方向移动则令他暂停{g_bPause = true;return;//直接返回,什么也不做。}else{g_bPause = false;g_nSnakeDir = dir;}
}void resetLevel()//重置关卡
{/*初始化地图。将四边初始为障碍,即不可通过。* 0-可通过,1-障碍,2-奖子,3-蛇*/memset(g_map,0,sizeof(g_map));for (int r=0; r
{g_brushs[0] = CreateSolidBrush(RGB(255,255,255));//白色画刷g_brushs[1] = CreateSolidBrush(RGB(0,0,255));//绘制障碍画刷g_brushs[2] = CreateSolidBrush(RGB(255,0,0));//绘制奖子画刷g_brushs[3] = CreateSolidBrush(RGB(0,255,0));//绘制蛇画刷srand(GetTickCount());//矫正窗口高度、宽度数据RECT rc;GetClientRect(getHWnd(),&rc);g_nWidth = rc.right - rc.left;g_nHeight = rc.bottom - rc.top;//计算行列值g_rows = g_nHeight / g_nSize;g_cols = g_nWidth / g_nSize;resetLevel();
}void update()//逻辑更新
{//时钟控制static int oldTime = 0;int curTime = GetTickCount();if (curTime - oldTime
}void render()//画面渲染
{HDC hDC = GetDC(getHWnd()); //获得系统绘图设备HDC memDC = CreateCompatibleDC(0); //创建辅助绘图设备HBITMAP bmpBack = CreateCompatibleBitmap(hDC,g_nWidth,g_nHeight);//创建掩码位图(画布)SelectObject(memDC,bmpBack); //将画布贴到绘图设备上HPEN penBack = CreatePen(PS_SOLID,1,RGB(255,0,255));//创建画笔SelectObject(memDC,penBack); //将画笔选到绘图设备上//擦除背景RECT rcClient;//区域结构GetClientRect(getHWnd(),&rcClient);//获得客户区域HBRUSH brushTemp = (HBRUSH)GetStockObject(WHITE_BRUSH);//获得库存物体,白色画刷。FillRect(memDC,&rcClient,brushTemp);//填充客户区域。////绘制2维网格,矩形画法。for (int r=0; r
{//释放画刷资源for (int i&#61;0; i<4; &#43;&#43;i){if(g_brushs !&#61; NULL){DeleteObject(g_brushs[i]);g_brushs[i] &#61; NULL;}}
}/*窗口过程。如果没有处理消息请返回0&#xff0c;否则返回1。*/
LRESULT wndProc(HWND hwnd,UINT uMsg, WPARAM wParam,LPARAM lParam )
{switch(uMsg){case WM_KEYDOWN:{switch(wParam){case VK_LEFT: setSnakeDir(0); break; //向左case VK_RIGHT: setSnakeDir(1); break; //向右case VK_UP : setSnakeDir(2); break; //向上case VK_DOWN: setSnakeDir(3); break; //向下case VK_ESCAPE: DestroyWindow(hwnd);break;}}break;default:return 0;}return 1;
}//主函数
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE , LPSTR , int )
{if(!initApp(hInstance,L"贪吃蛇游戏",g_nWidth,g_nHeight)){return 0;}//初始化游戏init();//游戏循环mainLoop();//释放资源clear();return 0;
}