[Proiect][1053][Iordache Andreea][Avioane]

37
ACADEMIA DE STUDII ECONOMICE FACULTATEA DE CIBERNETICĂ, STATISTICĂ şi INFORMATICĂ ECONOMICĂ STRUCTURI DE DATE PROIECT AVIOANE Student : IORDACHE ANDREEA - MIHAELA Grupa : 1053 An: III Bucureşti 2010 1

Transcript of [Proiect][1053][Iordache Andreea][Avioane]

ACADEMIA DE STUDII ECONOMICEFACULTATEA DE CIBERNETIC, STATISTIC i INFORMATIC ECONOMIC

STRUCTURI DE DATE PROIECTAVIOANE

Student : IORDACHE ANDREEA - MIHAELA Grupa : 1053 An: III

Bucureti 2010

1

CUPRINS:1.

Introducere:.....................................................................pag.: 3 Structura programului:..................................................pag.: 3 Structurile de date utilizate intern:...............................pag.: 6 Descrierea implementrii :.............................................pag.: 7 Concluzii:.........................................................................pag.: 9

2.

3.

4.

5.

Bibliografie Anexe

AVIOANE

2

1. Introducere:

Obiectivul proiectului il reprezinta implementarea pe calculator a binecunoscutului joc al avioanelor. Necesitatea proiectului: oferirea copiilor si de ce nu si adultilor a unui joc de destindere, simplu, cu un grad de dificultate scazut dar care dezvolta si spiritul competitiv. Mijloacele de realizare: Limbajul de programare folosit pentru realizarea proiectului este limbajul C. Mediul de dezvoltare a aplicaiei a fost Microsoft Visual C++9.0 2008 iar compilatorul folosit este Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.21022.08 for 80x86.

2.

Structura programului:

Programul face referire la structura de date game cu urmtoarea structur:struct game { player me; player pc; int state; }; player este structura definita de mine astfel: typedef struct { plane planes[3]; int nr_planes; //number of player's planes int guessed; //number of the opponent's planes guessed int my_matrix[10][10]; //the matrix with the place of player's planes int my_matrix_op[10][10]; //the matrix with the place of opponent's planes char *name; int score; }player; Iar structura plane este definita astfel: typedef struct { int state; //0-dead; 1-alive int oriented; //1-up; 2-down; 3-left; 4-right cell head; }plane; //structura avion Structura cell este definita astfel: typedef struct {

3

int pozX; int pozY; }cell;

