Advertisement
mamamaria

FootBall

Apr 24th, 2021 (edited)
180
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.77 KB | None | 0 0
  1. #include <thread>
  2. #include <mutex>
  3. #include "framework.h"
  4.  
  5. #include <cmath>
  6. #include <string>
  7. #include <ctime>
  8.  
  9. using namespace std;
  10.  
  11. HINSTANCE hInst;                                // текущий экземпляр
  12.  
  13.                                                 //МОИ ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ
  14. HWND hWnd;
  15.  
  16. ATOM                MyRegisterClass(HINSTANCE hInstance);
  17. BOOL                InitInstance(HINSTANCE, int);
  18. LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
  19.  
  20. //МОИ ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ
  21. const int WINDOW_SIZE = 700;
  22. const int rBall = 20;
  23. const int widthGoals = 10;
  24.  
  25. double xG = WINDOW_SIZE / 2, yG = WINDOW_SIZE / 2 - 200; //кординаты вратаря
  26. double xA = WINDOW_SIZE / 2 - 200, yA = WINDOW_SIZE / 2 + 250; //координаты нападающего
  27. double xD = WINDOW_SIZE / 2, yD = WINDOW_SIZE / 2 - 100; //координаты защитника
  28. double xB = xA, yB = yA - rBall; //координаты мяча
  29.  
  30. double speedB = 1; //скорость мяча
  31. double speedD = 1; //скорость защитника
  32. double speedA = 1; //скорость нападающего
  33. double speedG = 1; //скорость вратаря
  34.  
  35. double velXD = 0; double velYD = 0;
  36. double velXA = 0; double velYA = 0;
  37. double velBX = 0; double velBY=0;
  38. char whoOwn = 'a';
  39. const int rOwn = 10;
  40.  
  41.  
  42. void DrawPlayerOrBall(HDC hdc, RECT rectClient, int x, int y, char player) {
  43.     int height, width;
  44.     HBRUSH hBrush;
  45.  
  46.     switch (player) {
  47.     case 'a': {
  48.         hBrush = CreateSolidBrush(RGB(200, 50, 100));
  49.         break;
  50.     }
  51.     case 'g': {
  52.         hBrush = CreateSolidBrush(RGB(50, 100, 100));
  53.         break;
  54.     }
  55.     case 'd': {
  56.         hBrush = CreateSolidBrush(RGB(200, 200, 100));
  57.         break;
  58.     }
  59.     case 'b': {
  60.         hBrush = CreateSolidBrush(RGB(100, 100, 100));
  61.         break;
  62.     }
  63.     default: {
  64.         hBrush = CreateSolidBrush(RGB(200, 150, 100));
  65.         break;
  66.     }
  67.     }
  68.  
  69.     SelectObject(hdc, hBrush);
  70.     Ellipse(hdc, x - rBall, y - rBall, x + rBall, y + rBall);
  71.     DeleteObject(hBrush);
  72. }
  73.  
  74. void DrawGoals(HDC hdc, RECT rectClient, int x, int y, int l, int t, int r, int b) {
  75.     HBRUSH hBrush;
  76.     hBrush = CreateSolidBrush(RGB(100, 150, 100));
  77.     SelectObject(hdc, hBrush);
  78.     // int left,     int top,         int right,         int bottom
  79.     Rectangle(hdc, x - l * widthGoals, y - t * widthGoals, x + r * widthGoals, y + b * widthGoals);
  80.     DeleteObject(hBrush);
  81. }
  82. //1 1 57 1
  83. //70
  84. //60 640
  85.  
  86. void RedrawerThread() {
  87.     while (true) {
  88.         InvalidateRect(hWnd, 0, 1);
  89.         UpdateWindow(hWnd);
  90.         Sleep(30);
  91.     }
  92. }
  93.  
  94. void MovingDefender(WPARAM wParam) {
  95.  
  96.     switch (wParam) {
  97.     case VK_LEFT: /* Обрабатывает клавишу LEFT ARROW (Стрелка влево). */
  98.     {
  99.         velXD = -speedD;
  100.         velYD = 0;
  101.         break;
  102.     }
  103.     case VK_RIGHT:/* Обрабатывает клавишу RIGHT ARROW (Стрелка вправо). */
  104.     {
  105.         velXD = speedD;
  106.         velYD = 0;
  107.         break;
  108.     }
  109.     case VK_UP: /* Обрабатывает клавишу UP ARROW (Стрелка вверх). */
  110.     {
  111.         velXD = 0;
  112.         velYD = -speedD;
  113.         break;
  114.     }
  115.     case VK_DOWN: /* Обрабатывает клавишу DOWN ARROW (Стрелка вниз). */
  116.     {
  117.         velXD = 0;
  118.         velYD = speedD;
  119.         break;
  120.     }
  121.     case VK_F1: /* Обрабатывает клавишу DOWN ARROW (Стрелка вниз). */
  122.     {
  123.         if (speedD<=5)
  124.             speedD += 1;
  125.         break;
  126.     }
  127.     case VK_F2: /* Обрабатывает клавишу DOWN ARROW (Стрелка вниз). */
  128.     {
  129.         if (speedD >=1)
  130.             speedD -= 1;
  131.  
  132.         break;
  133.     }
  134.  
  135.     default:
  136.         break;
  137.     }
  138. }
  139. void MovingGoalkeeper() {
  140.    
  141.     if ((sqrt(pow(xG - xB, 2) + pow(yG - yB, 2))) <= 300) {
  142.         if (xG > xB) xG -= speedA;
  143.         else if (xG <= xB) xG += speedA;
  144.     }
  145.  
  146. }
  147.  
  148. void MovingAttacker() {
  149.     const double alpha = 1000;
  150.     const double beta = 0.1;
  151.     const double gamma = 1;
  152.     const double delta = 0.1;
  153.     double rdx = xD - xA;
  154.     double rdy = yD - yA;
  155.     double rdsquared = rdx * rdx + rdy * rdy;
  156.     double px = -rdy;
  157.     double py = rdx;
  158.     double fdx = -alpha / rdsquared * rdx + delta / rdsquared * px;
  159.     double fdy = -alpha / rdsquared * rdy + delta / rdsquared * py;
  160.     const double xGate = WINDOW_SIZE / 2;//x координата центра ворот
  161.     const double yGate = WINDOW_SIZE / 4;//y координата центра ворот
  162.     double rgx = xGate - xA;
  163.     double rgy = yGate - yA;
  164.     double rgsquared = rgx * rgx + rgy * rgy;
  165.     double coef = beta + gamma / rgsquared;
  166.     double fgx = coef * rgx;
  167.     double fgy = coef * rgy;
  168.     double fx = fdx + fgx;
  169.     double fy = fdy + fgy;
  170.     double flen = sqrt(fx * fx + fy * fy);
  171.     velXA = fx / flen * speedA;
  172.     velYA = fy / flen * speedA;
  173.  
  174.     if (sqrt(rgsquared) < 100) {
  175.         const double targetDist = 580;
  176.             double targetX = xGate;
  177.         if (xG > xGate) targetX -= targetDist;
  178.         else targetX += targetDist;
  179.         double kickX = targetX - xB;
  180.         double kickY = yGate - yB;
  181.         double kickDist = sqrt(kickX * kickX + kickY * kickY);
  182.         velBX = kickX / kickDist * speedB;
  183.         velBY = kickY / kickDist * speedB;
  184.         whoOwn = 'n';
  185.     }
  186. }
  187. void MovingBall() {
  188.     if ((sqrt(pow(xD - xB, 2) + pow(yD - yB, 2))) <= rOwn && whoOwn != 'd') whoOwn = 'd';
  189.     if ((sqrt(pow(xA - xB, 2) + pow(yA - yB, 2))) <= rOwn && whoOwn != 'a') whoOwn = 'a';
  190.     if ((sqrt(pow(xG - xB, 2) + pow(yG - yB, 2))) <= rOwn && whoOwn != 'g') whoOwn = 'g';
  191.  
  192.     switch (whoOwn) {
  193.     case 'd': {
  194.         xB = xD + rBall;
  195.         yB = yD - rBall / 2;
  196.         break;
  197.     }
  198.     case 'a': {
  199.         xB = xA + rBall;
  200.         yB = yA - rBall / 2;
  201.         break;
  202.     }
  203.     case 'g': {
  204.         xB = xG + rBall;
  205.         yB = yG - rBall / 2;
  206.         break;
  207.     }
  208.     default:
  209.         break;
  210.     }
  211.  
  212. }
  213.  
  214. void Velocity() {
  215.     while (true) {
  216.         xD += velXD;
  217.         yD += velYD;
  218.         xA += velXA;
  219.         yA += velYA;
  220.         if (whoOwn == 'n') {
  221.             xB += velBX; yB += velBY;
  222.         }
  223.         Sleep(20);
  224.         MovingBall();
  225.         MovingGoalkeeper();
  226.         MovingAttacker();
  227.     }
  228. }
  229. int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
  230.     _In_opt_ HINSTANCE hPrevInstance,
  231.     _In_ LPWSTR    lpCmdLine,
  232.     _In_ int       nCmdShow)
  233. {
  234.     UNREFERENCED_PARAMETER(hPrevInstance);
  235.     UNREFERENCED_PARAMETER(lpCmdLine);
  236.  
  237.     // TODO: Разместите код здесь.
  238.  
  239.     MyRegisterClass(hInstance);
  240.  
  241.     // Выполнить инициализацию приложения:
  242.     if (!InitInstance(hInstance, nCmdShow))
  243.     {
  244.         return FALSE;
  245.     }
  246.  
  247.     MSG msg;
  248.     srand(time(0));
  249.     // Цикл основного сообщения:
  250.  
  251.     thread TH1(RedrawerThread);
  252.     thread TH2(Velocity);
  253.     while (GetMessage(&msg, nullptr, 0, 0))
  254.     {
  255.         TranslateMessage(&msg);
  256.         DispatchMessage(&msg);
  257.     }
  258.     TH1.detach();
  259.     TH2.detach();
  260.  
  261.     return (int)msg.wParam;
  262. }
  263.  
  264. ATOM MyRegisterClass(HINSTANCE hInstance)
  265. {
  266.     WNDCLASSEXW wcex;
  267.  
  268.     wcex.cbSize = sizeof(WNDCLASSEX);
  269.  
  270.     wcex.style = CS_HREDRAW | CS_VREDRAW;
  271.     wcex.lpfnWndProc = WndProc;
  272.     wcex.cbClsExtra = 0;
  273.     wcex.cbWndExtra = 0;
  274.     wcex.hInstance = hInstance;
  275.     wcex.hIcon = NULL;
  276.     wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
  277.     wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
  278.     wcex.lpszMenuName = NULL;
  279.     wcex.lpszClassName = L"MyClass";
  280.     wcex.hIconSm = NULL;
  281.  
  282.     return RegisterClassExW(&wcex);
  283. }
  284.  
  285. BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
  286. {
  287.     hInst = hInstance; // Сохранить маркер экземпляра в глобальной переменной
  288.  
  289.     RECT rect;
  290.     rect.left = 0;
  291.     rect.right = WINDOW_SIZE;
  292.     rect.top = 0;
  293.     rect.bottom = WINDOW_SIZE;
  294.  
  295.     DWORD dwStyle = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX;
  296.     AdjustWindowRect(&rect, dwStyle, false);
  297.  
  298.  
  299.     hWnd = CreateWindowW(L"MyClass", L"Shuttle", dwStyle,
  300.         WINDOW_SIZE / 2, 0, rect.right - rect.left, rect.bottom - rect.top, nullptr, nullptr, hInstance, nullptr);
  301.  
  302.     if (!hWnd)
  303.     {
  304.         return FALSE;
  305.     }
  306.  
  307.     ShowWindow(hWnd, nCmdShow);
  308.     UpdateWindow(hWnd);
  309.  
  310.     return TRUE;
  311. }
  312.  
  313. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  314. {
  315.     switch (message)
  316.     {
  317.     case WM_KEYDOWN: {
  318.         MovingDefender(wParam);
  319.         break;
  320.  
  321.     }
  322.     case WM_KEYUP: {
  323.         velXD = 0;
  324.         velYD = 0;
  325.         break;
  326.     }
  327.     case WM_PAINT:
  328.     {
  329.         PAINTSTRUCT ps;
  330.         HDC hdc = BeginPaint(hWnd, &ps);
  331.         // TODO: Добавьте сюда любой код прорисовки, использующий HDC...
  332.         DrawGoals(hdc, ps.rcPaint, WINDOW_SIZE / 2 - 300, WINDOW_SIZE / 2 - 300, 1, 1, 1, 10);
  333.         DrawGoals(hdc, ps.rcPaint, WINDOW_SIZE / 2 - 300 + 2 * widthGoals, WINDOW_SIZE / 2 - 300, 1, 1, 57, 1);
  334.         DrawGoals(hdc, ps.rcPaint, WINDOW_SIZE / 2 + 300, WINDOW_SIZE / 2 - 300, 1, 1, 1, 10);
  335.         //goalkeeper - вратарь,  defender - защитник, attack - нападающий
  336.         DrawPlayerOrBall(hdc, ps.rcPaint, xB, yB, 'b');
  337.         DrawPlayerOrBall(hdc, ps.rcPaint, xG, yG, 'g');
  338.         DrawPlayerOrBall(hdc, ps.rcPaint, xD, yD, 'd');
  339.         DrawPlayerOrBall(hdc, ps.rcPaint, xA, yA, 'a');
  340.  
  341.         EndPaint(hWnd, &ps);
  342.     }
  343.     break;
  344.     case WM_DESTROY:
  345.         PostQuitMessage(0);
  346.         break;
  347.     default:
  348.         return DefWindowProc(hWnd, message, wParam, lParam);
  349.     }
  350.     return 0;
  351. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement