Semplice gioco degli scacchi implementato a oggetti in Java. Il progetto è nato nell'anno 2022 come progetto scolastico di metà corso.
- Descrizione del problema
- Analisi soluzione proposta
- Progettazione
- Installazione
- Struttura delle cartelle (package)
- Librerie implementate
- Volete contribuire?
- Licenza
Definire una struttura di dati in grado di registrare lo stato di una scacchiera su file ed implementare un’applicazione con le seguenti funzionalità.
- Leggere la struttura dati definita
- Scrivere tale struttura dati
- Posizionare sulla scacchiera le pedine alle coordinate definite dall’utente
- Implementare i seguenti controlli
- Controllare che non ci siano più pedine su una cella
- Rappresentare testualmente la struttura di dati definita
- Rappresentare la scacchiera in formato ASCII
- Non essere in grado di muovere le pedine
La soluzione proposta soddisfa tutte le richieste e presenta anche funzionalità aggiuntive, le quali sono:
- Implementazione dei seguenti controlli:
- Controllare che la pedina esista
- Controllare le dimensioni della scacchiera
- Controllare che la pedina non abbia coordinate al di fuori della scacchiera
- Controllo di formattazione sul file di lettura
- Controllo dei dati di input (file di lettura)
- Aggiunta di colori al terminale
- Possibilità di personalizzare le cartelle (fileManager)
Di seguito gli aspetti principali della scacchiera analizzati più nel dettaglio.
Data l’esistenza di sei differenti pedine nel gioco ho implementato una soluzione a oggetti sfruttando l’ereditarietà, astrazione e override dei metodi, così da poter rendere ottimale il tutto.
Infatti, se si volesse aggiungere la possibilità di muovere le pedine all’interno della scacchiera, sarebbe necessario solamente aggiungere dei metodi alla classe “BoardPiece” e alle singole sottoclassi ed eventuali metodi ad alcuni pezzi particolari come “re” o “regina” senza dover modificare la struttura come si può notare nell’immagine sottostante.
Nel gioco degli scacchi per far riferimento a una specifica cella si utilizza la combinazione lettera + numero. Questo sistema fa riferimento utilizzando la lettera quando si lega all’asse X, mentre il numero all’asse Y. Questo metodo fa si che questa rappresentazione non sia utilizzabile parlando di una matrice (che si localizza una cella mediante indici). Quindi i valori vengono convertiti. Più nel dettaglio il flusso.
Innanzitutto, il metodo “placeNewPiece” chiama il metodo “placePiece” per poter immettere alle specifiche coordinate il pezzo, dunque viene istanziato un oggetto “ChessCoordinate” (passandogli le coordinate di sorgente) il quale tramite il metodo “toBoardCoordinate” ritornerà un’oggetto di tipo “BoardCoordinate” utilizzato nel metodo “placePiece” per poter posizionare correttamente nella matrice la pedina.
Data la necessità di poter leggere e scrivere una struttura di dati in grado di memorizzare lo stato delle partite è sorta la necessità di avere un “FileManager” il quale ha il compito di eseguire dei controlli sulle cartelle, file, letture, scritture e dei controlli di base sui file “.json”.
Dunque, pensato di organizzarlo in un’unica classe la quale sarà istanziata nel “TerminalManager” (classe che si occupa di tutte le interazioni tra il giocatore ed il programma) e sarà utilizzata come attributo nel “ChessGame” (classe il quale scopo è quello di gestire l’intera partita). Di seguito lo schema per illustrare la struttura ed i legami con altre classi.
Per rendere più bella esteticamente la visualizzazione nel terminale utilizzando le sequenze di Escape ANSII. Tali sequenze sono uno standard per la segnalazione interna del controllore del cursore, colore, stile dei caratteri e altre opzioni eseguibili in terminale. In questo caso le ho utilizzate per aggiungere un po' di colore basandomi su questa guida.
Inoltre, la scacchiera è possibile visualizzarla in formato ASCII o stampando una tabella contenente le pedine e le coordinate.
N.B: Il seguente schema UML è stato generato dopo aver completato lo sviluppo del programma dato che lo schema iniziale era solo mentale e non schematizzato. Dunque, non è possibile confrontare il prima dello sviluppo con il dopo.
Schema UML con mostrati i costruttori, proprietà, attributi e metodi.
- Estrarre i file dalla ZIP
- Aprire la cartella all'interno di un IDE
- Eseguire la build del progetto
ChessGame
├── src
│ ├── main
| │ |__ java # Package di origine con la logica dentro
| | | |── board # Logica della scacchiera virtuale
| | | |── chess # Logica della scacchiera fisica
| | | |── pieces # Classi delle pedine
| | | |── presentation # Presentazione in terminale della scacchiera
| | | |── storage # Gestione dei file (lettura e scrittura)
| | | |__ utils # File di utility (come costanti)
| | | |__ exception # Handler di eccezioni custom
Se vuoi contribuire a questa applicazione, sei sempre il benvenuto! Leggi linee guida per contribuire.
Apache 2.0 License
Copyright 2021 Spikey sanju
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.