Jump to content

Recommended Posts

Posted

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

	}

}

  • Upvote 1

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.