Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2018
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.98 KB | None | 0 0
  1.  
  2.  
  3. #include "Snake.h"
  4.  
  5.  
  6. unsigned long   lastTick = GetTickCount(), currTick = GetTickCount();
  7. unsigned long   UPDATESPEED;
  8. unsigned int frames = 0;
  9. float fps = 60.0f;
  10. float g_speed;
  11.  
  12.  
  13. Snake::Snake(int i)
  14. {
  15.  
  16.     lastTick = GetTickCount(), currTick = GetTickCount();
  17.     frames = 0;
  18.     fps = 60.0f;
  19.  
  20.  
  21.     kolor_tla = 62,
  22.         kolor_granic = 49;
  23.     kolor_jablka = 44;
  24.     kolor_n = 15;
  25.     kolor_weza = 2;  
  26.     dlugosc_weza = 5;
  27.     jablko = 0;    
  28.     poziom = 1;
  29.     if (p_waz)>200 || p_waz<0) p_waz = 5;
  30.     c_x = 39 - (linie / 2);
  31.     c_y = 14 - (kolumny / 2);
  32.  
  33.     Gra();
  34.  
  35.  
  36. }
  37.  
  38.  
  39.  
  40. void Snake::Gra()
  41. {
  42.     Ustawienia();
  43.     Tlo_gry();
  44.     Wyrzuc_jablko();
  45.     Zainicjuj_weza();
  46.     Poka_sowe_a_wlasciwie_weza();
  47.     if (p_waz>200 || p_waz<0) p_waz = 5;
  48.  
  49.     do {
  50.         Przyciski();
  51.         Wylap_kolizje();
  52.         Sprawdz_jablko();
  53.         Sprawdz_ewe();
  54.         Lokalizacja_weza();
  55.         Poka_sowe_a_wlasciwie_weza();
  56.         CalclateFramesPerSecond();
  57.         ;
  58.  
  59.     } while ((c != 27) && (x != c_x + (linie)) && (x != c_x - 1) && (y != c_y + (kolumny)) && (y != c_y - 1)); Koniec_gry();
  60.  
  61. }
  62.  
  63.  
  64. void Snake::Ustawienia()
  65. {
  66.     ustaw_kolor(kolor_n);
  67.     linie = 15;
  68.     kolumny = 60;
  69.     poziom = 1;
  70.     srand(time(NULL));
  71.     c_x = 39 - (linie / 2);
  72.     c_y = 14 - (kolumny / 2);
  73.     if (p_waz>200 || p_waz<0) p_waz = 5;
  74.  
  75.     wyczysc_boksa(10, 8, 70, 16, 31);
  76.     boks(10, 8, 70, 16, 31, 31, "");
  77.  
  78.  
  79.     idz_do_x_y(28, 10); cprintf("Get Ready");
  80.     idz_doo_x_y(18, 12); cprintf("Use the Arrow keys on the keyboard  ");
  81.     idz_do_x_y(18, 13); cprintf("<LEFT> <RIGHT> <UP> <DOWN> to steer snake");
  82.     idz_do_x_y(18, 15); printf("Press any key to start snake");
  83.     c = _getch();
  84.  
  85. }
  86. void Snake::Tlo_gry()
  87. {
  88.     wyczysc_boksa(1, 1, 78, 24, ((16 * Jasno_zielony) + Jasno_zielony));
  89.     wyczysc_boksa(c_x - 1, c_y - 1, linie + c_x, kolumny + c_y, Zielony);
  90.     boks(c_x - 1, c_y - 1, linie + c_x, kolumny + c_y, Zielony, Bialy, "");
  91.     ustaw_kolor(kolor_n); printf("%c", 177);
  92.     for (i = 0; i <= linie + 1; i++)
  93.     {
  94.         for (j = 0; j <= kolumny + 1; j++)
  95.         {
  96.             idz_do_x_y( ( c_x - 1 ) + i, (c_y - 1) + j);
  97.             if ( ( c_x + i == c_x ) ||
  98.                 ( c_x + i - 1 == ( c_x + linie ) ) ||
  99.                 ( c_y + j == c_y ) ||
  100.                 ( c_y + j - 1 == (kolumny + c_y ) ) )
  101.             {
  102.                 ustaw_kolor(color_granicy);
  103.                 printf("%c", 178);
  104.             }
  105.             else printf("%c", 177);
  106.             ustaw_kolor(color_tla);
  107.         }
  108.     }
  109.  
  110. }
  111.  
  112. void Snake::Zainicjuj_weza()
  113. {
  114.     x = 35;
  115.     y = 14;
  116.     waz = 5;
  117.     for (i = 0; i <= 201; i++)
  118.     {
  119.         snake_x_lokalizacja[i] = 0;
  120.         snake_y_lokalizacja[i] = 0;
  121.     }
  122.     for (i = waz; i>0; i--, x++)
  123.     {
  124.         snake_x_lokalizacja[i] = x;
  125.         snake_y_lokalizacja[i] = y;
  126.     }
  127.     x--;
  128.     poprzednie_x = x; poprzednie_y = y;
  129.     kierunek = 1;          
  130.     j = 0;
  131. }
  132.  
  133. void Snake::Wylap_kolizje()
  134. {
  135.     for (i = 2; i <= waz; i++)
  136.     {
  137.         if ( ( snake_x_lokalizacja[1] == snake_x_lokalizacja[i] ) && ( snake_y_lokalizacja[1] == snake_y_lokalizacja[i] ) ) Koniec_gry();
  138.     }
  139. }
  140.  
  141. void Snake::Sprawdz_jablko()
  142. {
  143.     ustaw_kolor(kolor_jablka);
  144.     losowy_x = ( rand() % linie ) + c_x;
  145.     losowy_y = (rand() % kolumny ) + c_y;
  146.     for (i = 1; i <= waz; i++)
  147.     {
  148.         if ( ( losowy_x == snake_x_lokalizacja[i] ) && ( losowy_y == snake_y_lokalizacja[i] ) ) Wyrzuc_jablko();
  149.     }
  150.     idz_do_x_y(losowy_x, losowy_y); printf("%c", 770);
  151.     if (punkty == 1)_getch();
  152. }
  153.  
  154. void Snake::Sprawdz_jablko()
  155. {
  156.     if ( ( snake_x_lokalizacja[1] == losowy_x ) && ( snake_y_lokalizacja[1] == losowy_y ) )
  157.     {
  158.         jablko++;
  159.         Wylosuj_jablko();
  160.         waz += dlugosc_weza;
  161.         Wyrzuc_jablko();
  162.     }
  163. }
  164.  
  165. void Snake::Poka_sowe_a_wlasciwie_weza()
  166. {
  167.     for (i = waz; i >= 0; i--)
  168.     {
  169.         idz_do_x_y(snake_x_lokalizacja[i], snake_y_lokalizacja[i]);
  170.         if (i == 0)
  171.         {
  172.             ustaw_kolor(kolor_tla);
  173.             printf("%c", 177);
  174.         }
  175.         else ustaw_kolor(kolor_weza);
  176.         if (i == 1)           printf("%c", 178);
  177.         if ((i != 0) && (i != 1)) printf("%c", 219);
  178.     }
  179.     ustaw_kolor(kolor_n);
  180.     idz_do_x_y(c_x - 1, c_y + kolumny + 2);
  181.     printf("level: %2.d", poziom);
  182.     idz_do_x_y(c_x - 1, c_y + kolumny + 2 + 1);
  183.     printf("/ %2.d,eaten /%2.d apples left ", jablko, ( ( ( kolumny * linie ) / 30 ) + 6 ) );
  184.     ustaw_kolor(kolor_tla);
  185. }
  186.  
  187. void Snake::Lokalizacja_weza()
  188. {
  189.     if (p_waz>200 || p_waz<0) p_waz = 5;
  190.     if ((poprzednie_x != x) || (poprzednie_y != y))
  191.     {
  192.         if (waz == p_waz)
  193.         {
  194.  
  195.             snake_x_lokalizacja[0] = snake_x_lokalizacja[waz];
  196.             snake_y_lokalizacja[0] = snake_y_lokalizacja[waz];
  197.             for (i = waz; i>1; i--)
  198.             {
  199.                 snake_x_lokalizacja[i] = snake_x_lokalizacja[i - 1];
  200.                 snake_y_lokalizacja[i] = snake_y_lokalizacja[i - 1];
  201.             }
  202.         }
  203.         if (waz != p_waz)
  204.         {
  205.  
  206.             snake_x_lokalizacja[0] = snake_x_lokalizacja[p_waz];
  207.             snake_y_lokalizacja[0] = snake_y_lokalizacja[p_waz];
  208.             for (i = p_waz; i>1; i--)
  209.             {
  210.                 snake_x_lokalizacja[i] = snake_x_lokalizacja[i - 1];
  211.                 snake_y_lokalizacja[i] = snake_y_lokalizacja[i - 1];
  212.             }
  213.             for (i = (p_waz + 1); i <= waz; i++)
  214.             {
  215.                 snake_x_lokalizacja[i] = snake_x_lokalizacja[i - 1];
  216.                 snake_y_lokalizacja[i] = snake_y_lokalizacja[i - 1];
  217.             }
  218.         }
  219.         if (poprzednie_x != x) snake_x_lokalizacja[1] = x;       //
  220.         if (poprzednie_y != y) snake_y_lokalizacja[1] = y;       //
  221.     }
  222.     p_waz = waz;   //
  223.     poprzednie_x = x; poprzednie_y = y;    //
  224. }
  225.  
  226.  
  227.  
  228. void Snake::Przyciski()
  229. {
  230.     if (_kbhit())
  231.     {                           //
  232.         c = _getch();
  233.         switch (c)
  234.         {
  235.         case PRAWO:
  236.             if (kierunek != 3)
  237.             {
  238.                 x++;
  239.                 kierunek = 1;
  240.             }
  241.             else x--;
  242.             break;
  243.  
  244.         case LEWO:
  245.             if (kierunek != 1)
  246.             {
  247.                 x--;
  248.                 kierunek = 3;
  249.             }
  250.             else x++;
  251.             break;
  252.  
  253.         case DOl:
  254.             if (kierunek != 2)
  255.             {
  256.                 y++;
  257.                 kierunek = 4;
  258.             }
  259.             else y--;
  260.             break;
  261.  
  262.         case GORA:
  263.             if (kierunek != 4)
  264.             {
  265.                 y--;
  266.                 kierunek = 2;
  267.             }
  268.             else y++;
  269.             break;
  270.  
  271.         case SPACJA: _getch(); break;
  272.         }
  273.     }
  274.     else {                                     //
  275.         switch (kierunek)
  276.         {
  277.         case 1: x++; break;
  278.         case 3: x--; break;
  279.         case 4: y++; break;
  280.         case 2: y--; break;
  281.         }
  282.     }
  283.     switch (poziom) {                           //
  284.     case 1: poziom_trudnosci = 120; break;
  285.     case 2: poziom_trudnosci = 90; break;
  286.     case 3: poziom_trudnosci = 65; break;
  287.     case 4: poziom_trudnosci = 40; break;
  288.     case 5: poziom_trudnosci = 20; break;
  289.     case 6: poziom_trudnosci = 15; break;
  290.     }
  291.     Sleep(poziom_trudnosci);
  292. }
  293.  
  294. void Snake::Wylosuj_jablko()
  295. {
  296.     if (jablko == ( ( (kolumny*linie) / 30) + 6))
  297.     {
  298.         jablko = 0;
  299.         Wyswietl();
  300.         poziom++;
  301.         if (poziom>7)
  302.         {                          //
  303.             punkty = 0;
  304.             idz_do_x_y(30, 7);
  305.             ustaw_kolor(kolor_n);
  306.             printf(" score ");
  307.             Sleep(700);
  308.             _getch();
  309.             Gra();
  310.         }
  311.         punkty = 1;
  312.         Gra();
  313.     }
  314. }
  315.  
  316. void Snake::Koniec_gry()
  317. {
  318.  
  319.     jablko = 0;
  320.     wyczysc_ekran();
  321.     wyczysc_boksa(10, 8, 70, 16, 31);
  322.     boks(10, 8, 70, 16, 31, 31, "Game Over ");
  323.  
  324.     idz_do_x_y(18, 10); cprintf("  ");
  325.     idz_do_x_y(18, 11); cprintf("The snake has hit an obstacle");
  326.     idz_do_x_y(18, 14); cprintf("");
  327.     idz_do_x_y(18, 13); printf("play Again? (y/n)");
  328.  
  329.  
  330.     do {
  331.         powtorz_rozgrywke = _getch();
  332.         if ( ( powtorz_rozgrywke == 'y') || ( powtorz_rozgrywke == 'Y' ) )
  333.         {
  334.             linie= 0;
  335.             kolumny = 0;
  336.             Wyswietl();
  337.             Gra();
  338.         }
  339.         if ( ( powtorz_rozgrywke == 'n') ||
  340.             ( powtorz_rozgrywke == 'N'))
  341.         {
  342.             ustaw_kolor(15);
  343.             wyczysc_ekran();
  344.             idz_do_x_y(1, 23);
  345.             printf("\n              ");
  346.             exit(1);
  347.         }
  348.     } while ( ( powtorz_rozgrywke != 'y') ||
  349.         ( powtorz_rozgrywke != 'Y') ||
  350.         ( powtorz_rozgrywke != 'n') ||
  351.         ( powtorz_rozgrywke != 'N'));
  352. }
  353.  
  354. void Snake::Wyswietl()
  355. {
  356.     ustaw_kolor(0);
  357.     for (i = 0; i <= 70; i++)
  358.     {
  359.         for (j = 0; j <= 23; j++)
  360.         {
  361.             idz_do_x_y(i, j);
  362.             printf("%c", 177);
  363.         }
  364.     }
  365. }
  366.  
  367.  
  368. void Snake::ustaw_kolor(WORD kolor)
  369. {
  370.     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), kolor);
  371.     return;
  372. }
  373.  
  374. void Snake::wyczysc_ekran()
  375. {
  376.     COORD coordScreen = { 0, 0 };
  377.     DWORD cCharsWritten;
  378.     CONSOLE_SCREEN_BUFFER_INFO csbi;
  379.     DWORD dwConSize;
  380.     HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
  381.  
  382.     GetConsoleScreenBufferInfo(hConsole, &csbi);
  383.     dwConSize = csbi.dwSize.X * csbi.dwSize.Y;
  384.     FillConsoleOutputCharacter(hConsole, TEXT(' '), dwConSize, coordScreen, &cCharsWritten);
  385.     GetConsoleScreenBufferInfo(hConsole, &csbi);
  386.     FillConsoleOutputAttribute(hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten);
  387.     SetConsoleCursorPosition(hConsole, coordScreen);
  388.     return;
  389. }
  390.  
  391.  
  392. void Snake::idz_do_x_y(int x, int y)
  393. {
  394.     COORD coord;
  395.     coord.X = x; coord.Y = y;
  396.     SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
  397.     return;
  398. }
  399.  
  400.  
  401. void Snake::wyczysc_boksa(unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, unsigned char bkgcol)
  402. {
  403.     int x, y;
  404.  
  405.  
  406.     for (y = y1; y<y2; y++)
  407.     {
  408.         for (x = x1; x<x2; x++)
  409.         {
  410.             ustaw_kolor(bkgcol);
  411.             idz_do_x_y(x, y); cprintf(" ");
  412.         }
  413.     }
  414. }
  415.  
  416.  
  417. void Snake::boks(unsigned x, unsigned y, unsigned sx, unsigned sy, unsigned char col, unsigned char col2, char text_[])
  418. {
  419.     unsigned i, j, k = 0, m;
  420.     {
  421.  
  422.         m = (sx - x);
  423.         j = m / 8;
  424.         j = j - 1;
  425.  
  426.  
  427.         ustaw_kolor(col2);
  428.         idz_do_x_y(x, y); cprintf("É");
  429.         idz_do_x_y(sx, y); cprintf("»");
  430.         idz_do_x_y(x, sy); cprintf("Č");
  431.         idz_do_x_y(sx, sy); cprintf("Ľ");
  432.  
  433.         for (i = x + 1; i<sx; i++)
  434.         {
  435.             idz_do_x_y(i, y); cprintf("Í");
  436.             idz_do_x_y(i, sy); cprintf("Í");
  437.         }
  438.  
  439.         for (i = y + 1; i<sy; i++)
  440.         {
  441.             idz_do_x_y(x, i); cprintf("ş");
  442.             idz_do_x_y(sx, i); cprintf("ş");
  443.         }
  444.         ustaw_kolor(col);
  445.         idz_do_x_y(x + j, y); cprintf(text_);
  446.         idz_do_x_y(1, 24);
  447.  
  448.  
  449.     }
  450. }
  451.  
  452.  
  453.  
  454. void Snake::umiesc_boksa(unsigned x1, unsigned y1, unsigned x2, unsigned y2, unsigned char texcol, unsigned char frcol, unsigned char bkgcol, char bheader[])
  455. {
  456.     wyczysc_boksa(x1, y1, x2, y2, bkgcol);
  457.     boks(x1, y1, x2, y2, texcol, frcol, bheader);
  458.  
  459. }
  460.  
  461.  
  462. void Snake::CalclateFramesPerSecond()
  463. {
  464.     currTick = GetTickCount();
  465.     unsigned long   tickDiff = currTick - lastTick;
  466.     frames++;
  467.     if (tickDiff >= UPDATESPEED)
  468.     {
  469.  
  470.         lastTick = currTick;
  471.         float calcVal = 1 / ((float)UPDATESPEED / 1000.0f);
  472.         float fpsCalc = (float)frames*calcVal;     
  473.         fps += fpsCalc;
  474.         fps /= 2;
  475.  
  476.  
  477.         ustaw_kolor(31); idz_do_x_y(60, 22); printf(" %d FPS ", tickDiff); ustaw_kolor(15);
  478.  
  479.         frames = 0;
  480.         g_speed = 60 / fps;
  481.     }
  482. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement