Advertisement
Guest User

WIndows Console pong

a guest
May 23rd, 2018
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 9.16 KB | None | 0 0
  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <time.h>
  5.  
  6. #define pAmmount 1 // Określa ilość piłeczek na ekreanie
  7. #define maxForce 1 // Określa maksymalną siłę / prędkość z jaką poruszają się piłeczki
  8.  
  9. // Definicje
  10. float randomF(int); // Generuje wartość pomiedzy 0.0 a max
  11. float randomD(int); // Generuje wartość pomiedzy 0 a max
  12. void initialisePoints(COORD); // Ustwaia podstawowe wartości piłeczek
  13. void debugPoints(); // Wyświetla statystyki o piłkach
  14. void drawScreen(); // Rysuje plansze gry
  15. void hideCursor(); // Chowa kursor konsoli
  16. void gotoxy(int, int); // Ustala położenie kursora w konsoli
  17. void pointsNext(); // Wykonuje operacje zwiazane z ruchem i kolizjami piłeczek
  18. void checkUserInput(); // Sprawdza działania użytkownia
  19. void initialisePads(); // Ustawia podstawowe wartości paletek
  20. int isPaddle(int, int, int); // Sprawdza czy dany punkt leży na paletce
  21. void movePaddles(); // Porusza paltekami
  22. void resetBall(int); // Przywraca podstawowe wartości piłeczce
  23. void accelerateBall(int, float); // Zmienia szybkość poruszania się wybranej piłeczki
  24.  
  25. // Struktura opisująca położenie i prędkość piłeczki
  26. struct particle
  27. {
  28.     float x;
  29.     float y;
  30.     float vX;
  31.     float vY;
  32.     float iX;
  33.     float iY;
  34. };
  35.  
  36. // Struktura opisujaca położenie i wielkość paletki
  37. struct paddle
  38. {
  39.     int x;
  40.     int y;
  41.     int l;
  42. };
  43.  
  44. // Deklaracja pojemników globalnych
  45. struct particle points[pAmmount]; // Piłeczki
  46. struct paddle pad[2]; // Paletki
  47. COORD score = {0, 0}; // Wynik
  48.  
  49. COORD size = {60, 15}; // Rozmiar planszy do gry
  50. char endGame;
  51.  
  52. int main()
  53. {
  54.     srand(time(NULL)); // Zmienia ziarno funkcji pseudolosowej wraz z upływem czasu
  55.     initialisePoints(size);
  56.     initialisePads();
  57.     hideCursor();
  58.  
  59.     //debugPoints();
  60.  
  61.     endGame = 0; // Umożliwia wyjście z gry
  62.  
  63.     // Punkt wejścia do pętli gry
  64.     while(!endGame)
  65.     {
  66.         drawScreen();
  67.     }
  68.  
  69.     return 0;
  70. }
  71.  
  72. void drawScreen()
  73. {
  74.     gotoxy(0,0);// Umieszcza kursor na początku konsoli
  75.                 // bez konieczności czyszczenia pozostałości
  76.                 // poprzedniej klatki
  77.  
  78.     /*
  79.     Zmienne x i y przechowują wirtualne położenie kursora rusyjącego w konsoli
  80.     ich wartości są ujemne aby wymusić rysowanie obramowania pola gry
  81.     w innym wypadku, trzebaby było dodawać lub odejmować granice pętli for
  82.     w karzdym przypadku, aby nie zmniejszyć pola gry o obramowanie.
  83.     */
  84.     int x = -1;
  85.     int y = -2;
  86.     int i = 0;
  87.     char isPoint = 0;
  88.  
  89.     // Wykonuje rysowanie planszy linia po linii
  90.     for(; y < size.Y + 1; y++)
  91.     {
  92.         // Rysuje wyniki rozgrywki
  93.         if(y == -2)
  94.         {
  95.             printf("Score: %d - %d\n\n", score.X, score.Y);
  96.         }
  97.         else
  98.         {
  99.             // Rysuje elementy planszy w danej linii
  100.             for(; x < size.X + 1; x++)
  101.             {
  102.                 // Sprawdza czy dana pozycja konsoli, to obramowanie
  103.                 if(
  104.                    (y == -1) ||
  105.                    (y == size.Y) ||
  106.                    (x == -1) ||
  107.                    (x == size.X)
  108.                    )
  109.                     printf("X"); // Rysuje obramowanie
  110.                 else
  111.                 {
  112.                     // Sprawdza czy dana pozycja konsoli, to paletka
  113.                     if(isPaddle(0, x, y) || isPaddle(1, x, y))
  114.                     {
  115.                         printf("H"); // Rysuje paletke
  116.                     }
  117.                     else
  118.                     {
  119.                         // Sprawdza czy dana piłeczka nie zostałą już narysowana
  120.                         // dzięki czemu nie trzeba zawsze sprawdzać całej listy piłeczek
  121.                         // i porównywać ich pozycji
  122.                         isPoint = 0;
  123.                         i = 0;
  124.                         for(; i < pAmmount; i++)
  125.                         {
  126.                             // SPrawdza czy dana pozycja w konsoli, to piłeczka
  127.                             if(((int)points[i].x == x) && ((int)points[i].y == y) && !isPoint)
  128.                             {
  129.                                 printf("O");
  130.                                 isPoint = 1;
  131.                             }
  132.                         }
  133.  
  134.                         // Rysuje pustą przestrzeń
  135.                         if(!isPoint) printf(" ");
  136.                     }
  137.                 }
  138.             }
  139.         }
  140.         x = -1;
  141.         printf("\n"); // Przechodzi do nowej lini
  142.     }
  143.  
  144.     movePaddles();
  145.     pointsNext();
  146.     //Sleep(10); // Spowalnia działanie gry (do odpluskwiania)
  147. }
  148.  
  149. void pointsNext()
  150. {
  151.     int i = 0;
  152.  
  153.     // Iteruje przez wszystkie piłeczki
  154.     for(; i<pAmmount; i++)
  155.     {
  156.         // Sprawdza czy piłeczka nie koliduje z bokami planszy
  157.         if((points[i].x <= 0) || (points[i].x >= size.X))
  158.             points[i].vX = -1 * points[i].vX; // Odwraca kierunek piłeczki
  159.  
  160.         // Gracz lewy dostaje punkt
  161.         if(points[i].x <= 0)
  162.         {
  163.             score.Y++;
  164.             resetBall(i);
  165.         }
  166.         else if(points[i].x >= size.X) // Gracz prawy dostaje punkt
  167.         {
  168.             score.X++;
  169.             resetBall(i);
  170.         }
  171.  
  172.         // Sprawdza czy piłeczka nie koliduje z grórą lub dołem planszy
  173.         if((points[i].y <= 0) || (points[i].y >= size.Y))
  174.         {
  175.             points[i].vY = -1 * points[i].vY; // Odwraca kierunek piłeczki
  176.         }
  177.  
  178.         // Sprawdza kolizje z paletką
  179.         if(isPaddle(0, points[i].x, points[i].y) || isPaddle(1, points[i].x, points[i].y))
  180.         {
  181.             points[i].vX = -1 * points[i].vX; // Odwraca kierunek piłeczki
  182.             accelerateBall(i, 1.1); // Przyspiesza piłeczkę o 10%
  183.         }
  184.  
  185.         // Porusza piłeczką
  186.         points[i].x += points[i].vX;
  187.         points[i].y += points[i].vY;
  188.     }
  189. }
  190.  
  191.  
  192. void debugPoints()
  193. {
  194.     int i = 0;
  195.     for(;i<pAmmount; i++)
  196.     {
  197.         printf("Point id: %d\n", i);
  198.         printf("\t X = %f\n", points[i].x);
  199.         printf("\t Y = %f\n", points[i].y);
  200.         printf("\t vX = %f\n", points[i].vX);
  201.         printf("\t vY = %f\n\n", points[i].vY);
  202.     }
  203. }
  204.  
  205. void initialisePoints(COORD screenSize)
  206. {
  207.     int i = 0;
  208.     for(;i<pAmmount; i++)
  209.     {
  210.         //points[i].x = randomF(screenSize.X);
  211.         //points[i].y = randomF(screenSize.Y);
  212.  
  213.         // Nadaje piłeczce pozycję na środku planszy
  214.         points[i].x = screenSize.X/2;
  215.         points[i].y = screenSize.Y/2;
  216.  
  217.         // Przypisuje losową wartość prędkości piłeczki
  218.         points[i].iX = points[i].vX = randomF(maxForce);
  219.         points[i].iY = points[i].vY = randomF(maxForce);
  220.  
  221.         // Raz na kilka piłeczek zmienia akcelercję na przeciwnoą w 1 z osi
  222.         randomF(1) > 0.5 ? points[i].vX = -points[i].vX : 0;
  223.         randomF(1) > 0.5 ? points[i].vY = -points[i].vY : 0;
  224.     }
  225. }
  226.  
  227. float randomF(int max)
  228. {
  229.     float x = (rand()%100)*0.01;
  230.     x *= (float)max;
  231.  
  232.     return x;
  233. }
  234.  
  235. float randomD(int max)
  236. {
  237.     return rand()%max;
  238. }
  239.  
  240. void gotoxy(int x, int y)
  241. {
  242.   COORD coord;
  243.   coord.X = x;
  244.   coord.Y = y;
  245.   // Funkcja tylko dla konsoli windowsa
  246.   SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
  247. }
  248.  
  249. void hideCursor()
  250. {
  251.     // Funkcje tylko dla konsoli windowsa
  252.     HANDLE consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);
  253.     CONSOLE_CURSOR_INFO info;
  254.     info.dwSize = 100;
  255.     info.bVisible = FALSE;
  256.     SetConsoleCursorInfo(consoleHandle, &info);
  257. }
  258.  
  259. int inp[5]; // przetrzymuje serię zanków wpisaneych przez użytwkoniaka
  260.  
  261. void checkUserInput()
  262. {
  263.     int i = 0;
  264.  
  265.     // Resetuje tablicę znaków
  266.     for(; i < 5; i++)
  267.     {
  268.         inp[i] = -1;
  269.     }
  270.  
  271.     i=0;
  272.  
  273.     // Zczytuje dane z stdin
  274.     while(kbhit() && i < 5)
  275.     {
  276.         inp[i] = getch();
  277.  
  278.         // Wychodzi z gry
  279.         if(inp[i] == 27)
  280.             endGame = 1;
  281.  
  282.         i++;
  283.  
  284.     }
  285. }
  286.  
  287. void initialisePads()
  288. {
  289.     pad[0].l = pad[1].l = 5; // Nadaje długość paletki
  290.     // Ustala pozycję paletki
  291.     pad[1].x = size.X - 5;
  292.     pad[0].x = 4;
  293.     // Ustala rozmiar paletki
  294.     pad[0].y = pad[1].y = (size.Y/2) - (pad[0].l/2);
  295. }
  296.  
  297. int isPaddle(int i, int x, int y)
  298. {
  299.     if(x == pad[i].x) // Sprawdza czy zadany punkt leży na osi plaetki
  300.         if((y >= pad[i].y) && (y < pad[i].y+pad[i].l)) // Sprawdza czy dany punkt to paletka
  301.             return 1;
  302.  
  303.     return 0;
  304. }
  305.  
  306. void movePaddles()
  307. {
  308.     int i = 0;
  309.  
  310.     checkUserInput();
  311.  
  312.     for(; i < 5; i++)
  313.     {
  314.         if(inp[i] != -1)
  315.         {
  316.             if(inp[i] == 80) // Porusza prawą paletką w dół
  317.             {
  318.                 if(pad[1].y+pad[1].l < size.Y)
  319.                     pad[1].y++;
  320.             }
  321.             else if(inp[i] == 72) // Porusza prawą paletką w górę
  322.             {
  323.                 if(pad[1].y > 0)
  324.                     pad[1].y--;
  325.             }
  326.  
  327.             if(inp[i] == 115) // Porusza lewą paletką w dół
  328.             {
  329.                 if(pad[0].y+pad[0].l < size.Y)
  330.                     pad[0].y++;
  331.             }
  332.             else if(inp[i] == 119) // Porusza lewą paletką w górę
  333.             {
  334.                 if(pad[0].y > 0)
  335.                     pad[0].y--;
  336.             }
  337.         }
  338.     }
  339. }
  340.  
  341. void resetBall(int i)
  342. {
  343.     points[i].x = size.X/2;
  344.     points[i].y = size.Y/2;
  345.     points[i].vX = points[i].iX;
  346.     points[i].vY = points[i].iY;
  347. }
  348.  
  349. void accelerateBall(int i, float ammount)
  350. {
  351.     if(points[i].vY < 1) points[i].vY *= ammount;
  352.     if(points[i].vX < 1) points[i].vX *= ammount;
  353. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement