Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <list>
- #include <algorithm>
- #include <ctime>
- #include <string>
- #include "graphics.h"
- using namespace std;
- struct POINT_t
- {
- int x;
- int y;
- POINT_t(int x=0, int y=0)
- {
- POINT_t::x = x;
- POINT_t::y = y;
- }
- };
- #define GORA 72
- #define DOL 80
- #define LEWO 75
- #define PRAWO 77
- #define ESC 27
- #define F1 59
- #define S 83
- #define s 115
- #define U 85
- #define u 117
- #define ENTER 13
- static char* MENU_TEXTS[4] = {"START GRY", "USTAWIENIA", "KONIEC", "POMOC"};
- // id zaczyna sie od 0 i rosnie o 1 dla kolejnych pozycji
- #define ID_START 0
- #define ID_USTAWIENIA 1
- #define ID_KONIEC 2
- #define ID_POMOC 3
- char itoa_buff[15];
- string infobartext;
- int delay_time = 100; // czas pomiedzy krokami weza
- int getkey(void)
- {
- int z = 0;
- if (kbhit())
- {
- z=getch();
- switch(z)
- {
- case 0:
- case 224:
- z=getch();
- }
- }
- return z;
- }
- void infobar(string text)
- {
- setcolor(WHITE);
- setbkcolor(BLACK);
- outtextxy(5, 480-25, (char*)text.c_str()); // z jakiejs przyczyny outtextxy jako parametr potrzebuje char* nie const char*
- }
- /* funkcja zwraca
- #define ID_START 0
- #define ID_USTAWIENIA 1
- #define ID_KONIEC 2
- #define ID_POMOC 3
- */
- int MENU(void){
- int choice = 0; // wybor (pozycja menu)
- int width = 100, height = 30; // szerokosc i wysokosc pozycji w menu
- int posx = 640/2-(width/2); // srodek dla szerokosci width
- int posy = 200; // pozycja w osi OX poczatku menu
- int verticaloffset = 50; // odstep pomiedzy poczatkami kolejnych pozycji menu
- int heightoffset = -8; // przesuniecie ramki wzgledem textu tak aby text byl w srodku ramki w osi OY
- int sr; // zmienna pomocnicza do wyznaczania srodka tekstu
- int key = 0; // przechowywanie id wcisnietego klawisza
- cleardevice(); // czyszczenie ekranu
- while(1)
- {
- for(int i=0; i<4; i++)
- {
- if (choice == i)
- {
- setcolor(GREEN);
- setfillstyle(SOLID_FILL,YELLOW);
- }
- else
- {
- setcolor(BLACK);
- setfillstyle(SOLID_FILL,BLACK);
- }
- rectangle(posx, posy+heightoffset+verticaloffset*i, posx+width, posy+height+heightoffset+verticaloffset*i);
- floodfill(posx+5,posy+heightoffset+5+verticaloffset*i, GREEN);
- }
- for(int i=0; i<4; i++)
- {
- if (choice == i)
- {
- setcolor(BLACK);
- setbkcolor(YELLOW);
- }
- else
- {
- setcolor(WHITE);
- setbkcolor(BLACK);
- }
- sr = textwidth(MENU_TEXTS[i]);
- sr = width-sr; // obliczenie srodka
- outtextxy(posx+(sr/2), posy+verticaloffset*i, MENU_TEXTS[i]);
- }
- itoa(key, itoa_buff, 10);
- infobartext = "Klawisz: ";
- infobartext.append(itoa_buff);
- infobar(infobartext);
- key = getch();
- switch(key)
- {
- case(DOL):
- choice = choice < 3 ? choice+1 : choice;
- break;
- case(GORA):
- choice = choice > 0 ? choice-1 : choice;
- break;
- case(ENTER):
- return choice;
- break;
- default:
- break;
- }
- }
- return 0;
- }
- // przystosowana pod rozmiar planszy 38 x 27
- void rysujcialo(int x, int y, bool usun = false)
- {
- int color = GREEN;
- if (usun)
- {
- color = BLACK;
- }
- else
- {
- color = GREEN;
- }
- setcolor(color);
- setfillstyle(SOLID_FILL,color);
- rectangle(18 + x*16, 16+y*16, 34 + x*16, 32+y*16);
- floodfill(22 + x*16,20 + y*16, color);
- }
- // przystosowana pod rozmiar planszy 38 x 27
- void rysujjedzenie(int x, int y)
- {
- setcolor(RED);
- setfillstyle(SOLID_FILL,RED);
- circle((18 + x*16+34 + x*16)/2, (16+y*16+32+y*16)/2, 7);
- floodfill((18 + x*16+34 + x*16)/2, (16+y*16+32+y*16)/2, RED);
- }
- bool czywaz(POINT_t cialko, list<POINT_t> waz)
- {
- for (std::list<POINT_t>::iterator it=waz.begin(); it != waz.end(); ++it)
- {
- if (cialko.x == it->x && cialko.y == it->y )
- return true;
- }
- return false;
- }
- int GRA(void)
- {
- srand(time(NULL)); //seed randoma
- cleardevice(); // czyszczenie ekranu
- list<POINT_t> waz; // lista przechowujaca weza
- int kierunek = PRAWO; // kierunek weza
- int key = 0; //przechowywanie inforacji o klawiszu
- bool najedzony = true; // czy waz ma sie wydluzyc ?
- bool przegrana = false; // czy doszlo do ugryzienia
- POINT_t glowa(18,13);
- waz.push_front(POINT_t(17,13));
- waz.push_front(glowa);
- POINT_t jedzenie;
- int dlugosc = 2;
- int predkosc = 10000/delay_time;
- // przygotowanie obramowania obszaru gry
- setcolor(GREEN);
- setfillstyle(SOLID_FILL,GREEN);
- rectangle(12, 10, 616, 480-32-10);
- floodfill(101,101, GREEN);
- setcolor(BLACK);
- setfillstyle(SOLID_FILL,BLACK);
- rectangle(18, 16, 610, 480-32-16);
- floodfill(101,101, BLACK);
- // obszar gry 38 x 27
- while(1)
- {
- if (najedzony)
- {
- do
- {
- jedzenie.x = rand()%37;
- jedzenie.y = rand()%26;
- } while (czywaz(jedzenie, waz)); // losowanie jedzonka
- rysujjedzenie(jedzenie.x, jedzenie.y);
- }
- for (std::list<POINT_t>::iterator it=waz.begin(); it != waz.end(); ++it)
- {
- rysujcialo(it->x,it->y);
- }
- infobartext = "Dlugosc: ";
- itoa(dlugosc, itoa_buff, 10);
- infobartext.append(itoa_buff);
- infobartext.append(", Predkosc: ");
- itoa(predkosc, itoa_buff, 10);
- infobartext.append(itoa_buff);
- infobar(infobartext);
- delay(delay_time);
- key = getkey();
- switch(key)
- {
- case(DOL):
- if (kierunek!=GORA)
- kierunek = DOL;
- break;
- case(GORA):
- if (kierunek!=DOL)
- kierunek = GORA;
- break;
- case(LEWO):
- if (kierunek!=PRAWO)
- kierunek = LEWO;
- break;
- case(PRAWO):
- if (kierunek!=LEWO)
- kierunek = PRAWO;
- break;
- }
- switch(kierunek)
- {
- case(PRAWO):
- glowa.x++;
- if (glowa.x<=36 && !czywaz(glowa, waz))
- {
- waz.push_front(POINT_t(glowa));
- }
- else
- przegrana = true;
- break;
- case(LEWO):
- glowa.x--;
- if (glowa.x>=0 && !czywaz(glowa, waz))
- {
- waz.push_front(POINT_t(glowa));
- }
- else
- przegrana = true;
- break;
- case(DOL):
- glowa.y++;
- if (glowa.y<=25 && !czywaz(glowa, waz))
- {
- waz.push_front(POINT_t(glowa));
- }
- else
- przegrana = true;
- break;
- case(GORA):
- glowa.y--;
- if (glowa.y>=0 && !czywaz(glowa, waz))
- {
- waz.push_front(POINT_t(glowa));
- }
- else
- przegrana = true;
- break;
- }
- if (przegrana)
- break;
- if(glowa.x == jedzenie.x && glowa.y == jedzenie.y)
- {
- dlugosc++;
- najedzony = true;
- }
- else
- {
- najedzony = false;
- }
- // usuniecie tylka
- if (!najedzony && waz.size()>0)
- {
- rysujcialo(waz.back().x, waz.back().y, true);
- waz.pop_back();
- }
- }
- return 1;
- }
- int main ()
- {
- // inicjowanie grafiki, okienko 640 x 480
- initwindow(640, 480);
- int wybor;
- do
- {
- wybor = MENU();
- switch(wybor)
- {
- case(ID_START):
- wybor = GRA();
- break;
- }
- }
- while (wybor != ID_KONIEC);
- getch();
- closegraph();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement