Advertisement
hugol

Untitled

Dec 2nd, 2014
260
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.67 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <list>
  3. #include <algorithm>
  4. #include <ctime>
  5. #include <string>
  6. #include "graphics.h"
  7.  
  8. using namespace std;
  9.  
  10. struct POINT_t
  11. {
  12.     int x;
  13.     int y;
  14.     POINT_t(int x=0, int y=0)
  15.     {
  16.         POINT_t::x = x;
  17.         POINT_t::y = y;
  18.     }
  19. };
  20.  
  21. #define GORA 72
  22. #define DOL 80
  23. #define LEWO 75
  24. #define PRAWO 77
  25. #define ESC 27
  26. #define F1 59
  27. #define S 83
  28. #define s 115
  29. #define U 85
  30. #define u 117
  31. #define ENTER 13
  32.  
  33. static char* MENU_TEXTS[4] = {"START GRY", "USTAWIENIA", "KONIEC", "POMOC"};
  34.  
  35. // id zaczyna sie od 0 i rosnie o 1 dla kolejnych pozycji
  36. #define ID_START 0
  37. #define ID_USTAWIENIA 1
  38. #define ID_KONIEC 2
  39. #define ID_POMOC 3
  40.  
  41. char itoa_buff[15];
  42. string infobartext;
  43.  
  44. int delay_time = 100;   // czas pomiedzy krokami weza
  45.  
  46. int getkey(void)
  47. {
  48.     int z = 0;
  49.     if (kbhit())
  50.     {
  51.         z=getch();
  52.         switch(z)
  53.         {
  54.         case 0:
  55.         case 224:
  56.             z=getch();
  57.         }
  58.     }
  59.     return z;
  60. }
  61.  
  62.  
  63. void infobar(string text)
  64. {
  65.     setcolor(WHITE);
  66.     setbkcolor(BLACK);
  67.     outtextxy(5, 480-25, (char*)text.c_str());  // z jakiejs przyczyny outtextxy jako parametr potrzebuje char* nie const char*
  68. }
  69.  
  70.  
  71. /* funkcja zwraca
  72. #define ID_START 0
  73. #define ID_USTAWIENIA 1
  74. #define ID_KONIEC 2
  75. #define ID_POMOC 3
  76. */
  77. int MENU(void){
  78.  
  79.     int choice = 0; // wybor (pozycja menu)
  80.     int width = 100, height = 30;   // szerokosc i wysokosc pozycji w menu
  81.     int posx = 640/2-(width/2); // srodek dla szerokosci width
  82.     int posy = 200; // pozycja w osi OX poczatku menu
  83.     int verticaloffset = 50; // odstep pomiedzy poczatkami kolejnych pozycji menu
  84.     int heightoffset = -8;  // przesuniecie ramki wzgledem textu tak aby text byl w srodku ramki w osi OY
  85.     int sr; // zmienna pomocnicza do wyznaczania srodka tekstu
  86.     int key = 0; // przechowywanie id wcisnietego klawisza
  87.  
  88.     cleardevice(); // czyszczenie ekranu
  89.  
  90.     while(1)
  91.     {
  92.         for(int i=0; i<4; i++)
  93.         {
  94.             if (choice == i)
  95.             {
  96.                 setcolor(GREEN);
  97.                 setfillstyle(SOLID_FILL,YELLOW);
  98.             }
  99.             else
  100.             {
  101.                 setcolor(BLACK);
  102.                 setfillstyle(SOLID_FILL,BLACK);
  103.             }
  104.  
  105.             rectangle(posx, posy+heightoffset+verticaloffset*i, posx+width, posy+height+heightoffset+verticaloffset*i);
  106.             floodfill(posx+5,posy+heightoffset+5+verticaloffset*i, GREEN);
  107.         }
  108.         for(int i=0; i<4; i++)
  109.         {
  110.             if (choice == i)
  111.             {
  112.                 setcolor(BLACK);
  113.                 setbkcolor(YELLOW);
  114.             }
  115.             else
  116.             {
  117.                 setcolor(WHITE);
  118.                 setbkcolor(BLACK);
  119.             }
  120.  
  121.             sr = textwidth(MENU_TEXTS[i]); 
  122.             sr = width-sr;  // obliczenie srodka
  123.             outtextxy(posx+(sr/2), posy+verticaloffset*i, MENU_TEXTS[i]);
  124.         }
  125.  
  126.  
  127.         itoa(key, itoa_buff, 10);
  128.         infobartext = "Klawisz: ";
  129.         infobartext.append(itoa_buff);
  130.         infobar(infobartext);
  131.         key = getch();
  132.  
  133.  
  134.         switch(key)
  135.         {
  136.         case(DOL):
  137.             choice = choice < 3 ? choice+1 : choice;
  138.             break;
  139.         case(GORA):
  140.             choice = choice > 0 ? choice-1 : choice;
  141.             break;
  142.         case(ENTER):
  143.             return choice;
  144.             break;
  145.         default:
  146.             break;
  147.         }
  148.     }
  149.  
  150.     return 0;
  151. }
  152.  
  153. // przystosowana pod rozmiar planszy 38 x 27
  154. void rysujcialo(int x, int y, bool usun = false)
  155. {
  156.     int color = GREEN;
  157.     if (usun)
  158.     {
  159.         color = BLACK;
  160.     }
  161.     else
  162.     {
  163.         color = GREEN;
  164.     }
  165.     setcolor(color);
  166.     setfillstyle(SOLID_FILL,color);
  167.     rectangle(18 + x*16, 16+y*16, 34 + x*16, 32+y*16);
  168.     floodfill(22 + x*16,20 + y*16, color);
  169. }
  170.  
  171. // przystosowana pod rozmiar planszy 38 x 27
  172. void rysujjedzenie(int x, int y)
  173. {
  174.     setcolor(RED);
  175.     setfillstyle(SOLID_FILL,RED);
  176.     circle((18 + x*16+34 + x*16)/2, (16+y*16+32+y*16)/2, 7);
  177.     floodfill((18 + x*16+34 + x*16)/2, (16+y*16+32+y*16)/2, RED);
  178. }
  179.  
  180. bool czywaz(POINT_t cialko, list<POINT_t> waz)
  181. {
  182.     for (std::list<POINT_t>::iterator it=waz.begin(); it != waz.end(); ++it)
  183.     {
  184.         if (cialko.x == it->x && cialko.y == it->y )
  185.             return true;
  186.     }
  187.     return false;
  188. }
  189.  
  190. int GRA(void)
  191. {
  192.     srand(time(NULL));  //seed randoma
  193.     cleardevice(); // czyszczenie ekranu
  194.     list<POINT_t> waz;  // lista przechowujaca weza
  195.     int kierunek = PRAWO;   // kierunek weza
  196.     int key = 0; //przechowywanie inforacji o klawiszu
  197.     bool najedzony = true;  // czy waz ma sie wydluzyc ?
  198.     bool przegrana = false; // czy doszlo do ugryzienia
  199.     POINT_t glowa(18,13);
  200.     waz.push_front(POINT_t(17,13));
  201.     waz.push_front(glowa);
  202.     POINT_t jedzenie;
  203.     int dlugosc = 2;
  204.     int predkosc = 10000/delay_time;
  205.  
  206.  
  207.     // przygotowanie obramowania obszaru gry
  208.     setcolor(GREEN);
  209.     setfillstyle(SOLID_FILL,GREEN);
  210.     rectangle(12, 10, 616, 480-32-10);
  211.     floodfill(101,101, GREEN);
  212.  
  213.     setcolor(BLACK);
  214.     setfillstyle(SOLID_FILL,BLACK);
  215.     rectangle(18, 16, 610, 480-32-16);
  216.     floodfill(101,101, BLACK);
  217.     // obszar gry 38 x 27
  218.  
  219.     while(1)
  220.     {
  221.         if (najedzony)
  222.         {
  223.             do
  224.             {
  225.                 jedzenie.x = rand()%37;
  226.                 jedzenie.y = rand()%26;
  227.             } while (czywaz(jedzenie, waz));    // losowanie jedzonka
  228.  
  229.             rysujjedzenie(jedzenie.x, jedzenie.y);
  230.         }
  231.  
  232.         for (std::list<POINT_t>::iterator it=waz.begin(); it != waz.end(); ++it)
  233.         {
  234.             rysujcialo(it->x,it->y);
  235.         }
  236.  
  237.         infobartext = "Dlugosc: ";
  238.         itoa(dlugosc, itoa_buff, 10);
  239.         infobartext.append(itoa_buff);
  240.         infobartext.append(", Predkosc: ");
  241.         itoa(predkosc, itoa_buff, 10);
  242.         infobartext.append(itoa_buff);
  243.         infobar(infobartext);
  244.  
  245.         delay(delay_time);
  246.         key = getkey();
  247.         switch(key)
  248.         {
  249.         case(DOL):
  250.             if (kierunek!=GORA)
  251.                 kierunek = DOL;
  252.             break;
  253.         case(GORA):
  254.             if (kierunek!=DOL) 
  255.                 kierunek = GORA;
  256.             break;
  257.         case(LEWO):
  258.             if (kierunek!=PRAWO)   
  259.                 kierunek = LEWO;
  260.             break;
  261.         case(PRAWO):
  262.             if (kierunek!=LEWO)
  263.                 kierunek = PRAWO;
  264.             break;
  265.         }
  266.  
  267.         switch(kierunek)
  268.         {
  269.         case(PRAWO):
  270.             glowa.x++;
  271.             if (glowa.x<=36 && !czywaz(glowa, waz))
  272.             {
  273.                 waz.push_front(POINT_t(glowa));
  274.             }
  275.             else
  276.                 przegrana = true;
  277.             break;
  278.         case(LEWO):
  279.             glowa.x--;
  280.             if (glowa.x>=0 && !czywaz(glowa, waz))
  281.             {
  282.                 waz.push_front(POINT_t(glowa));
  283.             }
  284.             else
  285.                 przegrana = true;
  286.             break;
  287.         case(DOL):
  288.             glowa.y++;
  289.             if (glowa.y<=25 && !czywaz(glowa, waz))
  290.             {
  291.                 waz.push_front(POINT_t(glowa));
  292.             }
  293.             else
  294.                 przegrana = true;
  295.             break;
  296.         case(GORA):
  297.             glowa.y--;
  298.             if (glowa.y>=0 && !czywaz(glowa, waz))
  299.             {
  300.                 waz.push_front(POINT_t(glowa));
  301.             }
  302.             else
  303.                 przegrana = true;
  304.             break;
  305.         }
  306.  
  307.         if (przegrana)
  308.             break;
  309.  
  310.         if(glowa.x == jedzenie.x && glowa.y == jedzenie.y)
  311.         {
  312.             dlugosc++;
  313.             najedzony = true;
  314.         }
  315.         else
  316.         {
  317.             najedzony = false;
  318.         }
  319.  
  320.  
  321.  
  322.         // usuniecie tylka
  323.         if (!najedzony && waz.size()>0)
  324.         {
  325.             rysujcialo(waz.back().x, waz.back().y, true);
  326.             waz.pop_back();
  327.         }
  328.  
  329.     }
  330.  
  331.  
  332.     return 1;
  333. }
  334.  
  335. int main ()
  336. {
  337.  
  338.  
  339.     // inicjowanie grafiki, okienko 640 x 480
  340.     initwindow(640, 480);
  341.     int wybor;
  342.     do
  343.     {
  344.         wybor = MENU();
  345.         switch(wybor)
  346.         {
  347.         case(ID_START):
  348.             wybor = GRA();
  349.             break;
  350.         }
  351.     }
  352.     while (wybor != ID_KONIEC);
  353.  
  354.     getch();
  355.     closegraph();
  356.  
  357. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement