+skyler_sdf Posted December 9, 2011 Report Posted December 9, 2011 Programul pe care il prezint in continuare realizeaza o animatie a unor obiecte grafice de diferite tipuri si forme. Este vorba despre un joc in care trebuie sa prindeti mai multi fluturi(numarul lor este introdus de la tastatura), cu ajutorul unui omulet care are intr.o mana o plasa de prins fluturi. Totul se desfasoara intr.un cadru natural, reprezentat de un soare care straluceste si doi nori care se deplaseaza pe cer. Fluturii zboara aleator, iar omul care ii prinde este deplasat de catre jucator. Exista doua variante ale jocului, una in care deplasarea se face cu ajutorul tastelor cursor si alta in care deplasarea se realizeaza cu ajutorul mouse.ului. Ideea de baza in realizarea programului este relativ simpla. Se defineste o clasa abstracta Obiect, din care apoi se deriveaza clasele corespunzatoare tuturor obiectelor grafice care apar pe ecran. clasa abstracta este caracterizata de doua campuri care reprezinta coordonatele obiectului, plus inca doua reprezentand deplasarile pe orizontala si pe verticala. De asemenea exista trei metode pure, implementate la nivelul claselor derivate, concrete: una pentru deplasarea unui obiect, care apeleaza altele doua:una care sterge obiectul(din pozitia veche) si alta care il redeseneaza(in pozitia noua). #include<iostream.h> #include<graphics.h> #include<stdlib.h> #include<conio.h> //definirea clasei abstracte obiect class Obiect{ //x si y sunt coordonatele obiectului //dx si dy reprezinta deplasarile {-1, 0, 1} //aceste 4 campuri vor fi recunosute de urmasi (clasele derivate) protected: int x, y, dx, dy; //metode publice public: //constructori Obiect() { }; Obiect(int x0, int y0); //metode de desenare, mutare si stergere a obiectelor sunt pure si virtuale, deci vor fi definite in cadrul claselor derivate virtual void Deseneaza()=0; virtual void Muta()=0; virtual void Sterge()=0; }; //clasa soare este derivata din clasa obiect, in mod public class Soare: public Obiect{ private: //un soare se poate afla in doua ipostaze, in functie de cum sunt dispuse razele int ipostaza; public: //constructorul clasei soare va primi coordonatele initiale precum si ipostaza initiala a soarelui Soare(int x0, int y0, int ipostaza0); //cele trei metode vor fi redefinite void Deseneaza(); void Muta(); void Sterge(); }; //derivare similara si in cazul clasei Nor class Nor: public Obiect{ public: Nor(int x0, int y0); void Deseneaza(); void Muta(); void Sterge(); }; //...in in cazul clasei fluture class Fluture: public Obiect{ public: //un fluture poate fi vizibil cand zboara //sau invizibil cand a fost capturat int vizibil; Fluture(); //constructorul, fara parametri int GetX(); //functie ce returneaza coordonata x a fluturelui int GetY(); //functie ce returneaza coordonata y a fluturelui void Deseneaza(); void Muta(); void Sterge(); } F[10]; //am declarat un vector F de maxim 10 fluturi int NrInfinitFluturi; //numarul initial de fluturi care va fi dat de la tastatura int NrFluturi; //numarul curent de fluturi care scade de fiecare data cand se prinde un fluture //clasa Om, derivata public din clasa Obiect class Om: public Obiect{ public: Om(int x0, int y0); int GetPX; //coordonata x a paletei de prins fluturi int GetPY; //coordonata y a paletei de prins fluturi void Deseneaza(); void Muta(); void Sterge(); }; //clasa abstracta Obiect: definire constructor Obiect::Obiect(int x0, int y0) { x=x0; y=y0; } //clasa Soare: definire metode Soare::Soare(int x0, int y0, int ipostaza0) { x=x0; y=y0; ipostaza=ipostaza0; } //functia de desenare void Soare::Deseneaza() { circle(x, y, 20); //un cerc de raza 20pixeli //daca se alfa in ipostaza 1, atunci se deseneaza //4 raze verticale si orizontale if(ipostaza==1) { line(x-40, y, x-20, y); line(x+20, y, y+40, y); line(x, y-40, x, y-20); line(x, y+40, x, y+40; } else //in ipostaza 2 se deseneaza raza oblice { line(x-14, y-14, x-34, y-34); line(x-14, y+14, x-34, y+34); line(x+14, y-14, x+34, y-34); line(x+14, y+14, x+34, y+34); } } //stergerea soarelui este defapt, o redesenare cu negru void Soare::Sterge() { setcolor(BLACK); Deseneaza(); setcolor(WHITE); } //functia de mutare a soarelui //nu este o mutare propriu-zisa, ci doar o reafisare in noua ipostaza void Soare::Muta() { Sterge(); ipostaza=3-ipostaza; //schimbarea ipostazei 1<->2 Deseneaza(); } //constructorul clasei Nor; deplasarea initiala este spre stanga Nor::Nor(int x0, int y0) { ellipse(x, y, 360, 70, 30); } //functia de sterger a unui obiect din clasa Nor void Nor::Sterge() { setcolor(BLACK); Deseneaza(); setcolor(WHITE); } //functia de mutare a unui obiect din clasa Nor daca obiectul ajunge cu centrul (x, y) in capete, se schimba sensul deplasarii pe orinzontala void Nor::Muta() { Sterge(); x+=10*dx; if(x<0) { x=0; dx=-dx; } if(x>getmax()) { x=getmaxx(); dx=-dx; } Deseneaza(); } //constructorul clasei Fluture intializeaza automat x si y, intr.o zona dreptunghiulara a ecranului //dx si dy se initializeaza cu una din valorile -1, 0, 1 //la inceput fluturele este vizibil Fluture::Fluture() { x=300+random(200); y=300+random(100); dx=random(3)-1; dy=random(3)-1; vizibil=1; } //metoda de desenare a unui obiect din clasa Fluture void Fluture::Deseneaza() { //aripa din stanga line(x, y, x-5, y-5); line(x, y, x-5, y+5); line(x-5, y-5, x-5, y+5); //aripa din dreapta line(x, y, x+5, y-5); line(x, y, x+5, y+5); line(x+5, y-5, x+5, y+5); //corpul line(x, y-10, x, y+7); //capul circle(x, y-10, 2); //antenele line(x, y-10, x-3, y-13); line(x, y-10, x+3, y-13); } //metoda de stergere a unui fluture void Fluture::Fluture() { setcolor(BLACK); Deseneaza(); setcolor(WHITE); } //mutarea unui fluture se realizeaza doar daca el este vizibil void Fluture::Muta() { if(vizibil) { Sterge(); //se genereaza noile deplasari dx=random(3)-1; dy=random(3)-1; //se actualizeaza coordonatele x si y x+=10*dx; y+=10*dy; //fluturele nu poate depasi o anumita zona dreptunghiulara if(x<0) x=0; if(y<180) y=180; if(x>getmaxx()) x=getmaxx(); if(y>380) y=380; Deseneaza(); } } //urmeaza functiile care returneaza coordonatele unui Fluture int Fluture::GetX() { return x; } int Fluture::GetY() { return y; } //clasa Om: definire metode //constructor Om::Om(int x0, y0) { x=x0; y=y0; } //functie de desenare void Om::Deseneaza() { circle(x, y, 10); line(x, y+10, x, y+40); line(x-20, y+15, x+20, y+15); line(x+20, y+15, x+20, y-15); circle(x+20, y+15, x+20, y-15); //paleta line(x, y+40, x-10, y+80); line(x, y+40, x+10, y+80); } //functiile care returneaza coordonatele paletei omului int Om::GetPX() { return x+20; } int Om::GetPY() { return y-25; } //stergerea unui om, in vederea mutarii sale in alta parte void Om::Sterge() { setcolor(BLACK); Deseneaza(); setcolor(WHITE); } //functie care stabileste daca fluturele F este prins de paleta omului int PrindeFluture(Om O, Fluture F) { int eps=7; //precizia de prindere in paleta a fluturelui return ((abs(F.GetX()-O.GetPX())<eps)&&(abs(F.GetY()-O.GetPX())<eps)&&(F.vizibil==1)); } //metoda care muta un obiect din clasa Om void Om::Muta() { int tasta; //codul tastei apasata int i; //indice de fluture in vectorul F int gasit; //gasit=1 daca s.a prins fluturele F[i] in paleta dx=0; dy=0; //valori de deplasare a omului implicit ) if(kbhit()) //daca se apasa o tasta { tasta=getch(); //se citeste codul ei if(tasta==0) tasta=getch(); //daca aceasta este 0, atunci se mai citeste o data codul; //acest lucru se foloseste pentru codurile tastelor cursor switch(tasta) //se modifica dx, dy in functie de tasta { case 72: dy=-1; break; //cursor sus case 80: dy=+1; break; //cursor jos case 75: dx=-1; //cursor stanga case 77: dx=+1; //cursor dreapta } Sterge(); //se sterge omul din pozitia veche x+=10*dx; //se actualizeaza coordonatele sale y+=10*dy; i=0; gasit=0; //se cauta secvential primul fluture F[i], prins in paleta while((i<NrInfinitFluturi)&&(!gasit)) { if(PrindeFluture(*this, F[i])) //daca s.a prins F[i] in paleta, atunci { F[i].Sterge(); //se sterge F[i].vizibil()=0; //devine invizibil gasit=1; //se va termina ciclul while NrFluturi-; //nr de fluturi scade cu 1 } else i++; //daca nu, trecem la alt fluture } Deseneaza(); //se deseneaza omul in noua pozitie } } //programul principal void main() { cout<<"Dati numarul de fluturi: "; cin>>NrInfinitFluturi; NrFluturi=NrInfinitFluturi; //initializarea nr de fluturi int i, gm, gd=DETECT; //initializarea grafica initgraph(&gd, &gm, "c:\\borlandc\\bgi"); line(0, 200, getmaxx(), 200); //linia orizontului for(i=0; i<200; i++) putpixel(random(getmaxx()), 200, random(getmaxy()-200), 15); Nor N1(100, 50); N1.Deseneaza(); //cei doi nori Nor N2(400, 80); N2.Deseneaza(); Soare S(550, 60, 1); S.Deseneaza(); //soarele Om O(200, 300); O.Deseneaza(); //omul for(i=0; i<NrInfinitFluturi; i++) F[i].Deseneaza(); //urmeaza jocul propriu.zis do{ N1.Muta(); //mutarea celor doi nori N2.Muta(); S.Muta(); //rotirea soarelui O.Muta(); //mutarea omului, taste line(0, 200, getmaxx(), 200); //redesenarea orizontului for(i=0; i<NrInfinitFluturi; i++) //redesenarea orizontului F[i].Muta(); //se muta toti fluturii pe rand if(kbhit()) //se forteaza terminarea jocului { if(getch()==char(27)) //daca se pasa { closegraph(); //Escape exit(1); } } while(NrFluturi>0) //jocul se termina cand se termina fluturii closegraph();//se iese din modul grafic } } 1
Recommended Posts
Please sign in to comment
You will be able to leave a comment after signing in
Sign In Now