Sunteți pe pagina 1din 9

Connect4 - Raport

Vlad Barbu - IIA5


December 2018

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.

La sfarsitul jocului se va afisa pe ecranul fiecarui client daca a castigat sau

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.

4.1 Cod relevant:Server


Dupa conectarea ambilor clienti serverul intra in functia care porneste jocul si
le permite jucatorilor sa introduca data alternativ
// R u l e a z a j o c u l
void programWork ( ) {
while ( t u r n==1 && S t a r t == 0 ) {
p r i n t f ( ” J u c a t o r u l %d\n” , t u r n ) ;
updateTable ( p l a y e r [ t u r n ] ) ;
}
while ( t u r n==2 && S t a r t == 0 ) {
p r i n t f ( ” J u c a t o r u l %d\n” , t u r n ) ;
updateTable ( p l a y e r [ t u r n ] ) ; } }

Codul pentru apelarea functiei de generarea initiala a tablei de joc si pentru


update-ul constant.In aceasta functie se face comunicarea cu clientii.
void updateTable ( i n t t e s t ) {
char b u f f e r [ 1 0 0 ] ; /∗ m e s a j u l ∗/
int bytes ; /∗ numarul de o c t e t i c i t i t i / s c r i s i ∗/
char msg [ 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 0 0 0 ] = ” ” ; // mesaj de r a s p u n s p e n t r u c l i e n t
int coloana ;

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” ) ;
}

i f ( strncmp ( msgrasp , ” 2W” ,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 ( ) ;
}}}}}}

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 1 [0]== ’Q ’ && msg 2 [ 0 ] != ’Q ’ ) {


msgrasp [ 0 ] = ’Q ’ ;
printf (” Jucatorul 1 a parasit jocul ! ” ) ;
w r i t e ( p l a y e r [ 2 ] , msgrasp , 1 ) ;
return 0 ;
}

i f ( msg 2 [0]== ’Q ’ && msg 1 [ 0 ] != ’Q ’ ) {


msgrasp [ 0 ] = ’Q ’ ;
printf (” Jucatorul 2 a parasit jocul ! ” ) ;
w r i t e ( p l a y e r [ 1 ] , msgrasp , 1 ) ;
return 0 ;
}
msgrasp [ 0 ] = ’ S ’ ;
w r i t e ( p l a y e r [ 2 ] , msgrasp , 1 ) ;
w r i t e ( p l a y e r [ 1 ] , msgrasp , 1 ) ;
return 1 ;
}

4.2 Cod relevant:Client


Verifica primul mesaj primit de la server.Primii doi clienti vor primi mesajul
”1” si ”2” urmat de mesajul ”Start” pentru inceperea jocului.Ceilalti clienti vor
primi un mesaj ”e” pentru exit.
i f ( r e a d ( sd , msg , 1 0 0 0 ) < 0 )
{
p r i n t f ( ” E r r o r a t r e a d \n” ) ;
return e r r n o ;
}

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 ;
}

i f ( strncmp ( msg , ” S t a r t ” ,100)==0){


// S t a r t =1;
p r i n t f ( ” \ e [ 1 ; 1 H\ e [ 2 J” ) ;
p r i n t f ( ” \n ∗∗∗∗ Connect Four ∗∗∗∗\ n” ) ;
f o r ( i n t row = 0 ; row < BOARD ROWS; row++){
f o r ( i n t c o l = 0 ; c o l < BOARD COLS; c o l ++){
printf (” | ” );
printf (” ” );
}
p r i n t f ( ” | \ n” ) ;
p r i n t f ( ”−−−−−−−−−−−−−−−−−−−−−−−−−−−−−\n” ) ;
}
printf (” 1 2 3 4 5 6 7\n” ) ;
}

Aceasta este tabla initiala ce va fi afisata in terminalul ambilor clienti.

Procesarea mesajului primit de la server


void r e c e i v e M e s s a g e ( i n t sd ) {
char msg [ 1 0 0 0 ] ;
i f ( r e a d ( sd , msg , 1 0 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” ) ;

i f ( msg [ 1 ] == ’W’ ) // V e r i f i c a m daca un j u c a t o r a c a s t i g a t

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 ) ;
}

i f ( msg [ 0 ] == ’N ’ ) { // V e r i f i c a m daca e remiza


i t s A T i e ( sd ) ;
}
} else {
i f ( msg [ 0 ] == ’ f ’ ) { // V e r i f i c a m daca s e r v e r u l a t r i m i s mesaj
cu o c o l o a n a p l i n a
p r i n t f ( ” Coloana e s t e p l i n a ! \ n” ) ;
sendMessageCol ( sd ) ;
} else {
/∗ a f i s a m m e s a j u l p r i m i t ∗/
i f ( msg [ 0 ] == ’Q ’ ) { // V e r i f i c a m daca o p o n e n t u l e
deconectat
p r i n t f ( ” Oponentul s a d e c o n e c t a t ! \ n” ) ;
Start = 0;
} else {
p r i n t f ( ” \ e [ 1 ; 1 H\ e [ 2 J” ) ; // Trimitem m e s a j u l
p r i n t f ( ”%s \n” , msg ) ; } } } }

Partea de client care proceseaza mesajul de dupa finalizarea jocului(Start/Quit)


si il transmite serverului
char ∗ playAgainW ( ) {
char msg [ 1 0 0 ] ;
s t r c p y ( msg , ” ” ) ;
int coloana , t e s t ;
s t r c p y ( msg , ” ” ) ;
p r i n t f ( ” S t a r t / Quit : ” ) ;
f f l u s h ( stdout ) ;
r e a d ( 0 , msg , 1 0 0 ) ;
p r i n t f ( ”%s \n” , msg ) ;
return msg ;
}

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 ( ) ) ;

i f ( strncmp ( msg , ” Quit ” ,4)==0 | | strncmp ( msg , ” S t a r t ” ,5)==0)


{
w r i t e ( sd , msg , 1 0 0 ) ;
i f ( strncmp ( msg , ” Quit ” ,4)==0){
Start = 0;
p r i n t f ( ”Pa pa ! \ n” ) ;
}
else {
char msg 2 [ 1 ] ;
i f ( r e a d ( sd , msg 2 , 1 ) < 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” ) ;

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.

2.Pop 10 - Inainte de inceperea jocului se pun pe rand piesele pe fiecare linie.Dupa


ce a fost umpluta o linie se trece la urmatoarea pana la umplerea tablei.Jucatorii
vor elimina piesele de pe ultima linie si doar daca fac parte dintr-o serie de 4
o vor elimina.In caz contrar piesa trebuie pusa inapoi pe tabla.Prima persoana
care elimina 10 piese castiga.

3. 5 in a Row - sunt aceleasi reguli ca in jocul original insa dimensiunea tablei


este diferita,aceasta avnd 6 linii si 9 coloane.Jucatorul care reuseste sa obtina o
linie de 5 piese pe linie/coloana sau diagonala va castiga.

4. Power Up - o versiune a jocului mai usor utilizabila in aplicatii PC/Mo-


bile.Jucatorii au una sau mai multe piese cu abilitati speciale pe care le pot
folosi o singura data intr-un joc.Spre exemplu pot avea o piesa care ii permite
jucatorului curent sa elimine o piesa care apartine adversarului sau o piesa ”X2”
care ii permite jucatorului sa puna doua piese ”simple” la rand.

Inca o imbunatatire ce poate fi adusa este implementarea unei interfete grafice.

6 Bibliografie
https://en.wikipedia.org/wiki/Connect Four
https://profs.info.uaic.ro/ computernetworks/cursullaboratorul.php
https://stackoverflow.com

S-ar putea să vă placă și