Sei sulla pagina 1di 5

SHEEPLAND

Questo progetto ha come scopo la realizzazione di una applicazione


distribuita che simuli il gioco di strategia SHEEPLAND. L'applicazione
permette a pi giocatori collegati in rete di interagire tra loro partecipando
alla stessa partita.

Elementi di gioco: il MODEL


La Plancia
La plancia rappresentata dalla classe Isola. Tramite il pattern Singleton, quindi
dichiarando il metodo della classe in analisi privato e i suoi metodi statici, garantiamo
lesistenza di un unico esemplare di Isola.
I dati che descrivono lisola vengono prelevati da un file xml (descrizione_isola.xml) .
Abbiamo modellizzato lisola come un grafo, i cui vertici rappresentano le regioni e gli
archi le caselle, esse infatti sono la via di comunicazione tra due regioni.
La classe isola contiene dunque tutti i metodi che permettono di interpretare il grafo
modellizzato, mettendo a conoscenza il programma utente di tutte le relazioni che
intercorrono tra casella-casella, casella-regione, regione-regione.
Le Regioni
La classe Regione identifica una regione dellisola. Essa pu essere di sei diversi tipi di
terreno, per identificare i quali abbiamo creato lEnum TipiTerreno.
La regione il contenitore di tutte le pecore che vengono piazzate durante la fase di
preparazione del gioco e collocate dai pastori durante la partita. Per questo motivo
munita di un arrayList di ovini e di tutti quei metodi che permettono di prelevare
lanimale e contarli.
Le Caselle
La classe Casella il luogo in cui sostano i pastori. Di particolare importanza il
boolean recinto che ci permette di controllare lavvenuto passaggio di un pastore su di
una casella, per cui i giocatori non potranno pi scegliere quella particolare casella con
recinto settato a true per depositare la loro pedina.
Per alcune azioni, descritte pi avanti, importante verificare il valore contenuto nel
int valoreDado, posseduto da ogni casella e non univoco. Tale parametro pu
assumere valori da 1 a 6 ed ogni casella viene a conoscenza del suo numero dal file
xml.
Nota sullalgoritmo verificare le adiacenze tra caselle:
c1 e c2 sono archi
c1 arco tra nodo A e nodo B
c2 arco tra nodo A e nodo C
c1 e c2 sono adiacenti sse hanno un nodo in comune (A) e
tra nodo B e C esiste un arco

Abstract Ovino
Rappresenta la base delle pi specializzate classi PecoraBianca e PecoraNera.
Ogni ovino creato rappresentato da un id e da un valore; in particolare tale valore
impostato a 1 per le pecore bianche e a 2 per la pecora nera e sar utile ai fini del
calcolo del punteggio.
Tessera
Durante la fase iniziale e lo svolgimento della partita entrano in gioco questi oggetti,
ognuno delle quali caratterizzato dal tipo di terreno che rappresentano, dal valore,
ovvero il numero delle monete che il giocatore dovr spendere per accaparrarsela e
dal boolean venduta: una volta settato a true la tessera non potr essere distribuita a
nessun altro giocatore.
Mazzo Iniziale
costituito da sei tessere rappresentanti i sei tipi di terreno presenti nellisola.
Assumiamo che ogni elemento del mazzo iniziale, in quanto tessera, abbia fisso il suo
valore a zero, dal momento che non una tessera per cui il giocatore pu spendere
denari.
Dunque per limplementazione dei mazzi (quello iniziale e quello generico) stata
utilizzata la classe di base Tessera che viene unita ad altri oggetti a lei simili e dotata
di nuove funzionalit.
Anche per questo oggetto, e per il mazzo di tessere generico di seguito descritto,
stato scelto il pattern Singletone. In una partita esiste un unico mazzo e non ci
interessa crearne diversi. I metodi pi significativi sono quelli che permettono di
mescolare il mazzo e quindi distribuire ogni tessera al giocatore.
Mazzo
la classe che rappresenta linsieme di tutte le tessere che durante la partita possono
essere acquistate.
un array di 30 tessere suddivise per tipo, con un valore da 0 a 4.
Rispetto al mazzo iniziale questa classe permette di prendere una tessera dal mazzo in
base al tipo, e che sia la prima disponibile in ordine di valore.
Pastore
la classe che rappresenta la pedina, caratterizzata da un id, che ne la scelta da
parte del giocatore, un colore e dalla posizione. importante infatti durante la partita
tenere traccia della posizione corrente del pastore per verificare cosa gli lecito fare.
Sapendo che in una partita posso avere o due pedine rosse e due pedine blu, o una
pedina per colore (rossa, blu , verde e gialla) in base al numero dei giocatori, abbiamo
scelto di implementare dei metodi che creano le pedine, settando il valore del loro id
in maniera univoca. Ci non toglie la facolt di creare ulteriori pedine per una
eventuale estensione del gioco
Giocatore

