Documente Academic
Documente Profesional
Documente Cultură
PROIECT DE DIPLOMĂ
Aplicație Web pentru jocul de șah
Bükkӧsi George-Daniel
Coordonator științific:
Prof. dr. ing. Cornel Popescu
BUCUREŞTI
2021
1
Aplicație Web pentru jocul de șah
CUPRINS
Sinopsis ....................................................................................................................................... 4
Abstract ...................................................................................................................................... 4
Multumiri.................................................................................................................................... 5
Acknoledgements ....................................................................................................................... 5
1 Introducere ......................................................................................................................... 6
1.1 Context ........................................................................................................................ 6
1.2 Problema...................................................................................................................... 6
1.3 Obiective ...................................................................................................................... 6
1.4 Structura lucrării .......................................................................................................... 6
2 Analiza și specificarea cerințelor......................................................................................... 7
3 Studiu de piață / Abordări existente................................................................................... 9
4 Soluția propusă ................................................................................................................. 12
4.1 Mediul de dezvoltare ................................................................................................. 12
4.2 Framework-ul Bootstrap 4.0...................................................................................... 13
4.3 Framework-ul Django ................................................................................................ 13
4.4 Modele de date și relaționarea lor ............................................................................ 15
5 Detalii de implementare ................................................................................................... 21
5.1 Front-End ................................................................................................................... 21
5.2 Back-End .................................................................................................................... 24
5.2.1 Creare cont și configurare profil......................................................... 24
2
Aplicație Web pentru jocul de șah
8 Bibliografie ........................................................................................................................ 38
3
Aplicație Web pentru jocul de șah
SINOPSIS
Această lucrare arată procesul de dezvoltare a unei aplicații web pentru jocul de șah,
activitate pe care am practicat-o ca hobby încă de tânăr. Am ales această temă de proiect deoarece
însumează un set de abilități răspândite pe o arie largă a dezvoltării produselor software.
În urma îmbinării unei interfețe cu utilizatorul pe web cu partea de server si de baze de date,
am obținut o aplicație funcțională care permite crearea unui cont și practicarea șahului impotriva
altor jucatori clasati in divizii de nivel asemănător, vizualizarea de diferite statistici ale jucătorilor, dar
și obținerea unor trofee pentru diferite realizări.
ABSTRACT
This paper shows the process of developing a web application for the game of chess, an
activity that I practiced as a hobby since I was young. I chose this project theme because it sums up a
set of skills spread over a wide area of software development.
After combining a web user interface with the server side and database, I obtained a
functional application that allows you to create an account and practice chess against other players
ranked in similar level divisions, viewing different statistics of the players, but also unlocking different
achievements.
4
Aplicație Web pentru jocul de șah
MULTUMIRI
Doresc să mulțumesc profesorului meu îndrumător, domnului Cornel Popescu, care m-a
susținut pe parcursul realizării proiectului și m-a sfătuit la nevoie, dar și tuturor profesorilor din
cadrul Facultății de Automatică și Calculatoare, fără de care nu aș fi ajuns in punctul in care mă aflu
azi, prezentând proiectul care marchează procesul a patru ani de dezvoltare ca inginer. De asemenea,
doresc să le mulțumesc celor care au participat la sondajul de opinie, dar și celor experimentați cu
care am discutat despre platformele de șah. Nu în ultimul rând, mulțumesc familiei și celor mai
apropiați care mi-au fost alături de-a lungul acestui parcurs frumos.
ACKNOLEDGEMENTS
First of all, I would like to thank my diploma coordinator, professor doctor Cornel Popescu,
for backing me up throughout this project and offering me the best advice that i needed. Then, of
course, I would like to thank all the professors from the Faculty of Automatic Control and Computers,
without whom I wouldn’t be here today, presenting the project that sets this important milestone in
my engineering career. Not only would I like to thank everyone involved in helping me gather data
for my thesis survey, but also would I like to thank those who spent time debating other chess web
applications with me. Nevertheless, I would like to thank my family and my closest ones that stood
by my side during this beautiful process
5
Aplicație Web pentru jocul de șah
1 INTRODUCERE
1.1 Context
Odată cu tehnologizarea din ce în ce mai abundentă a lumii în care trăim, dar și a vieții noi la
care a trebuit să ne adaptăm datorită perioadei nefaste în care ne aflăm, foarte multe activități, dar și
bussines-uri s-au mutat in mediul online. Dezvoltarea de aplicații web trebuie și ea să țină pasul,
astfel încât să poată oferi produselor o înfățișare și în mediul online. Având în vedere aceste aspecte,
un simplu joc de șah este mai aproape ca niciodată de orice individ care dispune de un calculator cu
acces la internet.
1.2 Problema
Această lucrare propune dezvoltarea unei aplicații web pentru jocul de șah, care ii oferă
utilizatorului posibilitatea de a-și crea un cont prin care va putea accesa aplicația web și practica jocul
de șah în rețea cu alți utilizatori. De asemenea, utilizatorul beneficiază de un mecanism de
plasament, astfel încât să joace cu jucători de același nivel cu el, dar și de un clasament asupra căruia
pot fi aplicate diferite sortări. Mai mult de atât, acesta va putea să îsi monitorizeze toată evoluția
printr-un clasament in 7 divizii diferite și se va bucura de diverse realizări obținute.
1.3 Obiective
Lucrarea este împărțită în mai multe capitole pe care urmează să le descriu pe scurt în acest
paragraf.
6
Aplicație Web pentru jocul de șah
În cel de-al patrulea capitol este prezentată soluția și arhitectura sa, împreună cu diagrame
ce facilitează înțelegerea relaționării tehnologiilor utilizate în dezvoltarea produsului.
În ultimul capitol voi discuta despre implementări ulterioare ce pot imbunătăți produsul, dar
și despre posibilitatea de a fi monetizată. În cele din urmă, ultimul capitol îl reprezintă bibliografia
lucrării mele.
7
Aplicație Web pentru jocul de șah
Fig. 1
Pentru prima întrebare(Fig.1), 24% dintre cei chestionați au raspuns negativ, ceea ce
inseamnă că aproximativ 3 din 4 persoane au jucat măcar o data șah, fie in mediul real, fie in cel
virtual. Rezultatul este unul așteptat, având în vedere comunitatea inginerească în care sondajul a
fost realizat, procentajul real pe un eșantion mai diversificat putând să difere destul de mult.
Fig. 2
La cea de-a doua întrebare(Fig.2), doar 41% din cei ce au jucat șah au accesat o platformă
online. Acest fapt demonstrează că un joc cu o tradiție atât de mare încă are o posibilitate de a mai
ascende și în mediul online.
Fig. 3
Din lista de facilități ale aplicației prezentă la întrebarea numărul 3(Fig. 3) reiese faptul că
majoritatea oamenilor doresc un cont de utilizator configurabil. Această tendință poate fi explicată
8
Aplicație Web pentru jocul de șah
de obisnuința oamenilor cu conturile de socializare, unde doresc să își personalizeze profilul cât mai
mult.
Cele mai nepopulare alegeri sunt tutorialele, regulamentul, chat-ul in timpul jocului si
forumul. Cu toate acestea, 70% au optat pentru un antrenor virtual. Aceste rezultate denotă faptul că
majoritatea celor ce accesează o astfel de platformă stăpânesc bazele șahului și îi cunosc regulile
fundamentale, însă doresc să se poată perfecționa și prin antrenarea împotriva unui antrenor virtual.
Chat-ul nu ar avea o reală utilitate în timpul unui joc de șah, deoarece acesta se joacă contra
cronometrului, iar scopul jocului este construirea unei strategii cât mai solide împotriva adversarului.
O altă facilitate care a fost aleasă de către 62% dintre participanții la chestionar o reprezintă
posibilitatea de a fi spectator la jocurile altor jucatori. Consider că este o facilitate dorită, deoarece
jucătorii au oportunitatea de a invăța si de la cei mai buni de pe această platformă.
În momentul de față există mai multe platforme de șah online, printre cele mai celebre
numărându-se:
Chess.com
Lichess
Chess24.com
9
Aplicație Web pentru jocul de șah
Pentru a identifica oportunitatea cea mai bună de a face concurență acestor platforme, a fost
nevoie să discut cu câteva persoane care au mult mai multă experiență decât mine în acest domeniu
al șahului. Părerile lor au fost sintetizate, reformulate și/sau traduse dintr-un limbaj colocvial într-un
limbaj academic și urmează să le prezint mai jos, insă identitatea lor va rămâne anonimă, ca și în
cazul participanților la sondajul de opinie.
Fostă campioană și vicecampioană națională: „Cel mai important aspect este ca jocul să fie
funcțional, algoritmul să fie bine scris, să nu existe mutări imposibile. Un alt detaliu important este ca
fiecare jucător să aibă un rating, care să crească sau să scadă în funcție de rezultatul partidelor”
Prieten din străinătate, joacă șah profesionist(traducere din engleză): „Încearcă să menții
interfața cu utilizatorul cât mai simplă. Multe aplicații de genul acesta au o interfață încărcată. De-
asta mie personal îmi place Lichess. Este foarte curat. Încearcă să realizezi un sistem de rating bun,
deoarece e important ca jucătorii să nu se frustreze datorită plasării lor neprecise. De asemenea,
timpul reglabil și jocul pe echipă pot fi foarte distractive”.
10
Aplicație Web pentru jocul de șah
Pe lângă aceste discuții, ultima intrebare din chestionarul realizat a sintetizat următoarele
răspunsuri:
Fig. 4 Fig. 5
Se poate observa așadar o tendință pentru o interfață simplificată, cât mai prietenoasă cu
utilizatorii și cu începătorii. Din punct de vedere tehnic, se dorește un sistem de plasare a jucătorilor
(matchmaking) care să funcționeze cât mai bine, pentru a oferi o experiență plăcută, potrivită pentru
nivelul de joc al utilizatorului. Mai mult de atât, sunt dorite funcționalități care să urmărească
progresul jucătorului și să îl determine să își continue parcursul pe platformă.
Cont de utilizator
Personalizare cont utilizator (tara de provenienta, varsta, sex, motto, etc.)
Joc împotriva unui jucător
Sistem de clasare a jucătorilor
Sistem de găsire si potrivire a jucătorilor pentru crearea partidelor
Joc cu timp limitat
Modul spectator
Listă de prieteni și posibilitatea invitării lor la o partidă de șah
Vizualizarea profilurilor altor utilizatori
11
Aplicație Web pentru jocul de șah
4 SOLUȚIA PROPUSĂ
În acest capitol voi prezenta succint tehnologiile și algoritmii utilizați în procesul de dezvoltare
al produsului, dar și principalele tabele din baza de date, și modul în care acestea relaționează.
feat_{nume_componenta}
fix_{nume_componenta}
Fig. 6
12
Aplicație Web pentru jocul de șah
Un exemplu îl reprezintă următoarele 2 figuri(7a și 7b), unde acest buton roșu a fost randat
folosind clasele „btn btn-sm btn-danger”, care reprezintă un buton de dimensiune mică(small) pe
culoarea predefinită roșie(notată danger în Bootstrap). În mod asemănător au fost stilizate și restul
elementelor de pe website.
Fig. 7a și 7b
Am ales ca mediu de realizare a acestei aplicații web framework-ul Django, care are la baza
limbajul Python, datorită simplității utilizării sale și a modelului MVT (Model View Template),
propice aplicației pe care o dezvolt.
Modelul reprezintă o clasă ce conține câmpuri și metode esențiale și este asociat cu o singură
tabelă în baza de date. Acesta este descris întotdeauna în fișierul models.py. După crearea oricărui
model, acesta trebuie înregistrat în fișierul settings.py al proiectului.
13
Aplicație Web pentru jocul de șah
View-ul face referire la o funcție Python care efectuează o anumită bucată din logica de back-
end a aplicației și întoarce un răspuns de tipul HTTPResponse către utilizator . Acesta poate fi ori sub
forma unei randări (render) a unei pagini HTML, ori sub forma unei redirectări către o altă pagină
HTML, ori sub forma unei erori. Un view este apelat printr-o cerere a unui utilizator (HTTPRequest),
de aceea va primi întotdeauna ca parametru un request pe baza căruia va opera răspunsul.
În cele ce urmează voi detalia pașii prin care se procesează o cerere a unei pagini:
Întreaga relaționare utilizator – aplicație web prin framework-ul Django este descrisă în următoarea
diagramă.
Fig. 8
14
Aplicație Web pentru jocul de șah
Profile
Game
Achievement
Unlock_Achievement
Game_Invitation
Friend_Request
Fiecare user reprezintă o intrare în tabela Profile, iar fiecare joc creat în urma plasării a doi
jucători reprezintă o intrare in tabela Game.
Modelul Profile conține o cheie straină către modelul Game, care descrie jocul curent în care
se află jucătorul. De asemenea, modelul Game conține numele celor 2 jucători, pentru a putea obține
o referință către oricare dintre ei, în vederea modificării diferitelor statistici cum ar fi elo personal,
castiguri, pierderi, remize, rată de câștig.
Modelul Friend_Request modelează relația dintre doi useri care își trimit o cerere de prietenie,
conținând chei străine către ambii utilizatori.
Modelul Unlock_Achievement a fost creat pentru a realiza o modelare a relatiei N:N intre
profilurile utilizatorilor și realizările ce pot fi deblocate, având chei străine către modelele Profile și
Achievement.
Modelul Achievement conține date despre un anumit tip de realizare posibilă în joc. În această
tabelă nu se introduc date decât o singură dată, când se definesc Achievement-urile pentru toți
jucătorii, nefiind modificată decât de către administratorul bazei de date.
15
Aplicație Web pentru jocul de șah
Fig. 9
16
Aplicație Web pentru jocul de șah
Fiecare utlizator al aplicației are un profil individual atribuit după crearea unui cont. Utilizarea
aplicației este dependentă de existența unui cont de utilizator. La începutul fiecărui joc, variabilele de
stare ale jucătorului sunt actualizate, iar la finalul fiecărui joc, cele ce țin de statistica jucătorului, care
va fi afișată atât pe pagina de profil, cât și în cea a clasamentelor.
17
Aplicație Web pentru jocul de șah
Modelul Game nu este accesibil de către niciun utilizator, el fiind actualizat doar de către
logica de schimbare a turei și de finalizare a jocului. În figura de mai jos(Fig. 9) se poate observa
modelul Game, cu atributele sale aferente:
Fig. 10
18
Aplicație Web pentru jocul de șah
Fig. 11
Fig. 12
19
Aplicație Web pentru jocul de șah
Modelarea relației N:N dintre profiluri si realizări este N:1:N, după cum se poate observa in
Figura 13:
Fig. 13
Fig. 14
20
Aplicație Web pentru jocul de șah
5 DETALII DE IMPLEMENTARE
5.1 Front-End
Interfața cu utilizatorul este unul dintre cele mai importante aspecte ale unei aplicații web,
deoarece este primul contact pe care acesta îl are cu produsul. Din acest motiv am ales să construiesc
o interfață intuitivă și cât mai simplu de utilizat. În momentul accesării site-ului, utilizatorul va ajunge
pe pagina principală, unde va regăsi partidele disponibile modului spectator. În partea de sus a
paginii se află bara de navigație. Aceasta este vizibilă si rămâne neschimbată pe orice pagină accesată
din aplicație. Singura excepție o constituie statutul de autentificat, care modifică cele două butoane
„Register” si „Log in” in „Profile” si „Log out”, dar și apariția link-ului „Achievements”.
Home
Leaderboards
Achievements
Play
Register/Profile
Log In/Log Out
Aceasta este împărțită în două părți: partea din stânga conține butoanele Home,
Leaderboards și Play, iar cea din dreapta se ocupă de funcționalitățile de profil al utilizatorului și
autentificare.
Fig. 15
21
Aplicație Web pentru jocul de șah
În Django, fișierele HTML sunt regăsite în directorul templates al fiecărei aplicații din cadrul
proiectului. În cazul meu, proiectul este alcătuit din două aplicații:
În cele ce urmează voi descrie conținutul fiecărei pagini pe care utilizatorul o poate accesa:
Home → pagina principală a platformei, unde se pot găsi jocurile disponibile modului
spectator
Leaderboards →pagină pe care utilizatorul poate sorta toți jucătorii în funcție de anumite
criterii (tara de provenienta, rating, rată de câștig sau număr de partide jucate); de
asemenea, utilizatorul poate vizita paginile de profil ale altor utilizatori pentru afla mai multe
date despre ei
Play → pagină ce se va incărca după ce sistemul de potrivire a jucătorilor a găsit doi jucători
eligibili pentru a forma o partidă; este pagina unde va fi afișată tabla de șah, timpul disponibil
fiecărui jucător, și piesele capturate
Achievements -> pagină unde utilizatorul poate vedea ce realizări a avut de-a lungul
parcursului său pe platforma de șah
X’s profile → pagină cu scurte detalii despre profilul utilizatorului vizitat din pagina
Leaderboards
Profile → pagină care conține datele utilizatorului; acestea pot fi modificate de către acesta
în orice moment al accesării paginii
Register-> pagină care oferă funcționalitatea inregistrării unui nou utilizator în baza de date
prin completarea unui simplu formular
Log In → pagina pe care utilizatorul poate face actiunea de log-in folosind credențialele cu
care și-a creat contul
Log Out → funcționează ca un simplu buton, deloghează utilizatorul și îl redirecționează către
o pagină în care are opțiunea să se logheze din nou sau să-și schimbe parola
Reset password → pagină la care se ajunge din ecranul de login, în cazul în care utilizatorul
își uită parola sau dorește să o schimbe
22
Aplicație Web pentru jocul de șah
Un alt aspect care ține de partea de front-end a aplicației este mutarea pieselor de șah și
verificarea validității mutărilor. Acestea sunt prezente în fișierul chess.js, care se regăsește împreună
cu fișierul main.css(cel în care este rezolvată partea de stilizare a aspectului site-ului) în fișierele
statice din ierarhia Django, mai exact în chessapp/static/chessapp. Voi descrie principalele
funcționalități din fișierul chess.js. Pentru a evita supraîncărcarea paginii cu jocul de șah, deoarece
verificarea șahului mat si cea a cazului de egalitate sunt cele mai complete operații, am hotarat ca
acestea să aibă loc pe back-end.
Starea tablei de șah se transmite între front-end si back-end ca un string, care este
decodificat în fiecare parte. Operațiile descrise mai jos au loc pe o matrice de pe front-end,
chessboard_matrix.
In tabelul de mai jos am descris fiecare funcție folosită in fisierul chess.js pentru a
implementa validarea mutărilor, dar și randarea la poziția corectă a pieselor de joc.
Funcție Utilitate
getSquareCenterPosition(x, y) Întoarce poziția centrului căsuței în funcție de
poziția în matrice
getSquareFromPosition(posx, posy) Întoarce poziția în matrice în funcție de pixeli
movePiece() Schimbă poziția unei piese
undoLastMove() Revine la poziția anterioară
resetBoard() Resetează tabla de șah la poziția inițială
emptyBoard() Golește tabla de șah
flipBoard() Inversează tabla de șah, este folosită în funcție
de culoarea jucătorului (ne dorim ca întotdeauna
utilizatorul să fie în partea de jos a ecranului)
dragElement(elmnt) Face posibilă mutarea unui element cu mouse-ul
snapPiecesToBoard() Centrează și așează piesele pe tabla de șah
isValidPath(start_pos, end_pos) Verifică dacă o cale este validă
isPathClear(start_pos, end_pos) Verifică dacă o cale este liberă
isValidMove(start_pos, end_pos, piece) Verifică dacă o mișcare este validă
isTakeable(attacker_pos, victim_pos) Verifică dacă o piesă poate fi luată
findMyKing() Întoarce poziția regelui
isCheck() Verifică dacă utilizatorul este in șah
sendRequest() Funcție care se ocupă de polling pentru aflarea
turei
decodeGameStateString(string) Funcție care decodifică string-ul cu starea jocului
în matricea chessboard_matrix
endturn() Funcție care încheie tura
isCastle(start_pos, end_pos) Verifică dacă se poate face rocada
getGameStateString Funcție care codifică matricea în string-ul ce
urmeaza să fie trimis la back-end
Tabel 1
23
Aplicație Web pentru jocul de șah
5.2 Back-End
Odată creat profilul, userul îl poate vizualiza accesând pagina „Profile” din bara de navigație,
care duce la apelarea rutei profile(request) din views.py.
Fig.16
Utilizatorul își poate configura contul, adăugându-și o altă poză de profil decât cea
predefinită, dar și alte detalii personale cum ar fi țara de proveniență, vârsta sau un motto personal.
24
Aplicație Web pentru jocul de șah
După adăugarea altor informații pentru configurarea profilului, utilizatorul are posibilitatea
de a face update la date, acestea fiind modificate in baza de date. Odată facută această actualizare,
următorul mesaj este afișat la începutul paginii:
Fig. 17
Pentru o mai bună experiență a utilizatorilor, am ales să afișez astfel de mesaje de feedback
atât pentru acțiunile de succes, cât și pentru cele de eșec.
În afară de butonul de update, acesta are și posibilitatea de a-și șterge contul. Aceste două
butoane se situează în josul paginii, după secțiunea de actualizare a profilului:
Fig. 18
Obiectele Game
Obiectele Unlock_Achievement
Cererile de prietenie
Invitațiile la joc
Pe pagina de profil se poate observa că sunt afișate și invitațiile la joc, cererile de prietenie și
prietenii disponibili. In Fig. 16 se poate vedea cum utilizatorul nu are nicio cerere de prietenie
primită, caz in care mesajul „No friend requests” este afișat, însă are disponibilă o invitație la joc din
partea altui utilizator, pe care o poate accepta sau refuza. Aceste acțiuni cheamă rute precum
accept_friend_request, decline_friend_request, accept_game_invitation sau
decline_game_invitation.
25
Aplicație Web pentru jocul de șah
Asemănător, în partea dreaptă a paginii de profil se află prietenii utilizatorului, al căror profil
poate fi accesat printr-un click pe numele lor. În cazul in care se dorește eliminarea unui prieten din
lista de prieteni, se va apăsa pe butonul „Remove” din dreptul numelui său. Odată eliminat un
prieten din lista de prieteni, acesta va fi scos și din lista friends de pe modelul Profile al utilizatorului
care face cererea. Aceste acțiuni intră pe rutele friend_profile și remove_friend.
Pentru a forma o partidă de șah, este necesară găsirea a doi jucători cu un rating cât mai
apropiat. Așadar, fiecare jucător care apasă pe butonul de „Play” este redirecționat către o pagină
de așteptare, cât timp se găsește un oponent similar pentru el.
În momentul în care s-au găsit doi jucători compatibili, atributul in_queue trece pe False, iar
in_game pe True. Se creează un obiect nou de tipul Game, care conține numele celor doi jucători și
are timer1 și timer2 inițializate pe 180, adică 3 minute rămase pentru fiecare jucator. Se inițializează
și atributul elo pentru a putea afișa jocurile sortate după rating pe pagina de „Home” a aplicației.
Atributul turn este întotdeauna setat pe „white” la începutul jocului, deoarece albul mută primul. În
situația în care nu este găsit un oponent cu un rating suficient de apropiat (adică diferența dintre cei
doi este mai mare de 400 de puncte), jocul nu poate fi format, jucătorul rămânând în așteptare.
Odată creat obiectul Game și setată starea jucătorilor pe profil, aceștia sunt redirecționați
către ruta currently_playing. Pe această rută este randată tabla de șah, împreună cu cele 32 de
piese, după cum se poate observa in Figura 19:
26
Aplicație Web pentru jocul de șah
Fig. 19
În partea din dreapta a ecranului se afișează numele fiecărui jucător, dar și timpul rămas și
piesele capturate de către aceștia.
Fiecare jucător trece prin validarea mutării, realizată de funcțiile din Javascript, după care
cheamă ruta endturn, pentru a își finaliza rândul și a actualiza starea jocului în baza de date. Dupa ce
li se termină tura, aceștia intră într-o stare de polling, în care doresc să afle din nou când le vine
rândul, făcând request-uri repetate de tip GET către server. Acest lucru se întâmplă pe ruta pollturn,
unde se verifică dacă variabila turn de pe obiectul Game corespunzător jocului s-a modificat în
culoarea lor sau nu. De asemenea, pe această rută se verifică și dacă jocul s-a terminat prin șah mat,
remiză sau expirarea timpului de joc. În momentul în care un jucător își află rândul, acesta trebuie să
verifice trei posibile stări inainte de a putea muta normal:
În oricare dintre aceste situații, starea jocului este codificată și trimisă către front-end,
împreună cu unul dintre string-urile “ended”, “timeout”, “draw” sau “nocheckmate”. De asemenea,
27
Aplicație Web pentru jocul de șah
în cazul în care se trimite “timeout” sau “ended”, trebuie trimis și câștigătorul jocului, pentru a putea
afișa pagina corectă HTML.
Pozițiile neocupate din matricea ce reprezintă tabla de șah au fost reprezentate prin trei
zerouri in string-ul ce conține starea jocului
Pozițiile care sunt ocupate de o piesă de șah sunt codificate după urmatorul standard, descris
în Tabelul 2:
Am ales această codificare, deoarece prima literă din codul piesei reprezintă tipul piesei, a
doua literă reprezintă culoarea, iar cea de-a treia reprezintă a câta piesă de acel tip este.
Așa arată un string complet care codifică starea jocului chiar la început, și cu care este
inițializat orice obiect de tipul Game care este introdus in baza de date.
gamestate='rb1kb1bb1Kb1qb1bb2kb2rb2pb1pb2pb3pb4pb5pb6pb7pb800000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000pw1pw2p
w3pw4pw5pw6pw7pw8rw1kw1bw1Kw1qw1bw2kw2rw2'
Când string-ul ce conține starea jocului și câștigătorul este primit de către front-end, în
Javascript se verifică stările “ended”/”timeout”/ ”draw”/”nocheckmate”. In cazul primelor trei, ruta
curentă este inlocuită cu o rută endgame_won, endgame_lost sau endgame_draw, unde se afișeaza
28
Aplicație Web pentru jocul de șah
un mesaj pentru câștigător sau pentru pierzător, după caz. În cazul în care nu s-a dat șah, jocul
continuă natural, string-ul cu tabla de șah fiind decodificat în matricea chessboard_matrix.
Timpul este afișat cu ajutorul funcției startTimer de pe front-end, iar acesta este trimis către
back-end la fiecare endturn, împreună cu string-ul ce reprezintă starea jocului. De asemenea, se
trimite și timpul curent (timestamp) al mutării. Pe back-end, când aceste date sunt recepționate, se
calculează latența jucătorului folosind timestamp_backend – timestamp_frontend, care este luată în
considerare când se verifică timeout-ul. Fiecare jucător are la dispoziție 3 minute pentru a-și efectua
mutările.
Un alt mod educativ și relaxant de utilizare a aplicației îl reprezintă modul spectator. Din
pagina de primire a aplicației, utilizatorul are posibilitatea de a accesa unul dintre cele douăzeci cele
mai bine clasate jocuri în funcție de ratingul lor, pentru a se delecta cu o partidă de șah de nivel înalt,
și, de ce nu, a învăța strategii noi de la cei mai buni jucători de pe platformă.
Pagina de primire, impreună cu jocurile disponibile pentru modul spectator pot fi văzute în
figura de mai jos(Fig.20):
Fig. 20
Realizarea modului spectator include tot o pagină de pe care se face polling către server, pe o
rută numită pollstate. În cazul modului spectator nu mai este necesară sincronizarea turelor,
29
Aplicație Web pentru jocul de șah
deoarece perspectiva este una third party(din exterior), fără posibilitate de control, în care ne
interesează doar modificările asupra tablei de șah.
Fiecare jucător dispune de un rating personal, calculat după sistemul Elo (Elo, 1978)[5] , în
funcție de rezultatele obținute. Jucătorii încep cu un rating de bază în valoare de 1200 de puncte la
crearea contului. În cazul unei confruntări câștigate împotriva unui jucător mai valoros, aceștia vor
aduna mai multe puncte decât împotriva unui jucător mai slab, iar în cazul unei înfrângeri, vor pierde
mai puține, deoarece jucătorul are o probabilitate mai mică să câștige. În cazul unei înfrângeri
împotriva unui jucător mai slab insă, aceștia vor pierde mai multe puncte decât impotriva unuia mai
valoros, deoarece jucătorul era considera “avantajat”.
Fig. 21
Fig. 22
, unde Rn reprezintă ratingul calculat după partidă, Ro ratingul înainte de eveniment, K este factorul
calculat anterior, W este rezultatul partidei (1 pentru victorie, 0 pentru înfrângere), iar We este
rezultatul așteptat al partidei în funcție de Ro.
30
Aplicație Web pentru jocul de șah
Actualizarea ratingului are loc după finalizarea jocului, adică în momentul în care primul
jucător află că jocul este finalizat. Algoritmul lui Elo este apelat in funcția updateElo.
Bronze (1200-1400)
Silver (1400-1600)
Gold (1600-1800)
Platinum (1800-2000)
Diamond (2000-2200)
Master (2200-2400)
Grandmaster (>2400)
Actualizarea diviziei unui jucător are loc odată cu actualizarea elo-ului său de după partidă.
Așadar, updateDivision, funcția care realizează acest lucru, este apelată la finalul updateElo. Această
actualizare înseamnă modificarea atributului division al profilului jucătorului, dacă acesta
promovează într-o divizie superioară, sau dacă retrogradează într-o divizie inferioară. Segmentarea
parcursului în 7 divizii diferite face ca jucătorul să aibă un real sentiment al progresului, menținându-l
interesat și captivat de către platforma de șah.
5.2.6 Clasamente
Deoarece pe această pagina au loc cele mai multe interogări ale bazei de date, în figura
următoare voi oferi un exemplu de interogare care are loc pentru a afișa jucătorii ascendent, după
rating. Obiectele de tip Profile se accesează cu .objects , iar ordonarea lor se face cu order_by.
Fig. 23
31
Aplicație Web pentru jocul de șah
Afișarea listei cu jucătorii ordonati după cele patru criterii este una tabelară și se poate
observa în Figura 24:
Fig. 24
Utilizatorul are posibilitatea accesării unei pagini de vizualizare a profilului unui jucător din
clasament, dând click pe numele lui. O astfel de pagină este incărcată și de pe pagina de profil, la
acționarea unui click pe numele unui prieten. Figura 25 arată această pagină:
Fig. 25
32
Aplicație Web pentru jocul de șah
5.2.7 Realizări
Pentru a captiva jucătorul și mai mult și a-i oferi sentimentul de progres, am introdus 39 de
realizări (achievements) pe care acesta le poate debloca în cariera sa pe platformă. Inițial, în baza de
date, pentru fiecare jucător se vor regăsi obiectele Unlock_Achievement, cu atributul care indică
progresul setat pe 0. Când acest atribut ajunge la 100, respectiva realizare se consideră a fi
deblocată. În momentul în care un Achievement devine deblocat pentru jucător, atributul
achievements de pe profilul său este incrementat cu 1. În cele ce urmează voi descrie realizările
posibile, câte puncte valorează fiecare și ce necesită acestea pentru a fi deblocate.
33
Aplicație Web pentru jocul de șah
Fig.26
34
Aplicație Web pentru jocul de șah
Fig. 27
În acest capitol voi prezenta rezultatul final obtinut, în comparație cu cerințele din Cap. 2, dar
și în raport cu aplicațiile deja existente pe piață.
Rezultatul final al acestui proiect reprezintă aplicația web într-un stadiu în care ar putea fi
lansată, conținând foarte puține probleme de implementare. Am urmărit și am obținut așadar, o
implementare minimalistă pentru o platformă de șah online, care are o interfață prietenoasă cu
utilizatorul și functionalități de bază care pot menține utilizatorul captivat. Acesta are la maxim 3
clicku-ri distanță orice facilitate a platformei. În cele ce urmează voi alcătui o listă a problemelor
cunoscute pe care platforma incă le are, dar care vor primi o rezolvare în viitorul apropiat, înainte de
implementarea altor facilități:
Rândul jucătorului trece și în cazul în care o piesă este mutată pe poziția pe care se află deja
În cazul unei reîncărcări a paginii în timpul jocului, comportamentul jocului de șah este
nedeterminat, uneori continuând normal, alteori tabla fiind resetată la pozițiile inițiale
35
Aplicație Web pentru jocul de șah
În cazul în care un jucător iese de pe pagina de șah în timpul partidei, aceasta nu se termină
până când timpul nu expiră
Comparativ cu platformele de șah deja existente, această platformă oferă facilitățile de bază
pe care un utilizator și le poate dori. Ea câștigă prin faptul că are o interfață primitoare și care nu este
supraîncărcată de informații, având totul sintetizat pe 5 pagini(Home, Play, Leaderboards,
Achievements, Profile).
7 CONCLUZII
În cele din urmă, voi descrie câteva dintre dificultățile întâlnite, dar și oportunitățile pe care
le poate atinge aplicația în viitor.
Realizarea acestui proiect a reprezentat un parcurs în care am învățat foarte multe, în special
din provocările pe care am reușit să le depășesc. De la adaptarea la framework-ul Django, până la
sincronizarea turelor de șah, de la transmiterea datelor între front-end și back-end până la gândirea
modelelor bazei de date astfel încât accesul la informație să fie cât mai facil.
Cu toate că aplicația realizata este una funcțională, și gata de lansarea pe piață, întotdeauna
există loc de îmbunătățiri. În cele ce urmează voi prezenta câteva dintre ideile care ar putea schimba
radical produsul și atrage mai mulți utilizatori:
36
Aplicație Web pentru jocul de șah
37
Aplicație Web pentru jocul de șah
8 BIBLIOGRAFIE
[5]Elo, A. (1978). The rating of chess players past and present. PDF disponibil la:
https://www.gwern.net/docs/statistics/comparison/1978-elo-
theratingofchessplayerspastandpresent.pdf
38