Documente Academic
Documente Profesional
Documente Cultură
Cuprins
1 Introducere 1
2 Tehnologii utilizate 1
3 Arhitectura aplicatiei 2
4 Detalii de implementare 3
4.1 Cod relevant:Server . . . . . . . . . . . . . . . . . . . . . . . . . . 4
4.2 Cod relevant:Client . . . . . . . . . . . . . . . . . . . . . . . . . . 6
5 Concluzii 9
6 Bibliografie 9
1 Introducere
Connect Four este un joc pentru doua persoane avand ”tabla de joc” cu dimen-
siunea de 7 coloane si 6 linii.Exista mai multe dimensiuni pentru acest joc,mai
exact 5x4,6x5,8x7,9x7 dar cea mai comuna este 7x6.
Calculatorul va atribui jucatorilor o culoare aleatorie(in cazul aplicatiei un semn
distinct o/x care va tine locul culorilor) urmand ca unul dintre jucatori sa in-
ceapa jocul.
Piesa va fi pusa pe coloana selectata de jucator si pe cea mai joasa linie disponi-
bila(nu exista piese pe linia respectiva).
2 Tehnologii utilizate
In proiect am folosit Transmission Control Protocol(TCP) deorece datele noas-
tre trebuie sa ajunga exact cum au fost transmise de catre client si sa nu se
piarda.
User Datagram Protocol(UDP) nu ne ofera siguranta ca datele vor ajunge sau
ca nu vor fi modificate.
1
In cazul acestui joc(clasic) nu se pune problema pentru inversarea ordinii datelor
doarece se transmite un singur numar insa pentru Pop Up spre exemplu in mo-
mentul in care se vrea eliminarea unei piese,inversarea datelor este o problema.
3 Arhitectura aplicatiei
Aplicatia va permite conectarea a doi clienti.Daca este conectat unul singur
acesta va trebui sa astepte pana la conectarea partenerului de joc.Dupa ce al
doilea client este conectat jocul va incepe automat si tabla de joc va fi afisata
pe ecranul ambilor jucatori.Daca alt client incearca sa se conecteze,serverul nu
va permite acest lucru si clientul va primi mesajul ”Deja sunt conectati doi ju-
catori”.
Mesajul trimis de client va fi verificat sa fie un numar intre 1 si 7,in caz contrar
o valoare corecta trebuie reintrodusa.Cand este randul Jucatorului 1,oponentul
va avea afisat mesajul ”Este randul Jucatorului 1” si va fi blocat pe read pana
la primirea unui mesaj din partea serverului,aceeasi actiune se intampla si in
caz contrar.
Aceasta isi va face update dupa fiecare mutare a jucatorilor.Daca o coloana este
plina,serverul va trimite mesaj clientului si acesta va trebui sa reintroduca o
valoare valida pe o coloana ce are minim o pozitie libera.
Daca nici un jucator nu a reusit sa faca o linie de 4 piese va fi remiza.La fi-
nalizarea jocului exista optiunea de a juca un alt meci.Serverul retine scorul
jucatorilor pentru fiecare joc si il afiseaza la finalizarea fiecarei runde.
Serverul se inchide si trimite un mesaj in momentul in care un oponent se de-
conecteaza brusc.
2
4 Detalii de implementare
La deschiderea aplicatiei clientii vor primi doua mesaje initiale:
Jucator X - unde X este numarul jucatorului.Acesta este stabilit de ordinea de
intrare a clientilor(primul client conectat va fi jucatorul 1).Fiecare jucator va
primi o piesa ( O sau X ),piesele fiind atribuite aleatoriu.
Mesajul ”Asteptam conectarea oponentului” va fi afisat jucatorului 1 in mo-
mentul conectarii.
Dupa ce ambii jucatori sunt conectati jocul poate incepe.Initial ambii jucatori
vor primi de la server tabla de joc goala.Jucatorul 1 va incepe jocul prin alegerea
unei coloane.
Jocul se va termina in urmatoarele situatii:
1.4 piese consecutive ale unui jucator pe linie
2.4 piese consecutive ale unui jucator pe coloana
3.4 piese consecutive ale unui jucator pe diagonala
4.Remiza in momentul in care tabla de joc este plina si una din cele 3 de mai
sus nu a fost indeplinita.
3
a pierdut,scorul jucatorilor si optiunile pentru a iesi sau continua jocul.
Pentru continuarea jocului jucatorii trebuie sa introduca comanda Start.Dupa
introducerea comenzii se va afisa numarul jocului(Ex:Jocul 2 daca primul joc a
fost terminat).Jucatorul care a pierdut va fi primul ce introduce coordonatele
piesei.
Pentru a iesi jucatorii trebuie sa introduca comanda Quit.Daca un singur juca-
tor introduce Quit adversarul va primi mesajul ”Oponentul a renuntat” de la
server.
Daca un oponent paraseste jocul brusc serverul trimite mesaj oponentului si se
inchide automat.
b y t e s = r e a d ( t e s t , msg , s i z e o f ( b u f f e r ) ) ; //Primim c o l o a n a
s e l e c t a t a de j u c a t o r
i f ( bytes < 0)
{
p e r r o r ( ” E r o a r e l a r e a d ( ) de l a c l i e n t . \ n” ) ;
}
p r i n t f ( ” [ s e r v e r ] M e s a j u l a f o s t r e c e p t i o n a t . . . % s \n” , msg ) ;
/∗ p r e g a t i m m e s a j u l de r a s p u n s ∗/
b z e r o ( msgrasp , 1 0 0 0 ) ;
s t r c a t ( msgrasp , ” ” ) ;
c o l o a n a = ( i n t ) msg [ 0 ] − 4 8 ;
s t r c a t ( msgrasp , p u t I n C o l ( c o l o a n a ) ) ;
// V e r i f i c a m daca c l i e n t i i s u n t c o n e c t a t i
4
i f ( c o l o a n a <1 | | c o l o a n a >7)
shutDown ( ) ;
// In c a z u l i n c a r e c o l o a n a e s t e p l i n a t r i m i t e m mesaj c l i e n t u l u i
s i asteptam o noua p o z i t i e
i f ( S t a r t == 0 ) {
i f ( msgrasp [0]== ’ f ’ ) {
w r i t e ( p l a y e r [ t u r n ] , msgrasp , 1 0 0 0 ) ;
updateTable ( t e s t ) ;
} else {
p r i n t f ( ” [ s e r v e r ] Trimitem m e s a j u l i n a p o i . . . % s \n” , msgrasp ) ;
i f ( t u r n == 1 ) { // J u c a t o r u l 1
i f ( b y t e s && w r i t e ( p l a y e r [ t u r n ] , msgrasp , 1 0 0 0 ) < 0 )
{
p e r r o r ( ” [ s e r v e r ] E r o a r e l a w r i t e ( ) c a t r e c l i e n t . \ n” ) ;
}
turn = 2 ;
i f ( b y t e s && w r i t e ( p l a y e r [ t u r n ] , msgrasp , 1 0 0 0 ) < 0 )
{
p e r r o r ( ” [ s e r v e r ] E r o a r e l a w r i t e ( ) c a t r e c l i e n t . \ n” ) ;
}
i f ( strncmp ( msgrasp , ” 1W” ,2)==0 | | strncmp ( msgrasp , ”NW” ,2)==0){
memset ( board , ’ ’ , BOARD ROWS ∗ BOARD COLS ) ;
i f ( p l a y A g a i n ( ) == 0 )
{
shutDown ( ) ;
}
}}
e l s e { // J u c a t o r u l 2
i f ( b y t e s && w r i t e ( p l a y e r [ t u r n ] , msgrasp , 1 0 0 0 ) < 0 )
{
p e r r o r ( ” [ s e r v e r ] E r o a r e l a w r i t e ( ) c a t r e c l i e n t . \ n” ) ;
}
turn = 1 ;
i f ( b y t e s && w r i t e ( p l a y e r [ t u r n ] , msgrasp , 1 0 0 0 ) < 0 )
{
p e r r o r ( ” [ s e r v e r ] E r o a r e l a w r i t e ( ) c a t r e c l i e n t . \ n” ) ;
}
Verifica daca jucatorii vor inca un joc sau daca vor sa paraseasca meciul
// V e r i f i c a daca j u c a t o r i i mai v o r sa j o a c e
int playAgain ( ) {
p r i n t f ( ” Play a g a i n ?\ n” ) ;
char b u f f e r 1 [ 1 0 0 ] , b u f f e r 2 [ 1 0 0 ] ; /∗ m e s a j u l ∗/
int bytes 1 , b y t e s 2 ; /∗ numarul de o c t e t i c i t i t i / s c r i s i ∗/
char msg 1 [ 1 0 0 ] , msg 2 [ 1 0 0 ] ; // m e s a j u l p r i m i t de l a c l i e n t
char msgrasp [ 1 ] ;
s t r c p y ( msgrasp , ” ” ) ;
b y t e s 1 = r e a d ( p l a y e r [ 1 ] , msg 1 , s i z e o f ( b u f f e r 1 ) ) ;
5
i f ( bytes 1 < 0)
{
p e r r o r ( ” E r o a r e l a r e a d ( ) de l a c l i e n t . \ n” ) ;
}
p r i n t f ( ” Read1 %s \n” , msg 1 ) ;
b y t e s 2 = r e a d ( p l a y e r [ 2 ] , msg 2 , s i z e o f ( b u f f e r 2 ) ) ;
i f ( bytes 2 < 0)
{
p e r r o r ( ” E r o a r e l a r e a d ( ) de l a c l i e n t . \ n” ) ;
}
p r i n t f ( ” Read2 %s \n” , msg 2 ) ;
i f ( msg 1 [0]== ’Q ’ && msg 2 [ 0 ] == ’Q ’ ) {
return 0 ;
}
i f ( msg[0]== ’ e ’ ) {
p r i n t f ( ” Sunt d e j a d o i j u c a t o r i . Nu t e mai p o t i c o n e c t a \n” ) ;
c l o s e ( sd ) ;
} else {
p l a y e r =( i n t ) msg [ 0 ] − 4 8 ;
p r i n t f ( ” S a l u t ! E s t i j u c a t o r u l cu numarul %d
s i j o c i cu p i e s e l e %c \n” , p l a y e r , msg [ 1 ] ) ;
i f ( p l a y e r ==1){
p r i n t f ( ” Asteptam p a r t e n e r u l de j o c \n” ) ;
6
}
b z e r o ( msg , 1 0 0 ) ;
i f ( r e a d ( sd , msg , 1 0 0 ) < 0 )
{
p e r r o r ( ” [ c l i e n t ] E r o a r e l a r e a d ( ) de l a s e r v e r . \ n” ) ;
return e r r n o ;
}
7
{
i f ( msg [ 0 ] == ’ 1 ’ | | msg [ 0 ] == ’ 2 ’ ) { // V e r i f i c a m c a r e j u c a t o r
a castigat
// p r i n t f (”%d\n ” , ( i n t ) msg [ 0 ] − 4 8 ) ;
playerWon ( ( i n t ) msg [ 0 ] − 4 8 , sd ) ;
}
void p l a y A g a i n ( i n t sd ) {
char msg [ 1 0 0 ] ;
s t r c p y ( msg , ” ” ) ;
s t r c a t ( msg , playAgainW ( ) ) ;
8
}
i f ( msg 2 [0]== ’Q ’ ) {
Start = 0;
p r i n t f ( ” Oponentul a r e n u n t a t ! \ n” ) ;
} else {
p r i n t f ( ” J o c u l numarul %d\n” , s c o r [ 1 ] + s c o r [ 2 ] + 1 ) ;
}
}
}
else {
p r i n t f ( ” Optiune g r e s i t a ! \ n” ) ;
p l a y A g a i n ( sd ) ;
}}
5 Concluzii
Aplicatia poate fi inbunatatita prin adaugarea mai multor tipuri de joc/dimen-
siuni ale tablei de joc:
1.Pop out-in aceasta versiune jucatorul are optiunea de a elimina propria piesa
de pe ultima linie aducand toate piesele de pe coloana respectiva cu cate o linie
mai jos. Un jucator castiga daca reuseste sa obtina o linie de 4 piese(cu acelasi
semn/culoare) pe linie,coloana sau diagonala.
6 Bibliografie
https://en.wikipedia.org/wiki/Connect Four
https://profs.info.uaic.ro/ computernetworks/cursullaboratorul.php
https://stackoverflow.com