Advertisement
Mihao

Snake1

Jan 11th, 2017
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.80 KB | None | 0 0
  1. #include <Windows.h>
  2. #include <string>
  3. #include <time.h>
  4. #include <list>
  5. #include <math.h>
  6. typedef std::list <RECT> snakeList;
  7. snakeList snake;
  8. enum Direction {UP,DOWN,LEFT,RIGHT};
  9. Direction direction;
  10.  
  11. RECT rect,rnd={0,0,20,20};
  12. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
  13. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR plCmdLine, int mShowCMD)
  14. {
  15.     srand(time(NULL));
  16.     direction = UP;
  17.  
  18.     LPTSTR className = L"nazwaKlasy";
  19.     WNDCLASSEX wc;
  20.     HWND hwnd;
  21.     MSG msg;
  22.     wc.cbSize = sizeof(WNDCLASSEX);
  23.     wc.style = CS_HREDRAW | CS_VREDRAW;
  24.     wc.lpfnWndProc = WndProc;
  25.     wc.cbClsExtra = 0;
  26.     wc.cbWndExtra = 0;
  27.     wc.hInstance = hInstance;
  28.     wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  29.     wc.hCursor = LoadCursor(NULL,IDC_ARROW);
  30.     wc.hbrBackground = (HBRUSH) (COLOR_WINDOW +1);
  31.     wc.lpszClassName = className;
  32.     wc.lpszMenuName = NULL;
  33.     wc.hIconSm= LoadIcon(NULL, IDI_APPLICATION);
  34.  
  35.     if(RegisterClassEx(&wc))
  36.     {
  37.         if((hwnd=CreateWindowEx(WS_EX_CLIENTEDGE, className, L"Paint",WS_OVERLAPPEDWINDOW,100, 100,900,900,NULL,NULL,hInstance,NULL))!=NULL)
  38.         {
  39.             RECT rect = {400,400,420,420};
  40.             snake.push_front(rect);
  41.             ShowWindow(hwnd, mShowCMD);
  42.             UpdateWindow(hwnd);
  43.             SetTimer(hwnd,1,100,NULL);
  44.             while(GetMessage(&msg,NULL,0,0))
  45.             {
  46.                 TranslateMessage(&msg);
  47.                 DispatchMessage(&msg);
  48.             }
  49.  
  50.         }
  51.         else
  52.             MessageBox(NULL, L"Error", L"Create Window", MB_OK);           
  53.  
  54.     }
  55.     else
  56.         MessageBox(NULL, L"Error", L"Register CLASS", MB_OK);
  57.     KillTimer(hwnd,1);
  58.     DestroyWindow(hwnd);
  59.     return 0;
  60. }
  61.  
  62. LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lparam)
  63. {
  64.     GetClientRect(hwnd,&rect);
  65.     switch(msg)
  66.     {
  67.     case WM_SIZE:
  68.         {
  69.             break;
  70.         }
  71.     case WM_PAINT:
  72.         {
  73.             HDC hdc = GetDC(hwnd);
  74.             HPEN oldPen,p1=CreatePen(PS_SOLID,1,RGB(0,0,0));
  75.             HBRUSH oldBrush,b1=CreateSolidBrush(RGB(0,255,0));
  76.             oldPen = (HPEN) SelectObject(hdc,p1);
  77.             oldBrush = (HBRUSH) SelectObject(hdc,b1);
  78.             FillRect(hdc,&rect,oldBrush);
  79.             for(snakeList::iterator iter=snake.begin();iter!=snake.end();iter++)
  80.             {
  81.                 FillRect(hdc,&(*iter),b1);
  82.             }
  83.             FillRect(hdc,&rnd,b1);
  84.             SelectObject(hdc,oldPen);
  85.             SelectObject(hdc,oldBrush);
  86.             DeleteObject(p1);
  87.             DeleteObject(b1);
  88.             ReleaseDC(hwnd,hdc);
  89.             break;
  90.         }
  91.     case WM_TIMER:
  92.         {
  93.             switch(direction)
  94.             {
  95.             case UP:
  96.                 {
  97.                     RECT r=*snake.begin();
  98.                     r.top-=20;
  99.                     r.bottom-=20;
  100.                     if(r.bottom<=rect.top)
  101.                     {
  102.                         r.bottom=rect.bottom;
  103.                         r.top=rect.bottom-20;
  104.                     }
  105.                     if(r.left==rnd.left && r.top==rnd.top)
  106.                     {
  107.                         rnd.left=(rand()%rect.right/20)*20;
  108.                         rnd.top=(rand()%rect.bottom/20)*20;
  109.                         rnd.right=rnd.left+20;
  110.                         rnd.bottom=rnd.top+20;
  111.                         snake.push_front(r);
  112.                     }
  113.                     else
  114.                     {
  115.                         snake.push_front(r);
  116.                         snake.pop_back();
  117.                     }
  118.                     break;
  119.                 }
  120.             case DOWN:
  121.                 {
  122.                     RECT r=*snake.begin();
  123.                     r.top+=20;
  124.                     r.bottom+=20;
  125.                     if(r.top>=rect.bottom)
  126.                     {
  127.                         r.top=rect.top;
  128.                         r.bottom=rect.top+20;
  129.                     }
  130.                     if(r.left==rnd.left && r.top==rnd.top)
  131.                     {
  132.                         rnd.left=(rand()%rect.right/20)*20;
  133.                         rnd.top=(rand()%rect.bottom/20)*20;
  134.                         rnd.right=rnd.left+20;
  135.                         rnd.bottom=rnd.top+20;
  136.                         snake.push_front(r);
  137.                     }
  138.                     else
  139.                     {
  140.                         snake.push_front(r);
  141.                         snake.pop_back();
  142.                     }
  143.                     break;
  144.                 }
  145.             case LEFT:
  146.                 {
  147.                     RECT r=*snake.begin();
  148.                     r.right-=20;
  149.                     r.left-=20;
  150.                     if(r.right<=rect.left)
  151.                     {
  152.                         r.right=rect.right;
  153.                         r.left=rect.right-20;
  154.                     }
  155.                     if(r.left==rnd.left && r.top==rnd.top)
  156.                     {
  157.                         rnd.left=(rand()%rect.right/20)*20;
  158.                         rnd.top=(rand()%rect.bottom/20)*20;
  159.                         rnd.right=rnd.left+20;
  160.                         rnd.bottom=rnd.top+20;
  161.                         snake.push_front(r);
  162.                     }
  163.                     else
  164.                     {
  165.                         snake.push_front(r);
  166.                         snake.pop_back();
  167.                     }
  168.                     break;
  169.                 }
  170.             case RIGHT:
  171.                 {
  172.                     RECT r=*snake.begin();
  173.                     r.right+=20;
  174.                     r.left+=20;
  175.                     if(r.left>=rect.right)
  176.                     {
  177.                         r.left=rect.left;
  178.                         r.right=rect.left+20;
  179.                     }
  180.                     if(r.left==rnd.left && r.top==rnd.top)
  181.                     {
  182.                         rnd.left=(rand()%rect.right/20)*20;
  183.                         rnd.top=(rand()%rect.bottom/20)*20;
  184.                         rnd.right=rnd.left+20;
  185.                         rnd.bottom=rnd.top+20;
  186.                         snake.push_front(r);
  187.                     }
  188.                     else
  189.                     {
  190.                         snake.push_front(r);
  191.                         snake.pop_back();
  192.                     }
  193.                     break;
  194.                 }
  195.             }
  196.             InvalidateRect(hwnd,&rect,0);
  197.             break;
  198.         }
  199.     case WM_KEYDOWN:
  200.         {
  201.             switch(wParam)
  202.             {
  203.             case VK_UP:
  204.                 direction = UP;
  205.                 break;
  206.             case VK_DOWN:
  207.                 direction = DOWN;
  208.                 break;
  209.             case VK_LEFT:
  210.                 direction = LEFT;
  211.                 break;
  212.             case VK_RIGHT:
  213.                 direction = RIGHT;
  214.                 break;
  215.             }
  216.             break;
  217.         }
  218.     case WM_DESTROY:
  219.         {
  220.             KillTimer(hwnd,1);
  221.             PostQuitMessage(0);
  222.             break;
  223.         }
  224.     }
  225.  
  226.     return DefWindowProc(hwnd,msg,wParam,lparam);
  227. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement