Documentatie Pong (PDF)




File information


Title: Microsoft Word - i.doc
Author: pdf

This PDF 1.4 document has been generated by PScript5.dll Version 5.2 / GPL Ghostscript 8.70, and has been sent on pdf-archive.com on 25/02/2016 at 00:58, from IP address 188.24.x.x. The current document download page has been viewed 1429 times.
File size: 128.23 KB (11 pages).
Privacy: public file
















File preview


COLEGIUL NAŢIONAL DE INFORMATICĂ
„GRIGORE MOISIL” BRAŞOV

LUCRARE PENTRU ATESTAREA
COMPETENŢELORPROFESIONALE

JOC „Pong”

Elevi

Profesor îndrumător

Zamfiriu Rareş-Ionuţ

Niţulescu Laura

Pintiliciuc Octavian-Laurenţiu

Bucruţă Maria

Clasa a XII-a B

Mai 2015

Cuprins
1. Motivarea alegerii temei.......... (De ce am ales tema, limbajul utilizat)
2. Prezentarea aplicației
3. Detalii de implementare.......... (Descrierea algoritmilor utilizati / linii de cod)
4. Posibilitati de dezvoltare (Idei de continuare si utilitatea acestei aplicatii)
5. Resurse hardware si software necesare
6. Bibliografie

1. Motivarea alegerii temei

Tema pe care am ales-o este un joc de tip Ping-Pong, inititulat simplu “Pong”.Limbajul
pe care l-am ales pentru realizarea acestei aplicaţii este C#. Întotdeanua am fost atraşi de jocurile
ce necesita “Îndemânare mecanica”.Ce întelegem prin îndemânare mecanica?Această deprindere
se referă la capacitatea jucatorului de a lua decizii corecte într-un timp cât mai scurt şi de a fi
capabil să le aplice in cadrul jocului,in condiţiile in care orice ezitare sau scapare a măinii poate
duce aproape instant la pierderea jocului.În aplicaţia noastră, îndemânarea mecanică este
esenţială,facănd diferenţa intre un jucător ce poate întâmpina probleme pe parcursul jocului, şi
un jucător care işi poate câstiga meciurile cu uşurinţă.Un alt element ce ne-a determinat să
alegem această temă este spiritul competitiv.Noi considerăm că cele mai distractive jocuri sunt
cele în care ai şansa să concurezi in mod direct cu prietenii tăi pentru a stabili care este cel mai
bun.Acestea sunt motivele principale pentru care am ales creăm o astfel de aplicatie de tip joc in
care dinamismul şi competiţia directă sunt principalele caracteristici.

2. Prezentarea aplicaţiei

Aplicaţia realizată constă intr-un tip de joc recunoscut de orice cultură,si anume ping
pong-ul.Aplicaţia conţine trei moduri de joc diferite.In toate cele trei moduri de joc,scopul este

sa trimiti mingea pe langa paleta adversarului pentru a castiga puncte.Primul jucător isi
controlează paleta din partea stangă folosind tastele „w” (pentru a mişca paleta in sus) si “s”
(pentru a mişca paleta in jos),in timp ce al doilea jucator realizează mişcarea paletei folosind
săgeţile “sus-jos” de pe tastatură.În fiecare din cele trei moduri de joc,viteza mingii creşte
progresiv de fiecare dată cand aceasta loveşte o paletă.Jocul oferă un sistem de pauză care se
activează prin apăsarea tastei “P”.Odata activată pauza,ne putem întoarce in meniul principal
sau ne putem intoarce la joc in momentul in care ambii jucători sunt pregătiţi.
Primul mod de joc,este cel clasic.Acesta se desfăşoară pe o masa clasica de ping-pong cu
o minge galbenă.În modul de joc clasic,jucătorul care reuşeşte sa trimită mingea pe lângă paleta
adversarului căstigă runda.După fiecare rundă,cănd cei doi jucători sunt pregatiţi pentru a
incepe urmatoarea rundă se apasa tasta “R”.Runda nouă incepe prin trimiterea mingii către
jucătorul care a pierdut runda precedentă,stabilindu-se astfel un echilibru.Meciul se termina
cănd unul din cei doi jucători reuşeşte sa acumuleze cinci runde câştigate.În acest moment,jocul
ne oferă doua opţiuni:Întoarcerea in meniul principal (Main menu) si initierea unui nou meci
între aceiaşi doi jucători (Play again).Clasamentul salvează noile date la apăsarea oricărui buton
din cele două.
Al doilea mod de joc,este unul asemănător cu fotbalul.Acesta se desfăşoară pe un teren
de fotbal.Conceptul de punctaj este asemănator cu cel din modul clasic,având însă
particularitatea că spaţiul in care poţi sa înscri este limitat (ca o poartă la fotbal).O altă diferenţă
a acestui mod faţă de modul clasic este sistemul de câştigare a meciului.Asemănător cu un meci
de fotbal,şi modul nostru de joc se bazează pe o limită de timp.După 60 de secunde,meciul se
încheie iar câştigător este jucătorul care a reuşit sa acumuleze un număr mai mare de runde
(goluri) decât adversarul său.In caz de egalitate niciunul din cei doi jucători nu
câştigă,clasamentul ramânând astfel neschimbat.
Al treilea mod de joc se numeste “Ultra Rapid Fire” si este destinat jucătorilor
experimentaţi.Acesta se desfăşoară într-un cadru cosmic si necesită cea mai mare îndemânare
mecanică.În acest mod,câştigător este jucătorul care reuşeşte să acumuleze cinci runde
câştigate.Diferenţa este că in acest mod de joc rundele nu sunt delimitate,jocul fiind
continuu,fară intreruperi.Deoarece viteza de deplasare a mingii creşte progresiv cu fiecare
respingere din palete,faptul că viteza nu revine la normal după fiecare punct înscris va duce la
viteze mari pe care doar jucătorii experimentaţi vor fi capabili sa le controleze.În acest mod de
joc,mingea poate trece prin paletă daca trece prin spatele acesteia,jucătorul fiind astfel capabil
sa redirecţioneze mingea.

