Advertisement
hugol

Untitled

Dec 2nd, 2014
198
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.79 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.  
  181. int GRA(void)
  182. {
  183.     srand(time(NULL));  //seed randoma
  184.     cleardevice(); // czyszczenie ekranu
  185.     list<POINT_t> waz;  // lista przechowujaca weza
  186.     int kierunek = PRAWO;   // kierunek weza
  187.     int key = 0; //przechowywanie inforacji o klawiszu
  188.     bool najedzony = true;  // czy waz ma sie wydluzyc ?
  189.     bool przegrana = false; // czy doszlo do ugryzienia
  190.     bool mapa[37][26] = {}; // mapa czy snejk; inicjalizacja na false
  191.  
  192.     POINT_t glowa(18,13);
  193.     waz.push_front(POINT_t(17,13));
  194.     mapa[17][13] = true;
  195.     waz.push_front(glowa);
  196.     mapa[glowa.x][glowa.y] = true;
  197.     POINT_t jedzenie;
  198.     int dlugosc = 2;
  199.     int predkosc = 10000/delay_time;
  200.  
  201.  
  202.     // przygotowanie obramowania obszaru gry
  203.     setcolor(GREEN);
  204.     setfillstyle(SOLID_FILL,GREEN);
  205.     rectangle(12, 10, 616, 480-32-10);
  206.     floodfill(101,101, GREEN);
  207.  
  208.     setcolor(BLACK);
  209.     setfillstyle(SOLID_FILL,BLACK);
  210.     rectangle(18, 16, 610, 480-32-16);
  211.     floodfill(101,101, BLACK);
  212.     // obszar gry 38 x 27
  213.  
  214.     while(1)
  215.     {
  216.         if (najedzony)
  217.         {
  218.             do
  219.             {
  220.                 jedzenie.x = rand()%37;
  221.                 jedzenie.y = rand()%26;
  222.             } while (mapa[jedzenie.x][jedzenie.y]); // losowanie jedzonka
  223.  
  224.             rysujjedzenie(jedzenie.x, jedzenie.y);
  225.         }
  226.  
  227.         for (std::list<POINT_t>::iterator it=waz.begin(); it != waz.end(); ++it)
  228.         {
  229.             rysujcialo(it->x,it->y);
  230.         }
  231.  
  232.         infobartext = "Dlugosc: ";
  233.         itoa(dlugosc, itoa_buff, 10);
  234.         infobartext.append(itoa_buff);
  235.         infobartext.append(", Predkosc: ");
  236.         itoa(predkosc, itoa_buff, 10);
  237.         infobartext.append(itoa_buff);
  238.         infobar(infobartext);
  239.  
  240.         delay(delay_time);
  241.         key = getkey();
  242.         switch(key)
  243.         {
  244.         case(DOL):
  245.             if (kierunek!=GORA)
  246.                 kierunek = DOL;
  247.             break;
  248.         case(GORA):
  249.             if (kierunek!=DOL) 
  250.                 kierunek = GORA;
  251.             break;
  252.         case(LEWO):
  253.             if (kierunek!=PRAWO)   
  254.                 kierunek = LEWO;
  255.             break;
  256.         case(PRAWO):
  257.             if (kierunek!=LEWO)
  258.                 kierunek = PRAWO;
  259.             break;
  260.         }
  261.  
  262.         switch(kierunek)
  263.         {
  264.         case(PRAWO):
  265.             glowa.x++;
  266.             if (glowa.x<=36 && !mapa[glowa.x][glowa.y])
  267.             {
  268.                 waz.push_front(POINT_t(glowa));
  269.                 mapa[glowa.x][glowa.y] = true;
  270.             }
  271.             else
  272.                 przegrana = true;
  273.             break;
  274.         case(LEWO):
  275.             glowa.x--;
  276.             if (glowa.x>=0 && !mapa[glowa.x][glowa.y])
  277.             {
  278.                 waz.push_front(POINT_t(glowa));
  279.                 mapa[glowa.x][glowa.y] = true;
  280.             }
  281.             else
  282.                 przegrana = true;
  283.             break;
  284.         case(DOL):
  285.             glowa.y++;
  286.             if (glowa.y<=25 && !mapa[glowa.x][glowa.y])
  287.             {
  288.                 waz.push_front(POINT_t(glowa));
  289.                 mapa[glowa.x][glowa.y] = true;
  290.             }
  291.             else
  292.                 przegrana = true;
  293.             break;
  294.         case(GORA):
  295.             glowa.y--;
  296.             if (glowa.y>=0 && !mapa[glowa.x][glowa.y])
  297.             {
  298.                 waz.push_front(POINT_t(glowa));
  299.                 mapa[glowa.x][glowa.y] = true;
  300.             }
  301.             else
  302.                 przegrana = true;
  303.             break;
  304.         }
  305.  
  306.         if (przegrana)
  307.             break;
  308.  
  309.         if(glowa.x == jedzenie.x && glowa.y == jedzenie.y)
  310.         {
  311.             dlugosc++;
  312.             najedzony = true;
  313.         }
  314.         else
  315.         {
  316.             najedzony = false;
  317.         }
  318.  
  319.  
  320.  
  321.         // usuniecie tylka
  322.         if (!najedzony && waz.size()>0)
  323.         {
  324.             rysujcialo(waz.back().x, waz.back().y, true);
  325.             mapa[waz.back().x][waz.back().y] = false;
  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