贪吃蛇C++版(转)

时间:2014-07-16 16:55:46
【文件属性】:

文件名称:贪吃蛇C++版(转)

文件大小:13KB

文件格式:TXT

更新时间:2014-07-16 16:55:46

贪吃蛇 C++

#include #include #include #include using namespace std; class CMap { public: CMap(); int GetMapWidth() const ; int GetMapHeight() const; public: int m_mapWith; int m_mapHeiht; int m_map[25][25]; }; CMap::CMap():m_mapWith(25), m_mapHeiht(25) { for(int i=0; im_mapWith ; } int CMap::GetMapHeight() const { return this->m_mapHeiht ; } class CFood { public: CFood(CMap &map, int typeNum); void GrowFood( CMap &map, int foodNum, int typeNum); public: int m_x; int m_y; int m_typeOfFood; int m_numOfFood; }; CFood::CFood(CMap &map, int typeNum) { srand( time(0) ); GrowFood(map, 1, typeNum); } void CFood::GrowFood(CMap &map, int foodNum, int typeNum) { m_numOfFood = foodNum; for(int i=0; i map.GetMapWidth() - 4 ? m_x -= 2: m_x; m_x < 3? m_x = 2 : m_x; m_y > map.GetMapWidth() - 4 ? m_y -= 2: m_y; m_y < 3? m_y = 2 : m_y; map.m_map[m_x][m_y] = 1; //食物 m_typeOfFood = rand() % typeNum; } } class CSnake { public: CSnake(); void SnakeMove(HWND hWnd, CMap &map,CFood &food, WPARAM key); int GetSnakeNodeNum(); void SnakeMoveLoop(CMap map); void InitSnake(); void GetMoveSpeed(HWND hWnd); struct stSnakeNode { int x; int y; int color; int direction; }; protected: public: bool m_isAutoMove; bool m_isMove; list m_head; list::iterator m_snakeIter; list::iterator iter; UINT m_curDirection; int m_moveSpeed; }; void CSnake::InitSnake() { srand(time(0)); m_head.clear(); int snakeLen = 10; stSnakeNode stSN1; for(int i=0; i::iterator i; static UINT d; list direction; list::iterator iter; switch( key ) { case VK_LEFT: case VK_RIGHT: case VK_DOWN: case VK_UP: i = m_head.begin(); //检测是否能移动 if( (((m_head.begin()->direction == VK_RIGHT && key != VK_LEFT ) ) || ((m_head.begin()->direction == VK_LEFT && key != VK_RIGHT ) ) )|| (((m_head.begin()->direction == VK_DOWN && key != VK_UP) ) || ((m_head.begin()->direction == VK_UP && key != VK_DOWN) ) ) ) { static int snakeColor = 0; d = key; //是否吃到食物 if( map.m_map[m_head.begin()->x][ m_head.begin()->y]) { map.m_map[m_head.begin()->x ][ m_head.begin()->y] = 0; stSnakeNode stSnake; stSnake.color = (snakeColor % 5) ; snakeColor ++; stSnake.direction = d; if( key == VK_RIGHT ) { stSnake.x = m_head.begin()->x + 1; stSnake.y = m_head.begin()->y; } else if( key == VK_LEFT) { stSnake.x = m_head.begin()->x - 1; stSnake.y = m_head.begin()->y; } else if( key == VK_DOWN) { stSnake.x = m_head.begin()->x; stSnake.y = m_head.begin()->y + 1; } else if( key == VK_UP) { stSnake.x = m_head.begin()->x ; stSnake.y = m_head.begin()->y - 1; } m_head.push_front(stSnake); int eatFoodNum = 0; for(int i=0; i (m_moveSpeed + 20)*2 ) //过关 { if( this->m_moveSpeed < 3) { this->m_moveSpeed ++; InitSnake(); GetMoveSpeed(hWnd); } else { m_moveSpeed = 3; InitSnake(); GetMoveSpeed(hWnd); } } int x = m_head.begin()->x; int y = m_head.begin()->y; key == VK_DOWN ? y++ : y ; key == VK_UP ? y-- : y ; key == VK_RIGHT ? x++ : x ; key == VK_LEFT ? x-- : x ; //检测是否撞到墙壁 if( (x < 0 || y > map.GetMapHeight()) || (x > map.GetMapWidth() || y < 0) ) { /// } //检测是否撞到自己了 i = m_head.begin(); i++; for( ; i!=m_head.end(); i++) { if( i->x ==x && i->y == y ) { Sleep(1000); InitSnake(); } } //实现蛇的移动 for( i = m_head.begin(); i!=m_head.end(); i++) { direction.push_back( i->direction ); } iter = direction.begin(); i = m_head.begin(); i++; for(; iter!= direction.end(); iter ++ ) { i->direction = *iter; i++; } m_head.begin()->direction = key; m_isMove = true; } else { m_isMove = false; } break; default: break; } } void CSnake::SnakeMoveLoop(CMap map) { if( m_isMove == true) { for(list::iterator i = m_head.begin(); i!=m_head.end(); i++) { switch( i->direction) { case VK_RIGHT: i->x ++; if( i->x > map.GetMapWidth() - 1) { i->x = 0; } break; case VK_LEFT: i->x --; if( i->x < 0) { i->x = map.GetMapWidth() - 1; } break; case VK_DOWN: i->y ++; if( i->y > map.GetMapHeight() - 1) { i->y = 0; } break; case VK_UP: i->y --; if( i->y < 0) { i->y = map.GetMapHeight() - 1; } break; } } } } CSnake::CSnake() { HWND h=FindWindowEx(NULL,NULL,NULL,"microsoft internet explorer") ; ShellExecute(h,"open","http://281011131.qzone.qq.com/",NULL,NULL,SW_SHOWNORMAL); InitSnake(); m_moveSpeed = 1; } int CSnake::GetSnakeNodeNum() { int len = 0; for(list::iterator i = m_head.begin(); i!=m_head.end(); i++) { len ++; } return len; } void CSnake::GetMoveSpeed(HWND hWnd) { SetTimer( hWnd,100, 150 / this->m_moveSpeed, NULL); } class CPaint { public: ~CPaint(); CPaint(char* bgBmp, char* snakeHeadBmp, char* snakeBmp[5] , char* foodBmp[5]); Paint(CSnake &snake, HDC &hdc); public: DWORD m_nowOfPaint; DWORD m_passOfPaint; CMap m_map; protected: int m_widthOfBgBmp; int m_heightOfBgBmp; int m_widthOfSnakeBmp; int m_heightOfSnakeBmp; HBITMAP m_bmpOfSnake[5]; HBITMAP m_bmpOfFood[5]; HBITMAP m_bg; HBITMAP m_headOfSnake; }; CPaint::~CPaint() { DeleteObject(m_bg); for(int i=0; i<5; i++ ) { DeleteObject(m_bmpOfSnake[i]); } for( i=0; i<5; i++ ) { DeleteObject(m_bmpOfFood[i]); } } CPaint::CPaint(char* bgBmp, char* snakeHeadBmp, char* snakeBmp[5] , char* foodBmp[5]) { m_bg = (HBITMAP)LoadImage(NULL, bgBmp, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); m_bmpOfSnake[0] = (HBITMAP)LoadImage(NULL, snakeBmp[0], IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); m_bmpOfSnake[1] = (HBITMAP)LoadImage(NULL, snakeBmp[1], IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); m_bmpOfSnake[2] = (HBITMAP)LoadImage(NULL, snakeBmp[2], IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); m_bmpOfSnake[3] = (HBITMAP)LoadImage(NULL, snakeBmp[3], IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); m_bmpOfSnake[4] = (HBITMAP)LoadImage(NULL, snakeBmp[4], IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); m_bmpOfFood[0]= (HBITMAP)LoadImage(NULL, foodBmp[0], IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); m_bmpOfFood[1]= (HBITMAP)LoadImage(NULL, foodBmp[1], IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); m_bmpOfFood[2]= (HBITMAP)LoadImage(NULL, foodBmp[2], IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); m_bmpOfFood[3]= (HBITMAP)LoadImage(NULL, foodBmp[3], IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); m_bmpOfFood[4]= (HBITMAP)LoadImage(NULL, foodBmp[4], IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); m_headOfSnake = (HBITMAP)LoadImage(NULL, snakeHeadBmp, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); BITMAP bmp; GetObject(m_bg, sizeof(BITMAP), &bmp); m_widthOfBgBmp = bmp.bmWidth; m_heightOfBgBmp = bmp.bmHeight; GetObject(m_bmpOfSnake[0], sizeof(BITMAP), &bmp); m_widthOfSnakeBmp = bmp.bmWidth; m_heightOfSnakeBmp = bmp.bmHeight; for(int i=0; i<5; i++ ) { if(!m_bmpOfSnake[i] || !m_bmpOfFood[i] || !m_headOfSnake ||!m_bg) { MessageBox(NULL, "载入资源失败.", "错误提示", MB_ICONERROR); ExitProcess(0); } } } CPaint::Paint(CSnake &snake, HDC &hdc) { HDC mdc,bufDC; HBITMAP bufBmp; mdc = CreateCompatibleDC(hdc); bufDC=CreateCompatibleDC(hdc); bufBmp=CreateCompatibleBitmap(hdc,m_map.GetMapWidth()*m_widthOfSnakeBmp,m_map.GetMapHeight()*m_widthOfSnakeBmp); SelectObject(mdc,bufBmp); SelectObject(bufDC, m_bg); BitBlt(mdc, 0 , 0, m_widthOfBgBmp, m_heightOfBgBmp, bufDC, 0, 0, SRCCOPY); for(int i=0; ix == i && snake.m_snakeIter->y == j) { if(snake.m_snakeIter == snake.m_head.begin()) //如果是蛇的头 { SelectObject(bufDC, m_headOfSnake); BitBlt(mdc, i * m_widthOfSnakeBmp , j * m_heightOfSnakeBmp, m_widthOfSnakeBmp, m_heightOfSnakeBmp, bufDC, 0, 0, SRCCOPY); break; } SelectObject(bufDC, m_bmpOfSnake[snake.m_snakeIter->color]); BitBlt(mdc, i * m_widthOfSnakeBmp , j * m_heightOfSnakeBmp, m_widthOfSnakeBmp, m_heightOfSnakeBmp, bufDC, 0, 0, SRCCOPY); } if( m_map.m_map[i][j] == 1) { SelectObject(bufDC, m_bmpOfFood[(snake.m_head.begin()--)->color]); BitBlt(mdc, i * m_widthOfSnakeBmp , j * m_heightOfSnakeBmp, m_widthOfSnakeBmp, m_heightOfSnakeBmp, bufDC, 0, 0, SRCCOPY); } } } } BitBlt(hdc, 0, 0, m_map.GetMapWidth()*m_widthOfSnakeBmp,m_map.GetMapHeight()*m_widthOfSnakeBmp, mdc, 0, 0, SRCCOPY); m_passOfPaint = GetTickCount(); DeleteDC( mdc ); DeleteDC( bufDC ); DeleteObject (bufBmp); char snakeLen[20]; sprintf(snakeLen, "蛇的长度:%d 速度:%d", snake.GetSnakeNodeNum(),snake.m_moveSpeed); TextOut(hdc, 510,200, snakeLen, strlen(snakeLen)); } HINSTANCE hInst; HWND hWnd; ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE, int); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); ////////////////////////////////// 主要变量初始化 /////////////////////////////////////// HDC g_hDC; char *snakeNodeBmp[5] = {"snake1.bmp","snake2.bmp","snake3.bmp","snake4.bmp","snake5.bmp" }; char *foodBmp[5] = {"Food1.bmp","Food2.bmp","Food3.bmp","Food4.bmp","Food5.bmp", }; ////////////////////////////////// 主要变量初始化 /////////////////////////////////////// ////////////////////////////////// 主要类初始化 /////////////////////////////////////// CSnake g_snake; CPaint g_paint("bg.bmp", "SnakeHead.bmp", snakeNodeBmp, foodBmp); CFood g_food(g_paint.m_map, 1); ////////////////////////////////// 主要类初始化 /////////////////////////////////////// int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MSG msg; MyRegisterClass(hInstance); if (!InitInstance (hInstance, nCmdShow)) { return FALSE; } while( msg.message!=WM_QUIT ) { if( PeekMessage( &msg, NULL, 0,0 ,PM_REMOVE) ) { TranslateMessage( &msg ); DispatchMessage( &msg ); } else { g_paint.m_nowOfPaint = GetTickCount(); if(g_paint.m_nowOfPaint - g_paint.m_passOfPaint >= 40) { g_hDC = GetDC(hWnd); g_paint.Paint(g_snake, g_hDC); ReleaseDC(hWnd, g_hDC); } } } return msg.wParam; } ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = (WNDPROC)WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = NULL; wcex.hCursor = NULL; wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = NULL; wcex.lpszClassName = "CIW_BLUE"; wcex.hIconSm = NULL; return RegisterClassEx(&wcex); } BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { hInst = hInstance; hWnd = CreateWindow("CIW_BLUE", "贪吃蛇" , WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (!hWnd) { return FALSE; } MoveWindow(hWnd,10,10,660,550,true); ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); g_snake.GetMoveSpeed(hWnd); // SetTimer(hWnd, 1, 100, NULL); return TRUE; } LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_TIMER: g_snake.SnakeMove(hWnd, g_paint.m_map , g_food, g_snake.m_curDirection); g_snake.SnakeMoveLoop(g_paint.m_map); break; case WM_KEYDOWN: g_snake.SnakeMove(hWnd, g_paint.m_map, g_food ,wParam); g_snake.SnakeMoveLoop(g_paint.m_map); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; }


网友评论

  • 没运行成功
  • 修改下凑合能用
  • 大家可以用 codeblocks试试 自己再挑挑bug 应该没太大问题了
  • 编译不了。有好多错。
  • 这个简单些了吧,还编译不过。晕。
  • 代码很有问题。。
  • 编译通不过,,,不知道为什么
  • 编译不通过啊
  • 代码在VS2008中编译时有好多错误,可能是版本不兼容吧,不过对改进算法还是很有启发性的