La pornirea jocului suntem întâmpinati de un meniu construit căt mai simplu,pentru a fi
folosit cu uşurinţă de orice tip de utilizator.Acest meniu conţine trei butoane:
“Play”,”Standings”si “Quit”.Acestea au nume sugestive in limba engleză,rolul lor fiind intuitiv.
Primul buton, ”Play”,ne trimite într-o interfaţă in care trebuie sa alegem unul din cele trei
moduri de joc disponibile.Această alegere se face cu ajutorul săgeţilor stănga si dreapta de pe
tastatură.La apăsarea unei săgeţi,fundalul interfaţei se schimba cu căte o captura a ecranului
făcută in timpul jocului in fiecare din cele trei moduri, pentru a oferi utilizatorului o imagine de
ansamblu despre fiecare mod în parte.Tot in această interfaţă,cei doi jucători ce urmează să se
înfrunte in lumea ping pong-ului îşi aleg câte un nume reprezentativ.Alegerea numelui este un
lucru important,deoarece acesta va fi folosit pentru stabilirea ierarhiei jucătorilor.După ce
utilizatorii şi-au ales numele şi s-au decis asupra universului in care se vor infrunta,jocul incepe
prin apăsarea tastei “Enter”.
Al doilea buton,”Standings”, lansează o interfaţă in care este prezentat clasamentul
jucătorilor care au cel putin un meci căstigat.Acest clasament este afişat într-un tabel ce conţine
două coloane:Nume si Meciuri Castigate.Jucătorii sunt afişaţi in ordinea descrescătoare a
meciurilor câştigate.Astfel,jucătorul cu cele mai multe meciuri căştigate (indiferent de modul de
joc) este afisat primul,in timp ce jucătorul cu cele mai putine meciuri castigate (minim unul)
este afisat ultimul.Pe lângă acest tabel,interfaţa declanşată de butonul “Standings” contine doua
butoane intitulate sugestiv:”Update” si “Back”.Butonul “Update” realizeaza reîmprospătarea
clasamentului,in timp ce butonul “Back” ne trimite înapoi in meniul principal.
Al treilea buton, ”Quit” ,realizează închiderea totală a aplicaţiei.Deşi jocul se inchide,
clasamentul ramane salvat,fiind nemodificat la următoarea lansare a jocului.

3. Detalii de implementare

Jocul a fost realizat in limbajul de programare C#,folosind mediul de programare Visual
C# 2010 si platforma XNA.Pentru simplitatea programului principal,am ales să folosim clase
pentru

elementele

recurente

din

joc.Astfel,aplicatia

conţine

următoarele

clase:

Button,InsertText,Paleta,Minge si formularul de tip Windows Form “FormCls”.Pentru o
navigare mai usoara prin codul sursă al programului principal am decis să folosim regiunile de

cod.Acestea se folosesc pentru a ascunde temporar o parte din cod,contribuind astfel la
arhitectura programului.O regiune se defineste folosind #region –nume- si #endregion,inainte şi
respectiv după portiunea de cod pe care dorim să o ascundem.De exemplu dacă întâmpinăm o
problemă in meniul jocului,oricine poate gasi rapid portiunea de cod responsabilă pentru acea
problemă.Mai jos putem vedea cum fiecare starein care se află jocul are câte o regiunie,acestea
putând fi dezvoltate apăsând pe „plusurile” din dreptul fiecăreia.

