Descrierea implementării ------------------------------------------------------------------- În proiectul meu de șah cu interfață grafică, am creat o aplicație completă care duce utilizatorul prin toate etapele jocului, de la prima autentificare până la finalizarea unei partide.
Main.java și GameEngine.java
Pornesc de la Main.java,fereastra principală care folosește CardLayout pentru a comuta între diferite ecrane. GameEngine este implementat ca Singleton, asigurând o singură instanță în toată aplicația pentru managementul datelor (utilizatori, jocuri, utilizator curent logat).
GameEngine gestionează:
A. Citirea/scrierea datelor JSON (similar cu read()/write() din descrierea inițială) B. Autentificarea (login()) și înregistrarea (newAccount()) utilizatorilor C. Crearea de jocuri noi și managementul jocurilor existente D. Actualizarea punctajelor utilizatorilor (Xnou = X + Y ± 150/300)
User (contul cu jocuri si puncte)
A. User reprezinta un cont din aplicatie: email (String), parola (String), lista de jocuri in derulare (List) si punctaj total acumulat (int). B. addGame(Game game) adauga un joc nou in lista user-ului C. removeGame(Game game) scoate jocul din lista D. getActiveGames() returneaza lista de Game asociate cu utilizatorul E. getPoints() si setPoints() pentru managementul punctajului
LoginPanel și RegisterPanel
Interfața split în două: branding în stânga, formulare în dreapta. Validarea verifică format email, coincidența parolelor, și dacă email-ul nu e deja folosit prin apeluri către GameEngine.
MenuPanel
Afișează avatar personalizat cu inițiala utilizatorului, statistici (puncte totale, jocuri active) și butoane: Joc Nou, Continuă Joc, Logout. La Joc Nou, un dialog permite alegerea nickname-ului și culorii (alb/negru).
ContinuePanel și GameOptionsPanel
ContinuePanel afișează jocurile neterminate cu ID, al cui e rândul și punctele acumulate. GameOptionsPanel oferă trei opțiuni prin Factory Pattern pentru generarea simbolurilor: • View Details: afișează tabla curentă (rotită corect), istoric mutări, piese capturate • Continue Game: redirecționează la GamePanel • Exit: întoarce la listă
GamePanel
Interfață împărțită în trei zone:
- Sus: logo, indicator rând curent, puncte
- Mijloc: tabla de șah (ChessGUIPanel)
- Dreapta: istoric mutări + piese capturate + butoane control
Observer Pattern este implementat prin interfața GameObserver cu metode: • onMoveMade() - actualizează tabla și istoricul • onPieceCaptured() - actualizează listele de piese • onPlayerSwitch() - schimbă indicatorul rândului
Strategy Pattern apare la colorarea pieselor capturate: • CapturedColorStrategy - pentru piesele capturate de jucător • LostColorStrategy - pentru piesele pierdute de jucător
ChessGUIPanel
Panou 8x8 butoane care implementează tabla vizuală. Fiecare pătrat are culoare alternantă și afișează fie imaginea piesei, fie simbol Unicode prin PieceSymbolFactory. Conversia coordonatelor ecran↔șah permite rotirea tablei pentru perspectiva negrelor.
Game (logica jocului)
Game gestionează un meci complet: A. start() - inițializează tabla și setează jucătorul care începe B. resume() - reia joc din starea salvată C. switchPlayer() - comută între jucători D. checkForCheckMate() - verifică stare de șah-mat E. addMove() - înregistrează mutări în istoric
Board (tabla de joc)
Board gestionează piesele pe tablă prin TreeSet<ChessPair<Position, Piece>>: A. initialize() - plasează piesele în pozițiile inițiale B. movePiece() - execută mutări cu validare C. getPieceAt() - returnează piesa de la o poziție D. isValidMove() - validează mutări conform regulilor
Player (jucător uman sau computer)
Player are atributul de culoare, liste de piese capturate și punctaj curent (Y): A. makeMove() - execută mutări cu validare prin Board B. getCapturedPieces() - returnează piese capturate C. getPoints()/setPoints() - gestionează punctajul curent
Piece și piesele concrete
Clasa abstractă Piece implementează ChessPiece și este extinsă de: • King, Queen, Rook, Bishop, Knight, Pawn Fiecare implementează getPossibleMoves() conform regulilor specifice de șah.
PieceFactory și PieceSymbolFactory
Factory Pattern separat pentru: • PieceFactory - creează obiectele King, Queen, etc. • PieceSymbolFactory - generează simbolurile Unicode pentru afișare La promovarea pionului, un dialog permite alegerea piesei de înlocuire.
Position și ChessPair
Position reprezintă coordonate pe tablă (A-H, 1-8) cu metode pentru conversie și comparare. ChessPair este o pereche generica (cheie=Position, valoare=Piece) pentru reprezentarea pieselor pe tablă.
VictoryPanel și DefeatPanel
Ecrane finale care afișează rezultatul, punctele obținute, bonusuri și total. Butoanele "Play Again" și "Exit to Menu" oferă navigare după finalizarea jocului.
JsonReaderUtil
Gestionează serializarea/deserializarea JSON pentru accounts.json și games.json: • La citire: reconstruiește obiectele User și Game cu toate relațiile • La scriere: salvează starea curentă în formatul specificat
Excepții
• InvalidCommandException - pentru comenzi invalide în interfață • InvalidMoveException - pentru mutări ilegale pe tablă
Pattern-uri de design implementate:
-
Singleton - GameEngine
-
Observer - actualizare interfață în timp real
-
Strategy - colorare piese capturate
-
Factory - creare piese și simboluri
-
CardLayout - management ferestre aplicație
Fluxul aplicației:
-
Main → Login/Register → Menu
-
Menu → Game nou sau Continuare joc → GamePanel
-
GamePanel → Victory/Defeat → Menu
-
Persistentă prin JSON la fiecare modificare