贪吃蛇游戏+源码
程序代码:
//2010.06.09 //zook0k //<span style="color: #008000; text-decoration: underline;">http://blog.[/color] //<span style="color: #008000; text-decoration: underline;">http://shop59223037.[/color] //<span style="color: #008000; text-decoration: underline;">http://strongbaby1983.[/color] //qq:83310093 #include <windows.h> #include <stdio.h> #include<time.h> #define C_W 516 #define C_H 548 //#define C_W 1024 //#define C_H 1024 #define GO_RIGHT 0x01 #define GO_DOWN 0x02 #define GO_LEFT 0x03 #define GO_UP 0x04 #define SNAKE_NUMBER 30 typedef struct node_struct { unsigned char direction; unsigned char cnt; }s_node,*s_node_handle; s_node s_count[SNAKE_NUMBER ]; typedef struct SNAKE { unsigned char Head_X; unsigned char Head_Y; unsigned char Tail_X; unsigned char Tail_Y; unsigned char h_index; unsigned char t_index; unsigned char food_state; unsigned char score; unsigned char snake_state; } Snake_Data,*Snake_Data_handle; Snake_Data snk_1; #define MAP_X 64 #define MAP_Y 64 unsigned char game_map[MAP_Y][MAP_X]; LRESULT CALLBACK Win_tetris_Proc( HWND hwnd, // handle to window UINT uMsg, // message identifier WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ); int WINAPI WinMain( HINSTANCE hInstance, // handle to current instance HINSTANCE hPrevInstance, // handle to previous instance LPSTR lpCmdLine, // command line int nCmdShow // show state ) { snk_1.Head_X = 0x01;//head x snk_1.Head_Y = 0x00;//head y snk_1.Tail_X = 0x00;//tail x snk_1.Tail_Y = 0x00;//tail y snk_1.h_index=0; snk_1.t_index=0; snk_1.food_state=0; snk_1.score=0; snk_1.snake_state = 1; s_count[snk_1.h_index].cnt=2; s_count[snk_1.h_index].direction=GO_RIGHT; s_count[snk_1.t_index].cnt=2; s_count[snk_1.t_index].direction=GO_RIGHT; WNDCLASS wndcls; wndcls.cbClsExtra=0; wndcls.cbWndExtra=0; wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH); wndcls.hCursor=LoadCursor(NULL,IDC_CROSS); wndcls.hIcon=LoadIcon(NULL,IDI_APPLICATION); wndcls.hInstance=hInstance; wndcls.lpfnWndProc=Win_tetris_Proc; wndcls.lpszClassName="Game_tetris"; wndcls.lpszMenuName=NULL; wndcls.style=CS_HREDRAW | CS_VREDRAW; RegisterClass(&wndcls); //Game_Tetris HWND hwnd; hwnd=CreateWindow("Game_tetris","Game_Snake(http://blog.)",WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX & ~WS_MINIMIZEBOX & ~WS_THICKFRAME, 0,0,C_W,C_H,NULL,NULL,hInstance,NULL); ShowWindow(hwnd,SW_SHOWNORMAL); //initial snake HDC hdc; hdc=GetDC(hwnd); HBRUSH hbr; RECT rect; rect.left = 0; rect.top = 0; rect.right = 16; rect.bottom = 8; hbr= CreateSolidBrush(RGB(255,0,0)); FillRect(hdc,&rect,hbr); ReleaseDC(hwnd,hdc); game_map[0][0]=1; game_map[0][1]=1; //initial rand SetTimer(hwnd,1,100,NULL) ; srand((int)time(0)); UpdateWindow(hwnd); MSG msg; while(GetMessage(&msg,NULL,0,0)) { // TranslateMessage(&msg); DispatchMessage(&msg); } return 0; } LRESULT CALLBACK Win_tetris_Proc( HWND hwnd, // handle to window UINT uMsg, // message identifier WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ) { char szChar[20] = "score:"; unsigned char xx,yy; switch(uMsg) { case WM_KEYDOWN: { if(32 == wParam) { if(1 == snk_1.snake_state) { snk_1.snake_state = 0; } else { snk_1.snake_state = 1; } } if(1 == snk_1.snake_state) { if((wParam > 36)&&(wParam < 41)) { if(38 == wParam) { if((s_count[snk_1.h_index].direction == GO_RIGHT)||(s_count[snk_1.h_index].direction == GO_LEFT)) { snk_1.h_index = (snk_1.h_index+1)%SNAKE_NUMBER ; s_count[snk_1.h_index].direction = GO_UP; s_count[snk_1.h_index].cnt = 1; } } else if(40 == wParam) { if((s_count[snk_1.h_index].direction == GO_RIGHT)||(s_count[snk_1.h_index].direction == GO_LEFT)) { snk_1.h_index = (snk_1.h_index+1)%SNAKE_NUMBER ; s_count[snk_1.h_index].direction = GO_DOWN; s_count[snk_1.h_index].cnt = 1; } } else if(39 == wParam) { if((s_count[snk_1.h_index].direction == GO_DOWN)||(s_count[snk_1.h_index].direction == GO_UP)) { snk_1.h_index = (snk_1.h_index+1)%SNAKE_NUMBER ; s_count[snk_1.h_index].direction = GO_RIGHT; s_count[snk_1.h_index].cnt = 1; } } else if(37 == wParam) { if((s_count[snk_1.h_index].direction == GO_DOWN)||(s_count[snk_1.h_index].direction == GO_UP)) { snk_1.h_index = (snk_1.h_index+1)%SNAKE_NUMBER ; s_count[snk_1.h_index].direction = GO_LEFT; s_count[snk_1.h_index].cnt = 1; } } } } break; } case WM_TIMER: //case WM_PAINT: time_t t; HDC hdc; hdc=GetDC(hwnd); HBRUSH hbr; RECT rect; if(1 == snk_1.snake_state) { //head CHECK: switch(s_count[snk_1.h_index].direction) { case GO_RIGHT: { if(snk_1.Head_X < 63)snk_1.Head_X++; else snk_1.Head_X = 0; break; } case GO_LEFT: { if(snk_1.Head_X >0 )snk_1.Head_X--; else snk_1.Head_X = 63; break; } case GO_DOWN : { if(snk_1.Head_Y < 63)snk_1.Head_Y++; else snk_1.Head_Y = 0; break; } case GO_UP: { if(snk_1.Head_Y > 0)snk_1.Head_Y--; else snk_1.Head_Y = 63; break; } default: { break; } } s_count[snk_1.h_index].cnt++; if(0 == game_map[snk_1.Head_Y][snk_1.Head_X])//no point { game_map[snk_1.Head_Y][snk_1.Head_X] = 1; } else if(1 == game_map[snk_1.Head_Y][snk_1.Head_X])//game over { KillTimer(hwnd,1); sprintf(szChar,"score:%d",snk_1.score); MessageBox(hwnd,szChar,"GAME OVER!",0); } else if(2 == game_map[snk_1.Head_Y][snk_1.Head_X])//eat food { game_map[snk_1.Head_Y][snk_1.Head_X] = 1; snk_1.food_state = 0; snk_1.score++; goto CHECK; } rect.left = snk_1.Head_X*8; rect.top = snk_1.Head_Y*8; rect.right = rect.left + 8; rect.bottom = rect.top + 8; hbr= CreateSolidBrush(RGB(255,0,0)); FillRect(hdc,&rect,hbr);//show head point //tail game_map[snk_1.Tail_Y][snk_1.Tail_X] = 0; rect.left = snk_1.Tail_X*8; rect.top = snk_1.Tail_Y*8; rect.right = rect.left + 8; rect.bottom = rect.top + 8; //hbr= CreateSolidBrush(RGB(0,100,0)); hbr= CreateSolidBrush(RGB(0,0,0));//clear tail point FillRect(hdc,&rect,hbr); switch(s_count[snk_1.t_index].direction) { case GO_RIGHT: { if(snk_1.Tail_X < 63)snk_1.Tail_X++; else snk_1.Tail_X = 0; break; } case GO_LEFT: { if(snk_1.Tail_X >0 )snk_1.Tail_X--; else snk_1.Tail_X = 63; break; } case GO_DOWN : { if(snk_1.Tail_Y < 63)snk_1.Tail_Y++; else snk_1.Tail_Y = 0; break; } case GO_UP: { if(snk_1.Tail_Y > 0)snk_1.Tail_Y--; else snk_1.Tail_Y = 63; break; } default: { break; } } if(s_count[snk_1.t_index].cnt == 2) { snk_1.t_index = (snk_1.t_index + 1)%SNAKE_NUMBER ; } else { s_count[snk_1.t_index].cnt--; } //output food if(0 == snk_1.food_state) { snk_1.food_state = 1; do{ xx = rand()%3970%63; yy = rand()%3970/63; }while(1 == game_map[yy][xx]); game_map[yy][xx]=2; rect.left = xx*8; rect.top = yy*8; rect.right = rect.left + 8; rect.bottom = rect.top + 8; hbr= CreateSolidBrush(RGB(155,110,10)); FillRect(hdc,&rect,hbr);//show food srand((unsigned) time(&t)); } ReleaseDC(hwnd,hdc); } break; case WM_CLOSE: DestroyWindow(hwnd); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd,uMsg,wParam,lParam); } return 0; }vc6.0新建Win32 Console Application,新建一个c++source file,将代码拷贝进去执行即可
上下左右键控制方向
空格键用于暂停继续游戏