Tranziţia de la o starea jocului la alta se face cu ajutorul unei enumeratii.Aceasta conţine toate
stările jocului (fiind asemănătoare cu o structura) si facilitează rapid trecerea de la o stare la alta.Stările
principale pe care le are jocul nostru sunt: MainMenu,SelectMode,Mode1,Mode2,Mode3.Mai jos,avem
declararea acestui tip de variabila si iniţializarea implicită cu starea meniului principal.

În platforma XNA Game Studio,programul principal este împărţit in 3 subprograme
esenţiale:LoadContent,Update si Draw.In subprogramul LoadContent sunt incărcate resursele necesare
rulării jocului precum texturile,fonturile si sunetele.Tot in acest subprogram,principalele variabile
primesc valorile iniţiale.Subprogramul LoadContent este executat o singură dată,la inceputul fiecărei
rulări a programului.Subprogramul Update este apelat in mod constant,constituind ciclul infinit in care
se desfăsoara jocul (Game Loop).In acest subprogram am adaugat toată logica necesară pentru
functionarea jocului:verificarea coliziunilor pentru minge, miscarea paletelor,evidenta scorului si toate
particularităţile pentru fiecare stare in care se poate afla jocul,inclusiv trecerea de la o stare la alta.
Ultimul subprogram principal oferit de platforma XNA Game Studio se numeşte Draw.Acesta este
responsabil pentru a “desena” pe ecranul utilizatorului toate elementele vizuale ale jocului
(palete,fundal,minge,margini,butoane).
Pe langa aceste subprograme,noi am creat si unele suplimentare pentru a ne uşura munca.Primul
subprogram pe care l-am creat a fost cel pentru a verifica tastele apăsate de utilizatori.Acest
subprogram se numeste “PlayerInput” si contine mai multe condiţii ce verifica starea
tastaturii.Astfel,putem determina mişcarea celor două palete,punerea jocului in modul de pauză şi
scoaterea jocului din modul de pauză.Alte doua subprograme de tip boolean“AtingePaleta1” si
“AtingePaleta2”.Acestea au ca parametru o variabila de tip “Paleta” pentru a determina tipul paletei cu
care trebuie verificata coliziunea.Aceste subprograme sunt apelate în Update-ul programului principal
pentru fiecare din cele trei moduri in parte.Subprogramul “Reset” are rolul de a atribui tuturor
variabilelor valorile lor iniţiale.Cu ajutorul acestui subprogram am reuşit să refacem condiţiile necesare
pornirii unui nou meci între cei doi utilizatori.Subprogramul ” RoundRestart” este asemănator cu
subprogramul “Reset”,diferenţa dintre cele două fiind că cel dintâi resetează doar valorile necesare
pentru a începe o rundă nouă.
Un ultim subprogram pe care am ales să il definim se numeste “UpdateClasament”.Acesta are
rolul de a adăuga/modifica date in clasamentul jocului.Subprogramul contine un singur parametru de
tip stringnumit “winnerName” care are rolul de a transmite numele jucătorului ale cărui date urmează a
fi modificate in clasament.Ierarhia meciurilor câştigate este salvata intr-un fişier cu extensia .txt numit
simplu, ”Clasament”.Pe fiecare linie a acestui fişier este salvat câte un jucător care are minim o victorie
folosindu-se următorul format: “Nume-Numar de meciuri câştigate”.Pentru a lucra cu fişiere de tip txt
este necesară folosirea bibliotecii “System.IO”.Cu ajutorul a două variabile de tip “StreamReader” si
respectiv “StreamWriter” putem citi/scrie linii in fişiere text.De fiecare dată cand se termină un meci,se
apelează acest subprogram.În primul rand,toate datele din fişier sunt salvate într-un tablou
unidimensional de tip structură (câmpurile structurii sunt numele jucătorului si numarul de meciuri

câştigate).Următorul pas este să verificăm dacă numele celui care a câştigat meciul se regăseşte printre
numele aflate deja in clasament.Dacă numele se află deja in clasament,elementul respectiv din tabloul
unidimensional este modificat,incrementându-se numărul de meciuri câştigate cu o unitate.Dacă nu
găsim numele in clasament,acesta este adăugat in vectorul unidimensional care este sortat
descrescător.Ultimul pas este rescrierea fişierului Clasament.txt cu datele noi ale tabloului
unidimensional.
Fiecare clasă pe care am creat-o contine variabilele si funcţiile necesare diverselor tipuri de
obiecte.De exemplu,clasa “Minge” conţine datele iniţiale specifice mingii (viteza de deplasare pe axa
OX,viteza de deplasare pe axa OY,dimensiunule,textura folosită si efectul sonor aferent),dar şi funcţiile
“Update” si “Draw” care realizează respingerea de margini si respectiv afişarea mingii pe ecran.Acelaşi
principiu se aplică si pentru celelalte clase ale aplicaţiei.Pentru introducerea numelor celor doi jucători
am folosit o clasă numită “InsertText”.În această clasa folosim un vector de taste pentru a ne asigura că
tasta apasată va fi interpretată o singură dată.Pentru a stabili tipul de caracter am creat doua
subprograme de tip boolnumite “isDigit” si “isLetter” care returneaza true pentru cifre respectiv litere
si false in caz contrar.Formularul de tip Windows Form“FormCls” conţine un control de tip
DataGridViewin care sunt introduse datele citite din fişierul Clasament.txt.Pe langa acest
control,formularul mai contine si doua butoane:Update si Back.Butonul “Update” are rolul de a
reîmprospăta datele afişate în cazul în care au existat modificări in clasamentul jocului.Butonul “Back”
nu face altceva decât să ascundă formularul şi să ne trimită înapoi in meniul principal.
Un element crucial al acestui joc este logica după care se mişcă si se respinge mingea atât din
margini cât şi din palete.În clasa “Minge” putem găsi variabilele ballVx si ballVy care reprezintă viteza
cu care mingea se mişcă pe cele două axe ale sistemului carteyian xOy.În momentul în care mingea se
loveşte de peretele superior sau de cel inferior,variabila ballVy îşi schimba semnul,determinând astfel
respingerea mingii in directia opusă.Mai departe,vom prezenta porţiunea de cod care realizează
respingerea mingii din cele două palete,urmând sa explicăm fiecare linie de cod.