il contenitore dei dati del giocatore, ovvero il nome, che egli inserisce in fase di
apertura del programma, lid che gli viene automaticamente assegnato in fase di
creazione delloggetto, i denari, le pedine e le tessere che gli vengono attribuiti in fase
di preparazione e durante la partita. Contiene tutti i metodi che permettono di
accedere alla propria pedina, alle sue tessere, il pagamento e il calcolo del punteggio.
Il punteggio del singolo giocatore viene effettuato utilizzando il metodo
contaOviniPerTerritorio(TipoTerreno tipo), che conta il numero delle pecore nelle tre
regioni del tipo indicato, il cui risultato verr moltiplicato per il valore restituito dal
metodo contaTesserePerTipo(TipoTerreno tipo), che conta il numero delle tessere, del
tipo inserito come paramentro, che il giocatore possiede, e quindi sommato al numero
di monete qualora gli fossero avanzate.
Abbiamo ritenuto opportuno che Giocatore implementasse lInterface Comprator ai
fini della generazione della classifica finale, per la quale necessario confrontare i
giocatori in base al punteggio.
Partita
Contenendo tutte le classi descritte la classe depositaria dei dati della partita.
Importante sono lintero numeroRecinti, decrementando ogni volta che un pastore
piazza un recinto su di una casella avverte che la partita sta giungendo alla
conclusione, e il boolean partitaFinita che ci informa sullo stato della partita e quindi
quando possiamo effettuare il calcolo del punteggio e la proclamazione del vincitore.
Simultaneamente alla creazione della partita si ha quella della plancia, del dado, dei
mazzi, della lista di giocatori e quindi limpostazione dei loro dati iniziali (distribuzione
delle monete, delle pedine che vengono in questo momento create in base al numero
dei giocatori inseriti nella lista e delle tessere iniziali). Vengono quindi creati e
posizionati gli animali sulla plancia di gioco, un pecora per regione; i particolare la
pecora nera, con id 0 viene posizionata inizialmente a SHEEPSBURG, regione con id 0.

Il Gioco : Controller
Allinterno del package controller abbiamo inserito gli elementi che oltre ad attuare i
vari controlli, ma essi non sono gli unici a farli allinterno del progetto, contengono la
logica del gioco e permettono quindi di metterla in pratica
Dado

Azione
la classe che in particolare contiene le tre azioni principali attuabili dal giocatore
durante il proprio turno (MUOVI_PASTORE, MUOVI_PECORA, COMPRA_TESSERA), pi
quelle che estendono il gioco di base (ABBATTIMENTO1 e ACCOPPIAMENTO1) e quindi
il metodo che automatizza il movimento della pecora nera.
InputUtenteValido
lagente che effettua i controlli sullinput proveniente dallutente, quindi che egli
abbia inserito una regione o una casella esistenti, scelto un pastore reperibile
attraverso la lista dei giocatori della partita, e che sia vicino alla regione scelta
dallutente (quasi tutte le azioni richiedono di selezionare una delle due regioni

adiacenti alla casella in cui si trova il pastore corrente), e che non si sia inventato un
nuovo tipo di terreno
Turno
Effettua i controlli sulle azioni attuabili durante un determinato turno e quando questo
finisce (sono terminate le azioni possibili inizializzate a 3. Fatta una determinata
azione non sempre possiamo scegliere di farne una qualsiasi, ci sono determinate
regole da seguire e che la classe turno impone, concedendo divieti e permessi.
GameController
Il cuore del gioco locale si trova in questa classe. Essa gestisce le fasi della partita e
la successione dei turni di gioco dei vari giocatori, il tutto facendo opportuni controlli
attraverso linvocazione delle classi del package Controller, il tutto in continuo
riferimento al model, dal quale preleva e deposita i dati in uso durante la partita, e
della CliView nei casi in cui necessita di informazioni dallesterno, mettendo in pratica
le regole del pattern MVC.

NET
Oltre a fornire il servizio di gioco in locale lapplicazione avvia il server che permette la
creazione di una partita tra client.
Allinterno della classe Server il metodo startServer() crea il ServerSocket e si mette in
attesa su una porta.
La classe Server costituisce un server vero e proprio, nel senso che accetta le
connessioni da parte dei client e quindi permette agli utenti di accedere al gioco, ed
inoltre in grado di gestire pi partite contemporaneamente. Ogni volta che un utente
si connette, il server crea un agente (Player) che si occupa di gestire completamente
la comunicazione con l'utente. Una partita viene avviata dal server quando viene
raggiunto un sufficiente numero di giocatori. Il Server accetta il primo giocatore,
rimane in attesa del secondo, inserito il quale parte un timeout (impostabile dal
fileConfig.properties), se prima dello scadere del tempo si aggiunge un altro giocatore
alla partita il timer riparte; al suo scadere la partita inizia creando un thread della
classe RunGame, la quale crea unistanza della classe Game e quindi fa partire la
gestione del gioco.
Per la partita in rete abbiamo scelto di creare delle estensioni delle classi Giocatore e
Partita, rispettivamente Player e Game.
Il Player mantiene attiva la comunicazione con il client inviando e ricevendo input e
output stream lelemento che allinterno della partita in rete porta avanti il proprio
turno.
In successione i player vengono attivati dal game, in seguito alla terminazione del
metodo play() del Player precedente.
Disconnessione
Qualora un giocatore dovesse disconnettersi, e ci viene avvertito dalle exception in
seguito a degli input da parte del server andati non a buon fine, li-esimo giocatore
della lista di players viene rimosso, viene annunciato a tutti che questi si
disconnesso, e quindi la partita pu proseguire.

Pattern Usati
MVC

Model:
View:
Controller:

SINGLETON

Isola: isola unica e la stessa in ogni sessione di gioco


MazzoDiTessereIniziali: unico in una sessione di gioco (creato in partita)
MazzoDiTessere: unico in una sessione di gioco, durante la quale subisce delle
modifiche (venduta)
Dado: unico in una partita