La rularea programului se afiseaza un meniu cu obtiuni: 1.START NEW GAME 2.ADD PLANE 3.ADD PLAYER`S NAME 4.HALL OF FAME 5.EXIT GAME 1.START NEW GAME Pentru ca aceasta obtinue sa porneasca jocul trebuie ca jucatorul sa aibe desenate cele 3 avioane.Daca aceasta conditie nu este indeplinita se afiseaza pe ecran measajul din Fig1.

Fig1. Se revine la meniul principal iar jucatorul trebuie sa isi aleaga cele 3 avioane( coordonatele capului avionului si orientare).Pentru acest lucru trebuie sa aleaga obtinuea 2 din meniu, adica ADD PLANE. 2.ADD PLANE Cand se alege aceasta optiunea jucatorul trebuie sa dea coordonatele capului si orientarea.Pentru a alege orientarea avionului sea fiseaza pe ecran un meniu explicativ, dupa care jucatorul alege optiunea sa. Dupa adaugarea avionului se afiseaza un mesaj in care se anunta cate avioane mai are de adaugat jucatorul pentru a putea incepe jocul, dupa care se revine la meniul principal. De aici ciclul se reia pana cand sunt adaugat 3 avioane si jocul poate incepe. Tot aceste ciclu de adaugare avion este prezentat in figura Fig2.

4

Fig.2 Acum daca este aleasa optiunea 1 din meniu jocul poate incepe.Jocul incepe prin afisarea hartii cu avioanele jucatorului. Dupa care jucatorul este rugat sa aleaga un punct de pe harta oponentului(calculatorului) pentru a vedea daca a lovit o partea dintr-un avion a unui oponent sau chiar capul. Acest lucru este reprezentat in Fig.3.

Dupa ce sunt date coordonatele este afisata o harta in care este afisat punctul lovit cu anumite caractere. XXX coordonatele fac parte dintr-un avion al oponentului (Fig4.), *** coordonatele date nu reprezinta nimic pe harta oponentului, ### coordonatele reprezinta capul unui avion al oponentului.Daca este ghicit capul atunci se afiseaza un mesaj in care se cere sa dam si orientarea avionului. Daca orietarea este cea a avionului oponentului atunci avionul este declarat mort si se afiseaza harta 5

oponentului doar cu avionul ghicit de jucator. Algoritmul se repeta pana cand ori jucatorul ori oponentul a ghicit 3 avioane, numarul tuturor avioanelor unuia dintre jucatori, dupa care se iese din program( ENTER). 3.ADD PLAYER`S NAME Daca se alege aceasta optiune jucatorul poate sa isi introduca numele iar pe parcursul jocului acest numei ii va aparea in mesajele destinate acestuia (ex. ANDREEA`S TURN..., HELLO ANDREEA). Dupa ce numele este introdus prin apasarea tastei ENTER se revine la meniul principal. Acest lucru este reprezentat in Fig5.

Fig5. 4.HALL OF FAME Afiseaza toti jucatorii care au jucat in ordinea descrescatoare a scorurilor. 5.EXIT Daca se alege optiunea y dupa apasarea tastei ENTER se iese din program, iar daca se alege optiunea n atunci se revine la meniul anterior. Acest lucru este prezenat in Fig6 si Fig7.

Fig6.

Fig7.

3. Structurile de date utilizate intern: Structurile de date utilizate intern sunt: fisier, masive (uni si bidimensionale), lista si structurile de tip articol amintite mai sus.

6

Fisierul pc_data.txt si list.txt este sunt fisier de tip text care au urmatoarele caracteristici: - fiecare linie contine coordonatele capului unui fisier si orientarea sa - saptiul dintre coordonata si orientare estre seminificativ deoarece marceheaza sfarsitul coordonatei si inceputul orientarii. - Ordinea sirurilor de caractere din fisier este neimportanta. Pentru prelucrarea acestui fisier sunt folosite urmatoarele operatii: descrierea fisierului, asignarea fisierului intern la unul extern, deschidere fisier, citire date din fisier si inchidere fisier. Masive Operatiile folosite pentru prelucrarea masivelor sunt: initializare, parcurgere, afisare. Lista simplu inlantuita implementata in acest program are urmatoare structura:struct information { char *name; int score; }; typedef struct elem{ information info; struct elem *next; }node;

Operatiile care se plica aceste liste simplu inlantuite sunt: creare lista ordonata, afisarea ei, inserare nod respectand criteriul de lista ordonata.

4. Descrierea implementriiProgramul implementeaza functiile: Initializarea matricei g este implementata prin intermediul functiei urmatoare care initializeaza cu 0 toate elementele stucturii game.void init(Game g) { int i,j; g->state = 0; g->me.nr_planes = 0; //planes nr for player g->me.guessed = 0; //planes guessed by player g->pc.nr_planes = 0; //planes nr for computer g->pc.guessed = 0; //planes guessed by computer for(i=0; ime.my_matrix_op[i][j] = 0; g->pc.my_matrix[i][j] = 0; g->pc.my_matrix_op[i][j] = 0; } //memory allocation for name g->me.name = (char*)malloc(sizeof(char)); }

7

Functia print_main_menu afiseaza pe ecran meniul principal dupa care verifica daca jucatorul si-a adaugat numele si afiseaza pe ecran mesajul Welcome, nume_adaugat!, iar daca nu si-a introdus numele inca afiseaza Welcome, PLAYER!:void print_main_menu() { system("cls"); printf("+--------------------------------- MAIN MENU ----------------------------------+\n"); printf("| 1. START NEW GAME |\n"); printf("| 2. ADD PLANES |\n"); printf("| 3. ADD PLAYER'S NAME |\n"); printf("| 4. HALL OF FAME |\n"); printf("| 5. EXIT GAME |\n"); printf("+------------------------------------------------------------------------------+\n"); if(changed_name == 0) { printf("Welcome, PLAYER!\n"); printf("If you want to change your name, go to PLAYER'S NAME menu and change it.\n\n"); } else { printf("Welcome, %s!\n",g->me.name); } printf("MAKE A CHOICE!\n"); }

Functia main_menu * Daca optiunea utilizatorului este 1: Verifica daca jucatorul are 3 avioane in harta sa daca nu are atunci se apeleaza functia de afisare pe ecran a maeniului principal, dupa care se apeleaza functia main_menu, se revine la meniul principal. Daca jucatorul are 3 avioane atunci : - Se apeleaza functia read_file Aceasta functie verifica daca exista fisierul pc_data.txt in care sunt coordonatele si orientarea avionului oponentului(calculatorului).Daca nu exista afiseaza un mesaj pe ecran. Daca exista atunci il deschide pentru citire. Apoi citeste coordonatele capului si orientarea avioanelor calculatorului. Coordonatele capurilor avioanelor sunt transformate din sir de caractere in numere intregi prin functia head_coord: Acest lucru il face astfel: scade din prima litera din sirul de caractere codul ASCII al lu A.Stii ca aceste coordonate au prima litera intre a si j atunci pentru litera A vom avea 0 (A A=0), pentru B 1 (B A=1) si asa mai departe. In functie de orientarea care o gaseste in fisier pune in matricea avioanelor calculatorului 2 pentru cap si 1 pentru restul avionului(practic deseneaza avioanele). Ii da numele oponentului COMPUTER.

8

-

Verifica daca jucatorul si-a adaugat numele daca nu ii da ca nume implicit numele de PLAYER. Afiseaza harta cu avioanele jucatorului Cat timp jocul nu este terminat ( g.state == 0) se afiseaza un mesaj pe ecran prin care i se cere jucatorului sa dea coordonatele punctului in care vrea sa loveasca. Se apeleaza head_coord, pentru transformarea coordonatelor in numere Se verifica daca coordonatele sunt valide cu functia coord_valid. Coordonatele se considera valide daca x si y este intre 0 si 9. Verifica daca coordonatele reprezinta capul unui avion si daca nu pune 1 in matricea jucatorului in care se retin punctele incercate de el daca a lovit o parte a avionului si -1 daca nua lovit nimic, iar daca a lovit capul ii cere jcuatorului sa ii ghiceasca orientarea.Daca a ghicit orientarea atunci avionul este declarat mort. Verifica daca jucatorul a ghicit pana acum 3 avionae daca da atunci se iese din joc daca nu ii cere acestuia sa mai dea coordonate, dupa care vine randul calculatorului care da coordonate. Acesta da coordonate.Se verifica la fel daca a nimerit capul unui avion si urmeaza aceasi pasi ca si in cazul jucatorului numai ca aceste coordonate date de calculator nu sunt introduse de un utilizator ci alege calculatorul random. - Verifica daca sunt introduse 3 avioane. Daca da atunci se afiseaza un mesaj prin care se anunta ca jocul poate incepe si se revine la meniul principal, daca nu se afiseaza un mesaj princ care utilizatorul este anuntat cat avioane mai poate adauga si se revine la meniul principal pentru a alege o alta optiune.

-

-

* Daca optiunea utilizatorului este 2:

* Daca optiunea utilizatorului este 3: - I se cere utilizatorului sa isi dea numele. Daca introduce numele atunci aceste este afisat pe ecran, duppa care se revine la meniul principal. * Daca optiunea utilizatorului este 4: - Se pe ecran o lista cu jucatori impreuna cu scorul acestora in ordinea descrescatoare scorurilor. * Daca optiunea utilizatorului este 5: - Se apeleaza exit_menu . Utilizatorul este intrebat daca vrea sa iasa si acest lucru se paote face tastand y sau n. Daca tasteaza orice alt caracter se afiseaza un meniu de erroare si este rugat sa introduca un caracter valid. Daca introduce y atunci se iese din program, daca se tasteaza n atunci se revine la meniul principal.

5. Concluzii:In urma elaborarii acestui program am ajuns la urmatoarele concluzii: se pot utiliza simultan diferite structuri de date pentru a ajunge la rezultatul dorit. Structura de date masiv ofera rapid si usor accesul la elemente. De aceea pot spune ca pentru acest proiect aceasta structura de date este cea mai eficienta. 9

Bibliografie:Programarea calculatoarelor Stiinta invatarii unui limbaj de programare Teorie si aplicatii Prof.univ.dr.Ion Gh. ROSCA (coordonator); Prof.univ.dr.Bogdan GHILIC-MICU; Lect.univ.dr.Catalina Lucia COCIANU;Lect.univ.dr.Marian STOICA; Asist.univ.drd.Cristian USCATU

Anexe:#include #include #include #include #include #include typedef struct { int pozX; int pozY; }cell; //structura celula

typedef struct { int state; //1-dead; 0-alive int oriented; //1-up; 2-down; 3-left; 4-right cell head; }plane; //structura avion typedef struct { plane planes[3]; int nr_planes; //number of player's planes int guessed; //number of the opponent's planes guessed int my_matrix[10][10]; //the matrix with the place of player's planes int my_matrix_op[10][10]; //the matrix with the place of opponent's planes char *name; int score; }player; struct game {

10

player me; player pc; int state; }; typedef struct game *Game; struct information { char *name; int score; }; typedef struct elem{ information info; struct elem *next; }node; void print_main_menu(); void main_menu(); void print_error(); void init(Game g); void start_game(Game g); void submenu(); void print_submenu(); int cap_valid(int x, int y, char op); void add_plane(Game g); int not_nulls(Game g); void intersect(); void head_coord(char coord[4]); void print_matrix_pc(Game g); //global variables Game g; FILE *fin; char coord[4], my_coord[4], pc_coord[4]; int x,y; //the coordinates for the head player int z,t; //the coordinates for the head computer int pc_oriented; int changed_name = 0; int fault; node * add_node(node *rad, information infonou) { node *nou, *p, *q; p =(node*)malloc(sizeof(node)); if ( ((nou=(node *)malloc(sizeof(node)))==NULL) || ( (nou->info.name = (char*)malloc(sizeof(char))) == NULL)) { printf("ERROR: NOT ENOUGH MEMORY AVAILABLE\n"); return NULL; } strcpy(nou->info.name,infonou.name); nou->info.score = infonou.score; nou->next = NULL;

11

for(p = q = rad; p!=NULL && p->info.score > infonou.score; q=p, p=p->next); if(p!=q) { q->next = nou; nou->next = p; } else { nou->next = rad; rad = nou; } return rad; } void print_list(node *rad) { node *p =rad; for(p=rad; p!=NULL; p=p->next) { printf(" } } //reads from file void read_file(FILE *f) { char string[3]; int or,i,j; if((f = fopen("pc_data.txt","rt")) == NULL) { printf("File not found!\n"); exit(1); } for(j = 0; j < 3; j++) { fscanf(f,"%s",&string); head_coord(string); fscanf(f,"%d",&or); switch(or) { case 1: g->pc.my_matrix[x][y] = 2; for(i = y-2; i pc.my_matrix[x+1][i] = 1; g->pc.my_matrix[x+2][y] = 1; for(i = y-1; i pc.my_matrix[x+3][i] = 1; g->pc.planes[j].oriented = 1; //the plane has orientation up g->pc.planes[j].head.pozX = x; g->pc.planes[j].head.pozY = y; break; case 2: g->pc.my_matrix[x][y] = 2; for(i = y-2; i pc.my_matrix[x-1][i] = 1; g->pc.my_matrix[x-2][y] = 1; for(i = y-1; i |"); break; } printf("\n "); letter++; for(j=1; j