看Windows程序有段时间了,终于动手写东西。贪吃蛇算是一个开始吧,下面的贪吃蛇很简单,也有很多地方需要修改,还有情况没有考虑QAQ 但这不是我的目的了。。。
思路很简单:建个链表储存蛇身节点即可。
#include <windows.h> #include <time.h> #define ID_TIMER 1 #define TIMERSET 600 char score,temp=0; int flag,tempx,tempy, foodx,foody,key;//运动方向,食物坐标,标记 bool havebody[50][50]; bool over = false; struct Snake { Snake *next; int x; int y; }; struct Snake *head; struct Snake *creat()//链表初始化 { struct Snake *p1,*p2,*p3; head=(struct Snake*)malloc(sizeof(Snake)); p1=(struct Snake*)malloc(sizeof(Snake)); p2=(struct Snake*)malloc(sizeof(Snake)); p3=(struct Snake*)malloc(sizeof(Snake)); head->x=23;head->y=23; head->next=p1; p1->x=24;p1->y=23; p1->next=p2; p2->x=25;p2->y=23; p2->next=p3; p3->x=26;p3->y=23; p3->next=NULL; return head; }; LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { TCHAR szAppName[] = TEXT("dy"); WNDCLASS wndcls; wndcls.cbClsExtra = 0; wndcls.cbWndExtra = 0; wndcls.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); wndcls.hCursor = LoadCursor(hInstance, IDC_ARROW); wndcls.hIcon = LoadIcon(hInstance, IDI_APPLICATION); wndcls.hInstance = hInstance; wndcls.lpfnWndProc = WndProc; wndcls.lpszClassName = szAppName; wndcls.lpszMenuName = NULL; wndcls.style = CS_HREDRAW | CS_VREDRAW; RegisterClass(&wndcls); HWND hwnd = CreateWindow (szAppName, TEXT ("dyww"), WS_OVERLAPPEDWINDOW, 300, 100, 390, 400, NULL, NULL, hInstance, NULL) ; ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); MSG msg; while(GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } void food(HWND hwnd)//食物 { foodx = rand() % 37, foody = rand() %36; while(havebody[foodx][foody]) { foodx = rand() % 37, foody = rand() % 36; } havebody[foodx][foody] = true; InvalidateRect(hwnd, NULL, TRUE); } void checkdeath()//检查是否死亡 { Snake *p= head,*end; do { p=p->next; }while(p->next!=NULL); end=p; if(p->x <0||p->x >36 || p->y <0 || p->y >35) over=true; p=head->next; do { if(p->x==end->x&&p->y==end->y){over=true;} p=p->next; }while(p->next!=NULL); } bool havefood(Snake *p) { if(foodx==p->x&&foody==p->y) return true; else return false; } struct Snake *insert(int x,int y)//插入节点 { struct Snake *p1,*p; p=(struct Snake*)malloc(sizeof(Snake)); p1=head; p->x=head->x;p->y=head->y; p->next=head->next; head->x=tempx;head->y=tempy; head->next=p; havebody[head->x][head->y]=true; return head; }; Snake *mainrun(HWND hwnd) { struct Snake *p; p=head; int temp=0,deadfood=0; tempx=p->x;tempy=p->y;//储存头节点的值 do { if(p->next!=NULL){ if(temp==0){havebody[p->x][p->y]=false; p->x=p->next->x;p->y=p->next->y;havebody[p->x][p->y]=true;temp++;} else {p->x=p->next->x;p->y=p->next->y;havebody[p->x][p->y]=true;}} p=p->next; }while(p->next!=NULL); //havebody[p->x][p->y]=false; if(flag==1) p->x--; if(flag==2) p->y--; if(flag==3) p->x++; if(flag==4) p->y++; if(havefood(p)) {insert(tempx,tempy);deadfood=1;score+=1;} checkdeath(); havebody[p->x][p->y]=true; InvalidateRect(hwnd, NULL, TRUE); if(deadfood) food(hwnd); return head; } LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)//窗口过程 { HDC hdc; PAINTSTRUCT ps; TCHAR szScore[]=TEXT("GAME OVER 得分:"), szBuffer[20]; int x, y; switch(message) { case WM_CREATE://各种初始化 flag=3;key=1;score=0; srand(time(NULL)); creat(); food(hwnd); havebody[foodx][foody]=true; SetTimer(hwnd, ID_TIMER, TIMERSET, NULL); return 0; case WM_TIMER: mainrun(hwnd); if(over) { KillTimer(hwnd, ID_TIMER); InvalidateRect(hwnd, NULL, TRUE); } else InvalidateRect(hwnd, NULL, TRUE); return 0; case WM_KEYDOWN: if(over) return 0; switch(wParam) { case VK_UP: if(flag != 4) { flag = 2; mainrun(hwnd); } break; case VK_DOWN: if(flag != 2) { flag = 4; mainrun(hwnd); } break; case VK_LEFT: if(flag != 3) { flag = 1; mainrun(hwnd); } break; case VK_RIGHT: if(flag != 1) { flag = 3; mainrun(hwnd); } break; default: break; } return 0; case WM_PAINT: hdc = BeginPaint(hwnd, &ps); Rectangle(hdc,0, 0, 370, 360); if(over) {SelectObject(hdc, GetStockObject(RGB(100,255,0)));Rectangle(hdc,0, 0, 370, 360); TextOut(hdc, 140, 130, szScore, lstrlen(szScore)); TextOut(hdc, 178, 160, szBuffer, wsprintf(szBuffer, TEXT("%4d"), score)); //TextOut(hdc, 198, 190, szBuffer, wsprintf(szBuffer, TEXT("%4d"), temp)); } SelectObject(hdc, GetStockObject(BLACK_BRUSH)); for(x = 0; x <37; x++) for(y = 0; y <36; y++) { if(havebody[x][y]) Rectangle(hdc,x*10,y*10,(x+1)*10,(y+1)*10); } EndPaint (hwnd, &ps) ; return 0; case WM_DESTROY: KillTimer(hwnd, ID_TIMER); PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, message, wParam, lParam); }