In prima linie de cod,definim o variabilă de tip float numită “intersectieRelativa”.Aceasta salvează
locul in care mingea intersectează paleta,sistemul de referinţă fiind insă axa oY a paletei.Mai jos,vom
folosi ca exemplu o minge ce se intersectează cu o paletă ce are înalţimea de zece pixeli pentru a
înţelege mai uşor rolul acestei variabile.

5
4

În cazul alăturat,variabila intersectieRelativaprimeşte valoarea 4.

0

-5

A doua linie de cod din această secvenţă defineşte o variabilă tot de tip floatnumita
“ratie”.Această variabilă are rolul de a transforma intersecţia relativă aflată mai sus într-o raţie ce
aparţine intervalului [-1,1].Acest lucru se realizează împărţind intersecţia relativă (in cazul nostru 4) la
jumătatea înălţimii paletei (in cazul nostru 5).Pe exemplul de mai sus,raţia va primi valoarea 0.8.

A treia linie de cod defineste o variabila de tip real numită “unghiMax”.Aceasta are rolul de a
reţine unghiul maxim posibil la care se va respinge mingea in cazul in care coliziunea are loc într-unul
din cele două puncte extreme (5 si -5 pe cazul nostru) ale paletei.Pentru jocul nostru,am definit acest
unghi cu 75 de grade (sau 5*pi/12 radiani).
A patra linie de cod are rolul de a calcula unghiul la care se va respinge mingea,unghi reţinut în
variabila de tip float numită “unghiRespingere”.Acest unghi se calculează înmulţind unghiul maxim
definit anterior cu numărul subunitar reţinut în variabila “ratie”.În cazul nostru,unghiul de respingere
va fi 75*0.8,adică 60 de grade.
Liniile de cod cinci si şase modifică viteza cu care mingea urmează să se deplaseze pe axa Ox
respectiv pe axa Oy.Aceastea se calculează folosind cosinusul si respectiv sinusul unghiului de
respingere.Mai jos este prezentată direcţia pe care mingea va fi respinsă,punând in evidenţă
componentele X si Y.






Download Documentatie Pong



Documentatie_Pong.pdf (PDF, 128.23 KB)


Download PDF







Share this file on social networks



     





Link to this page



Permanent link

Use the permanent link to the download page to share your document on Facebook, Twitter, LinkedIn, or directly with a contact by e-Mail, Messenger, Whatsapp, Line..




Short link

Use the short link to share your document on Twitter or by text message (SMS)




HTML Code

Copy the following HTML code to share your document on a Website or Blog




QR Code to this page


QR Code link to PDF file Documentatie_Pong.pdf






This file has been shared publicly by a user of PDF Archive.
Document ID: 0000343075.
Report illicit content