1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2 %%% DP - Componente Core %%%
3 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5 \subsection{Classe Point
}
6 \subsubsection*
{Descrizione generale
}
7 Le istanze di questa classe rappresentano una posizione all'interno della
\uline{matrice di gioco
}.
10 \subsubsection*
{\large{Attributi
}}
14 \texttt{private int
\_x}
16 \item Valore della coordinata x.
17 \item Costruzione: inizializzato nel costruttore della classe.
22 \texttt{private int
\_y}
24 \item Valore della coordinata y.
25 \item Costruzione: inizializzato nel costruttore della classe.
30 \texttt{private int
\_z}
32 \item Valore della coordinata z.
33 \item Costruzione: inizializzato nel costruttore della classe.
38 \subsubsection*
{Operazioni
}
41 \subsubsection{Point()
}
42 \texttt{public Point()
[constructor
]}
44 \item Comportamento: inizializza i campi
\texttt{\_x},
\texttt{\_y} e
\texttt{\_z} con il valore -
1.
48 \subsubsection{Point(int, int, int)
}
49 \texttt{public Point(int x, int y, int z)
[constructor
]}
51 \item Comportamento: inizializza il campo
\texttt{\_x} con
\texttt{x
},
\texttt{\_y} con
\texttt{y
} e
\texttt{\_z} con
\texttt{z
}.
56 \texttt{public int x()
[const
]}
58 \item Comportamento: ritorna il valore contenuto nel campo
\texttt{\_x}.
63 \texttt{public int y()
[const
]}
65 \item Comportamento: ritorna il valore contenuto nel campo
\texttt{\_y}.
70 \texttt{public int z()
[const
]}
72 \item Comportamento: ritorna il valore contenuto nel campo
\texttt{\_z}.
76 \subsubsection{isValid
}
77 \texttt{public bool isValid()
[const
]}
79 \item Comportamento: ritorna
\texttt{true
} se e solo se
\texttt{\_x},
\texttt{\_y} e
\texttt{\_z} appartengono all'intervallo $
[0,$
\verb!GameMatrix::instance()->d1() *! \\
\verb!GameMatrix::instance()->d2() -
1]!
83 \subsubsection{isNull
}
84 \texttt{public bool isNull()
[const
]}
86 \item Comportamento: ritorna
\texttt{true
} se e solo se
\texttt{\_x},
\texttt{\_y} e
\texttt{\_z} hanno tutti valore -
1.
90 \subsubsection{operator==
}
91 \texttt{public bool operator==(const Point \&p)
[const
]}
93 \item Comportamento: ritorna
\texttt{true
} se e solo se tutti i campi dati di
\texttt{this
} e
\texttt{p
} hanno lo stesso valore.
97 \subsubsection{operator!=
}
98 \texttt{public bool operator!=(const Point \&p)
[const
]}
100 \item Comportamento:
\texttt{return !(this == p)
}.
104 \subsubsection{operator$<$
}
105 \texttt{public bool operator<(const Point \&p)
[const
]}
107 \item Comportamento: ritorna
\texttt{true
} se è vero uno dei seguenti casi:
109 \item \verb!_x < p._x!
110 \item \verb!_x == p._x && _y < p._y!
111 \item \verb!_x == p._x && _y == p._y && _z < p._z!
116 \subsubsection{operator bool
}
117 \texttt{public operator bool()
[const
]}
119 \item Comportamento:
\verb!return isValid()!
124 \subsection{Classe Move
}
126 \subsubsection*
{Descrizione generale
}
127 Le istanze di questa classe rappresentano una posizione e l'identificatore del giocatore che occupa tale posizione all'interno della
\uline{matrice di gioco
}.
131 \subsubsection*
{\large{Attributi
}}
134 \subsubsection{\_playerId}
135 \texttt{private int
\_playerId}
137 \item \`E l'identificatore associato a un giocatore.
138 \item Costruzione: inizializzato nel costruttore della classe.
142 \subsubsection{\_coord}
143 \texttt{private Point
\_coord}
145 \item \`E una posizione nella
\uline{matrice di gioco
}.
146 \item Costruzione: inizializzato nel costruttore della classe.
151 \subsubsection*
{\large{Operazioni
}}
155 \texttt{public Move(int id, Point p)
[constructor
]}
157 \item Comportamento: inizializza il campo
\texttt{\_playerId} con
\texttt{id
} e
\texttt{\_coord} con
\texttt{p
}.
161 \subsubsection{isValid
}
162 \texttt{public bool isValid()
[const
]}
164 \item Parametri e precondizioni: un'istanza del
\textit{``singleton''
} \texttt{GameMatrix
} è stata allocata.
165 \item Comportamento: ritorna
\texttt{true
} se sono valide tutte le seguenti condizioni:
167 \item \texttt{\_playerId} appartiene all'intervallo $
[0,$ \\
\verb!GameMatrix::instance()->numberOfPlayers()!$ -
1]$.
168 \item \verb!_coord.isValid()! ritorna
\texttt{true
}.
173 \subsubsection{point
}
174 \texttt{public Point point()
[const
]}
176 \item Comportamento:
\verb!return _coord!.
180 \subsubsection{playerId
}
181 \texttt{public int playerId()
[const
]}
183 \item Comportamento:
\verb!return _playerId!.
188 \subsection{Classe Player
}
190 \subsubsection*
{Descrizione generale
}
191 Classe astratta che rappresenta un giocatore.
195 \subsubsection*
{\large{Attributi
}}
199 \texttt{private int
\_id}
201 \item Identifica in modo univoco un giocatore nel corso di una partita.
202 \item Costruzione: inizializzato nel costruttore della classe.
207 \subsubsection*
{\large{Operazioni
}}
210 \subsubsection{Player
}
211 \texttt{public Player(int id)
[constructor
]}
213 \item Parametri e precondizioni:
\texttt{id
} compreso nell'intervallo $
[0,
2]$.
214 \item Comportamento: assegna al campo
\texttt{\_id} il valore di
\texttt{id
}.
218 \subsubsection{\~
{}Player
}
219 \texttt{public \~
{}Player()
[destructor, virtual
]}
221 \item Comportamento: corpo vuoto.
226 \texttt{public int id()
[const
]}
228 \item Comportamento: ritorna il valore del campo
\texttt{\_id}.
233 \texttt{public Move move()
}
237 \item invoca il metodo
\texttt{lock()
} sul
\textit{``singleton''
} \texttt{SyncSharedCondition
}.
238 \item invoca il metodo
\texttt{doMove()
} e assegna il valore di ritorno a una variabile ausiliaria
\texttt{point
}.
239 \item invoca il metodo
\texttt{unlock()
} sul
\textit{``singleton''
} \texttt{SyncSharedCondition
}.
240 \item \verb!return Move(_id, point)!.
242 \item Note:
\textit{``template method''
}.
246 \subsubsection{doMove
}
247 \texttt{protected Point doMove()
[abstract, const
]}
249 \item Note: le classi derivate devono implementare questo metodo che viene invocato dal
\textit{``template method''
} \texttt{move()
}.
254 \subsection{Classe HumanPlayer
}
256 \subsubsection*
{Descrizione generale
}
257 Deriva e concretizza la classe astratta
\texttt{Player
} e rappresenta un
\uline{giocatore umano
}.
261 \subsubsection*
{\large{Attributi
}}
264 \subsubsection{\_render}
265 \texttt{private RenderWidget *
\_render}
267 \item Punta alla
\textit{widget
} che il
\uline{giocatore umano
} usa per interagire con l'applicazione quando effettua una mossa.
268 \item Costruzione: inizializzato nel costruttore della classe.
269 \item Distruzione: il distruttore della classe non deve deallocare l'oggetto puntato da questo campo.
274 \subsubsection*
{\large{Operazioni
}}
277 \subsubsection{HumanPlayer
}
278 \texttt{public HumanPlayer(int id, RenderWidget *render)
[constructor
]}
280 \item Parametri e precondizioni:
\texttt{id
} compreso nell'intervallo $
[0,
2]$,
\texttt{render
} non deve essere un puntatore nullo.
281 \item Comportamento: invoca il costruttore della classe base passandogli come parametro
\texttt{id
} e assegna al campo
\texttt{\_render} il valore di
\texttt{render
}.
285 \subsubsection{\~
{}HumanPlayer
}
286 \texttt{public \~
{}HumanPlayer()
[destructor, virtual
]}
288 \item Comportamento: corpo vuoto.
292 \subsubsection{doMove
}
293 \texttt{protected Point doMove()
[const, virtual
]}
295 \item Comportamento: vedere Figura~
\ref{fig:HP_doMove
}.
296 \item Valore ritornato e sua semantica: ritorna un
\texttt{Point
} valido.
301 \subsection{Classe RemotePlayer
}
303 \subsubsection*
{Descrizione generale
}
304 Deriva e concretizza la classe astratta
\texttt{Player
} e rappresenta un giocatore remoto.
308 \subsubsection*
{\large{Attributi
}}
311 \subsubsection{\_net}
312 \texttt{private Network *
\_net}
314 \item Serve alla classe per richiedere allo strato di rete la mossa eseguita remotamente da un altro giocatore.
315 \item Costruzione: viene inizializzato nel costruttore della classe.
316 \item Distruzione: l'oggetto
\texttt{Network
} puntato non deve essere deallocato dal distruttore della classe.
321 \subsubsection*
{\large{Operazioni
}}
324 \subsubsection{RemotePlayer
}
325 \texttt{public RemotePlayer(int id, Network *net)
[constructor
]}
327 \item Parametri e precondizioni:
\texttt{id
} compreso nell'intervallo $
[0,
2]$,
\texttt{net
} non deve essere un puntatore nullo.
328 \item Comportamento: invoca il costruttore della classe base passandogli come parametro
\texttt{id
} e assegna al campo
\texttt{\_net} il valore di
\texttt{net
}.
332 \subsubsection{\~
{}RemotePlayer
}
333 \texttt{public \~
{}RemotePlayer()
[destructor, virtual
]}
335 \item Comportamento: corpo vuoto.
339 \subsubsection{doMove
}
340 \texttt{protected Point doMove()
[const, virtual
]}
342 \item Comportamento: vedere Figura~
\ref{fig:RP_doMove
}.
347 \subsection{Classe AIPlayer
}
349 \subsubsection*
{Descrizione generale
}
350 Deriva e concretizza la classe astratta
\texttt{Player
} e rappresenta un
\uline{giocatore artificiale
}.
354 \subsubsection*
{\large{Attributi
}}
357 \subsubsection{\_DefaultSkill}
358 \texttt{private int
\_DefaultSkill [const, static
]}
360 \item Usato per avere un valore di
\textit{default
} per
\texttt{\_skill}.
361 \item Costruzione: inizializzato a
2.
365 \subsubsection{\_skill}
366 \texttt{private int
\_skill}
368 \item Rappresenta il livello di abilità dell'
\uline{AI
}, a un valore di
\texttt{\_skill} maggiore corrisponde una abilità maggiore dell'
\uline{AI
}.
369 \item Creazione: inizializzato nel costruttore della classe.
374 \texttt{private AI *
\_ai}
376 \item Puntatore all'
\texttt{AI
} utilizzata dal
\uline{giocatore artificiale
}.
377 \item Costruzione: inizializzato nel costruttore della classe.
378 \item Distruzione: il distruttore della classe deve occuparsi di deallocare l'oggetto puntato da questo campo.
383 \subsubsection*
{\large{Operazioni
}}
386 \subsubsection{AIPlayer
}
387 \texttt{public AIPlayer(int id)
[constructor
]}
389 \item \texttt{id
} compreso nell'intervallo $
[0,
2]$.
392 \item invoca il costruttore della classe base passando il parametro
\texttt{id
}.
393 \item inizializza il campo
\texttt{\_skill} con la costante
\texttt{\_DefaultSkill}.
394 \item se l'impostazione di
\uline{difficoltà II
} è uguale a
3 inizializza
\texttt{\_ai} con il valore ritornato dalla chiamata
\verb!new CCThreatSearchAI(id)! altrimenti con quello di
\verb!new ThreatSearchAI(id)!.
399 \subsubsection{\~
{}AIPlayer
}
400 \texttt{public \~
{}AIPlayer()
[destructor, virtual
]}
402 \item Comportamento: dealloca l'oggetto puntato da
\texttt{\_ai}.
406 \subsubsection{doMove
}
407 \texttt{protected Point doMove()
[const, virtual
]}
409 \item Comportamento: vedere Figura~
\ref{fig:AP_doMove
}.
410 \item Valore ritornato e sua semantica: ritorna un
\texttt{Point
} valido.
414 \subsubsection{forceMove
}
415 \texttt{public void forceMove()
[virtual
]}
417 \item Comportamento: effettua la chiamata
\verb!_ai->forceMove()! e ritorna.
421 \subsubsection{skill
}
422 \texttt{public int skill()
[const
]}
424 \item Comportamento: ritorna il valore di
\texttt{\_skill}.
428 \subsubsection{setSkill
}
429 \texttt{public void setSkill(int skill)
}
431 \item Comportamento: imposta il valore del campo
\texttt{\_skill} al valore
\texttt{skill
}.
435 \subsubsection{undoMove
}
436 \texttt{public void undoMove()
[slot
]}
438 \item Comportamento:
\verb!_ai->movesUndone()!.
443 \subsection{Classe GameMatrix
}
445 \subsubsection*
{Descrizione generale
}
446 Mantiene diverse informazioni sullo stato della
\uline{matrice di gioco
}.
447 Classe progettata secondo il pattern
\textit{``singleton''
}.
448 \\
\verb!friend class ThreatSearchAI!
449 \\
\verb!friend class CCThreatSearchAI!
450 \\
\verb!friend class Threat!
451 \\
\verb!friend class CCThreat!
455 \subsubsection*
{\large{Attributi
}}
458 \subsubsection{EmptyPoint
}
459 \texttt{public int EmptyPoint
[const static
]}
461 \item \`E il numero usato internamente da
\texttt{GameMatrix
} per indicare le posizioni vuote della
\uline{matrice di gioco
}.
462 \item Costruzione: inizializzato con il valore -
1.
465 \subsubsection{\_instance}
466 \texttt{private GameMatrix *
\_instance [static
]}
468 \item Puntatore all'eventuale unica istanza della classe.
469 \item Costruzione: inizializzato con il valore
0.
473 \subsubsection{\_matrix}
474 \texttt{private int *
\_matrix}
476 \item Puntatore ad un array che rappresenta la
\uline{matrice di gioco
}.
477 \item Costruzione: inizializzato nel costruttore della classe.
481 \subsubsection{\_lastRound}
482 \texttt{private QList<Point>
\_lastRound}
484 \item Contiene le posizioni interessate dall'ultima mossa di ogni giocatore, gli elementi sono in ordine cronologico, quello in posizione
0 è l'elemento inserito più recentemente. Contiene un numero di elementi pari al numero dei giocatori.
485 \item Costruzione: inizializzazione nel costruttore della classe.
490 \texttt{private int
\_d1}
492 \item Indica il valore del parametro
\uline{difficoltà I
} impostato per la partita corrente.
493 \item Costruzione: inizializzato nel costruttore della classe.
498 \texttt{private int
\_d2}
500 \item Indica il valore del parametro
\uline{difficoltà II
} impostato per la partita corrente.
501 \item Costruzione: inizializzato nel costruttore della classe.
505 \subsubsection{\_freeCounter}
506 \texttt{private int
\_freeCounter}
508 \item Indica il numero di posizioni libere rimaste nella
\uline{matrice di gioco
}.
509 \item Costruzione: inizializzato nel costruttore della classe.
514 \subsubsection*
{\large{Operazioni
}}
517 \subsubsection{GameMatrix
}
518 \texttt{private GameMatrix(int d1, int d2, int numPlayers)
[constructor
]}
520 \item Parametri e precondizioni:
522 \item \texttt{d1
} appartiene a $\
{5,
7,
9\
}$
523 \item \texttt{d2
} appartiene a $
[1,
3]$
524 \item \texttt{numPlayers
} appartiene a $
[0,
2]$
528 \item assegna
\texttt{d1
} a
\texttt{\_d1} e
\texttt{d2
} a
\texttt{\_d2}.
529 \item inizializza
\texttt{\_lastRound} con
\texttt{numPlayers
} elementi tutti di valore
\texttt{Point()
}.
530 \item alloca un array di
\texttt{int
} di dimensione (
\texttt{d1
}*
\texttt{d2
})$^
3$, inizializza tutti gli elementi con il valore
\texttt{GameMatrix::EmptyPoint
} e assegna tale array al campo
\texttt{\_matrix}.
531 \item assegna a
\texttt{\_freeCounter} il valore (
\texttt{d1
}*
\texttt{d2
})$^
3$.
536 \subsubsection{\~
{}GameMatrix
}
537 \texttt{public \~
{}GameMatrix()
[destructor
]}
539 \item Comportamento: dealloca l'array puntato da
\texttt{\_matrix} e assegna il valore
0 a
\texttt{\_instance}.
543 \subsubsection{create
}
544 \texttt{public GameMatrix *create(int d1, int d2, int numPlayers)
[static
]}
546 \item Parametri e precondizioni:
548 \item \texttt{d1
} appartiene a $\
{5,
7,
9\
}$
549 \item \texttt{d2
} appartiene a $
[1,
3]$
550 \item \texttt{numPlayers
} appartiene a $
[0,
2]$
552 \item Comportamento: se
\texttt{\_instance} è nullo gli assegna il valore della chiamata
\verb!new GameMatrix(d1, d2, numPlayers)!, ritorna il valore di
\texttt{\_instance}.
553 \item Side effects: può allocare l'istanza di
\texttt{GameMatrix
} se questo non è ancora avvenuto.
557 \subsubsection{destroy
}
558 \texttt{public void destroy()
[static
]}
560 \item Comportamento: se
\texttt{\_instance} non è nullo dealloca l'oggetto puntato e gli assegna il valore
0.
561 \item Side effects: dealloca l'unica istanza di
\texttt{GameMatrix
}.
565 \subsubsection{instance
}
566 \texttt{public GameMatrix *instance()
[static
]}
568 \item Comportamento: ritorna il valore di
\texttt{\_instance}.
572 \subsubsection{check
}
573 \texttt{public bool check(Point point)
[static
]}
575 \item Parametri e precondizioni:
\texttt{\_instance} non nullo.
576 \item Comportamento:
\verb!return point.isValid() &&! \\
\verb!elementAt(point) == GameMatrix::EmptyPoint!
581 \texttt{public bool add(Move move)
}
583 \item Parametri e precondizioni:
\verb!move.isValid() &&! \\
\verb!elementAt(move.point()) == GameMatrix::EmptyPoint! vale
\texttt{true
}.
584 \item Comportamento: vedere diagramma in Figura~
\ref{fig:GM_add
}.
585 \item Side effects: modifica un elemento di
\texttt{\_matrix}.
586 \item Valore ritornato e sua semantica:
\texttt{true
} se il giocatore che ha effettuato tale
\uline{mossa
} ha conseguito una situazione di vittoria,
\texttt{false
} altrimenti.
590 \subsubsection{extractCC
}
591 \texttt{private void extractCC(Point p, int id, QSet<Point> \&set)
}
593 \item Parametri e precondizioni:
595 \item \verb!p.isValid()!
596 \item \verb!id == elementAt(p)!
600 \item aggiunge a
\texttt{set
} il valore
\texttt{p
}.
601 \item crea una lista
\texttt{l
} delle posizioni adiacenti a
\texttt{p
} nella
\uline{matrice di gioco
}.
602 \item per ogni elemento
\texttt{e
} di
\texttt{l
} per cui è vero
\verb!id == elementAt(e)! ed
\texttt{e
} non è già presente in
\texttt{set
}, invoca
\verb!extractCC(e, id, set)!.
606 \subsubsection{clear
}
607 \texttt{public void clear(Point point)
}
609 \item Parametri e precondizioni:
\verb!point.isValid()! ritorna
\texttt{true
}.
612 \item se
\verb|elementAt(point) != -
1| aumenta di una unità
\texttt{\_freeCounter}.
613 \item assegna all'elemento di
\texttt{\_matrix} di indice
\texttt{point.x() * (
\_d1 *
\_d2)$^
2$ + point.y() * (
\_d1 *
\_d2) + point.z()
} \
\il valore
\texttt{GameMatrix::EmptyPoint
}.
615 \item Side effects: modifica un elemento di
\texttt{\_matrix} e il valore di
\texttt{\_freeCounter}.
616 \item Note: il campo
\texttt{\_lastRound} rimane inconsistente e deve essere reso consistente in modo manuale con il metodo
\texttt{setLastRound
}.
620 \subsubsection{elementAt(int, int, int)
}
621 \label{txt:elementAt
}
622 \texttt{public int elementAt(int x, int y, int z)
[const
]}
624 \item Comportamento: esegue il controllo
\verb!Point(x,y,z).isValid()!, se ritorna
\texttt{true
} questo metodo ritorna il valore che si trova in
\texttt{\_matrix} all'indice
\texttt{x * (
\_d1 *
\_d2)$^
2$ + y * (
\_d1 *
\_d2) + z
}. Se invece ritorna
\texttt{false
} il metodo ritorna il valore -
2.
625 \item Valore ritornato e sua semantica: se la posizione identificata dalle coordinate nella
\uline{matrice di gioco
}:
627 \item è occupata: da un giocatore ritorna l'
\texttt{id
} associato a quel giocatore.
628 \item è libera: ritorna
\texttt{EmptyPoint
}.
629 \item non è interna alla
\uline{matrice di gioco
}: ritorna -
2
634 \subsubsection{elementAt(Point)
}
635 \texttt{public int elementAt(Point point)
[const
]}
637 \item Comportamento:
\verb!return elementAt(point.x(), point.y(), point.z())!
638 \item Valore ritornato e sua semantica: vedi~
\ref{txt:elementAt
}.
642 \subsubsection{isFull
}
643 \texttt{public bool isFull()
[const
]}
645 \item Comportamento: ritorna
\texttt{true
} se e solo se
\verb!_freeCounter ==
0!.
649 \subsubsection{numberOfPlayers
}
650 \texttt{public int numberOfPlayers()
[const
]}
652 \item Comportamento:
\verb!return _lastRound.size()!
656 \subsubsection{setLastRound
}
657 \texttt{public void setLastRound(QList<Point> round)
}
659 \item Parametri e precondizioni:
\texttt{round
} ha un numero di elementi pari al numero dei giocatori della partita corrente.
660 \item Comportamento: assegna
\texttt{round
} a
\texttt{\_lastRound}.
665 \subsection{Classe GameLoop
}
667 \subsubsection*
{Descrizione generale
}
668 Deriva da
\texttt{QThread
} e ne implementa il metodo
\texttt{run()
}, è la parte dell'applicazione che gestisce il susseguirsi dei turni di gioco in una partita e ne segnala gli avvenimenti al resto dell'applicazione.
672 \subsubsection*
{\large{Attributi
}}
675 \subsubsection{\_currentPlayer}
676 \texttt{private Player *
\_currentPlayer}
678 \item \`E un puntatore al
\texttt{Player
} che deve effettuare la
\uline{mossa
} successiva.
679 \item Costruzione: inizializzato nel costruttore della classe.
680 \item Distruzione: il distruttore della classe non deve deallocare l'oggetto puntato da questo campo.
684 \subsubsection{\_players}
685 \texttt{private QList<Player*>
\_players}
687 \item Lista di puntatori ai
\texttt{Player
} che prendono parte alla partita ordinati in modo crescente secondo il loro
\texttt{id()
}.
688 \item Costruzione: inizializzata nel costruttore della classe.
689 \item Distruzione: il distruttore della classe deve occuparsi di deallocare gli oggetti puntati dagli elementi di questo campo.
693 \subsubsection{\_winStatus}
694 \texttt{private QList<bool>
\_winStatus}
696 \item Mantiene informazioni riguardo le condizioni di vittoria raggiunte dai giocatori.
697 \item Costruzione: inizializzata nel costruttore della classe.
702 \subsubsection*
{\large{Operazioni
}}
705 \subsubsection{GameLoop
}
706 \texttt{public GameLoop(QList<Player*> players)
[constructor
]}
708 \item Parametri e precondizioni:
\texttt{players
} contiene
2 o
3 elementi nessuno dei quali è un puntatore nullo.
711 \item assegna al campo
\texttt{\_players} il parametro
\texttt{players
}.
712 \item assegna al campo
\texttt{\_currentPlayer} il valore contenuto nell'elemento di indice
0 di
\texttt{\_players}.
713 \item aggiunge al campo
\texttt{\_winStatus} un numero di elementi
\texttt{false
} pari al valore ritornato dalla chiamata
\verb!_players->size()!.
718 \subsubsection{\~
{}GameLoop
}
719 \texttt{public \~
{}GameLoop()
[destructor, virtual
]}
721 \item Comportamento: dealloca i
\texttt{Player
} puntati dagli elementi di
\texttt{\_players}, invoca il metodo
\texttt{GameMatrix::destroy()
}.
725 \subsubsection{setTurn
}
726 \texttt{public void setTurn(int id)
}
728 \item Parametri e precondizioni:
\texttt{id
} è compreso nell'intervallo $
[0,$
\_players.size()$-
1]$.
729 \item Comportamento: assegna a
\texttt{\_currentPlayer} il valore contenuto in
\verb!_players
[id
]!.
730 \item Side effects: cambia il valore di
\texttt{\_currentPlayer}.
735 \texttt{protected void run()
[virtual
]}
739 \item vedere Figura~
\ref{fig:GL_run
}.
740 \item viene assegnato a
\verb!_winStatus
[_currentPlayer->id()
]! il valore ritornato dalla chiamata al metodo
\texttt{add
} invocato sull'istanza di
\texttt{GameMatrix
} ogni volta che questa chiamata viene effettuata nel diagramma precedente.
741 \item se la chiamata
\texttt{isFull()
} sull'istanza di
\texttt{GameMatrix
} ritorna
\texttt{true
} assegno il valore
\texttt{true
} a tutti gli elementi di
\texttt{\_winStatus}.
746 \subsubsection{forceMove
}
747 \texttt{public void forceMove()
[slot
]}
749 \item Comportamento: se
\texttt{\_currentPlayer} punta a un'istanza di
\texttt{AIPlayer
} ne invoca il metodo
\texttt{forceMove()
}.
753 \subsubsection{moved
}
754 \texttt{protected void moved(Move move)
[signal
]}
756 \item Note: viene emesso dopo che è stata effettuata una mossa da parte di un
\texttt{Player
}.
761 \texttt{protected void turn(int playerId)
[signal
]}
763 \item Note: viene emesso all'inizio del turno di ogni
\texttt{Player
} passando come parametro
\texttt{playerId
} il valore della chiamata
\verb!id()! sul
\texttt{Player
} stesso.
768 \texttt{protected void win(int playerId)
[signal
]}
770 \item Note: viene emesso quando tutti i giocatori hanno eseguito un numero uguale di mosse e solamente uno di loro ha conseguito una condizione di vittoria, come parametro
\texttt{playerId
} viene passato l'identificatore numerico associato a tale
\texttt{Player
}.
775 \texttt{protected void draw(QList<int> playerIds)
[signal
]}
777 \item Note: viene emesso quando la
\uline{matrice di gioco
} è piena o quando tutti i giocatori hanno eseguito un numero uguale di mosse e almeno due di loro hanno conseguito una condizione di vittoria, come parametro
\texttt{playerIds
} viene passata una
\texttt{QList<int>
} contenente gli identificatori numerici associati a tali
\texttt{Player
}.
781 \subsection{Classe SyncSharedCondition
}
783 \subsubsection*
{Descrizione generale
}
784 Deriva da
\texttt{QMutex
} da cui eredita in particolare i metodi
\texttt{lock()
} e
\texttt{unlock()
}.
785 Classe progettata secondo il pattern
\textit{``singleton''
}.
789 \subsubsection*
{\large{Attributi
}}
792 \subsubsection{\_instance}
793 \texttt{private SyncSharedCondition *
\_instance [static
]}
795 \item Puntatore all'eventuale unica istanza della classe.
796 \item Costruzione: inizializzato con il valore
\texttt{0}.
800 \subsubsection{\_point}
801 \texttt{private Point
\_point}
803 \item Fornisce un modo sicuro per il passaggio sincronizzato di un valore di tipo
\texttt{Point
} tra
\textit{thread
} diversi.
804 \item Costruzione: inizializzato in modo automatico con il costruttore di
\textit{default
} nel costruttore della classe.
808 \subsubsection{\_waitCond}
809 \texttt{private QWaitCondition
\_waitCond}
811 \item \`E l'oggetto che permette l'effettiva sincronizzazione richiesta alla classe
\texttt{SyncSharedCondition
}.
812 \item Costruzione: inizializzato in modo automatico con il costruttore di
\textit{default
} nel costruttore della classe.
817 \subsubsection*
{\large{Operazioni
}}
820 \subsubsection{SyncSharedCondition
}
821 \texttt{private SyncSharedCondition()
[constructor
]}
823 \item Comportamento: corpo vuoto.
827 \subsubsection{\~
{}SyncSharedCondition
}
828 \texttt{public \~
{}SyncSharedCondition()
[destructor
]}
830 \item Comportamento: assegna al campo
\texttt{SyncSharedCondition::
\_instance} il valore
\texttt{0}.
834 \subsubsection{instance
}
835 \texttt{public SyncSharedCondition *instance()
[static
]}
839 \item se
\texttt{SyncSharedCondition::
\_instance} è un puntatore nullo gli assegna il valore ritornato dalla chiamata
\verb!new SyncSharedCondition()!.
840 \item ritorna il valore di
\texttt{SyncSharedCondition::
\_instance}.
842 \item Valore ritornato e sua semantica: ritorna un puntatore all'unica istanza della classe, non può mai essere nullo.
846 \subsubsection{notifyMove
}
847 \texttt{public void notifyMove(Point p)
}
849 \item Parametri e precondizioni: il
\textit{thread
} che esegue la chiamata deve aver precedentemente effettuato l'invocazione del metodo
\texttt{lock()
} sull'unica istanza della classe.
852 \item assegna a
\texttt{\_point} il valore di
\texttt{p
};
853 \item esegue
\verb!_waitCond.wakeOne()!.
858 \subsubsection{waitForMove
}
859 \texttt{public Point waitForMove()
}
861 \item Parametri e precondizioni: il
\textit{thread
} che esegue la chiamata deve effettuare prima la chiamata del metodo
\texttt{lock()
} sull'unica istanza della classe.
864 \item \verb!_waitCond.wait(this)!;
865 \item ritorna il valore di
\texttt{\_point}.
871 \subsection{Classe AbstractSettings
}
873 \subsubsection*
{Descrizione generale
}
874 Classe astratta che dichiara l'interfaccia necessaria a salvare in modo persistente alcune impostazioni dell'applicazione.
877 \subsubsection*
{\large{Operazioni
}}
880 \subsubsection{setLanguage
}
881 \texttt{public void setLanguage(QString lang)
[abstract
]}
884 \subsubsection{setGeometry
}
885 \texttt{public void setGeometry(QByteArray geom)
[abstract
]}
888 \subsubsection{setDockState
}
889 \texttt{public void setDockState(QByteArray state)
[abstract
]}
892 \subsubsection{setDefaultCubeColor
}
893 \texttt{public void setDefaultCubeColor(QColor
color)
[abstract
]}
896 \subsubsection{setBackgroundColor
}
897 \texttt{public void setBackgroundColor(QColor
color)
[abstract
]}
900 \subsubsection{language
}
901 \texttt{public QString language()
[abstract, const
]}
904 \subsubsection{geometry
}
905 \texttt{public QByteArray geometry()
[abstract, const
]}
908 \subsubsection{dockState
}
909 \texttt{public QByteArray dockState()
[abstract, const
]}
912 \subsubsection{defaultCubeColor
}
913 \texttt{public QColor defaultCubeColor()
[abstract, const
]}
916 \subsubsection{backgroundColor
}
917 \texttt{public QColor backgroundColor()
[abstract, const
]}
921 \subsection{Classe SettingsManager
}
923 \subsubsection*
{Descrizione generale
}
924 Classe astratta che deriva da
\texttt{AbstractSettings
} e ne arricchisce l'interfaccia.
927 \subsubsection*
{\large{Operazioni
}}
930 \subsubsection{setPlayersInfo
}
931 \texttt{public void setPlayersInfo(QList<PlayerInfo> info)
[abstract
]}
934 \subsubsection{setDifficulty1
}
935 \texttt{public void setDifficulty1(int d1)
[abstract
]}
938 \subsubsection{setDifficulty2
}
939 \texttt{public void setDifficulty2(int d2)
[abstract
]}
942 \subsubsection{playersInfo
}
943 \texttt{public QList<PlayerInfo> playersInfo()
[abstract, const
]}
946 \subsubsection{difficulty1
}
947 \texttt{public int difficulty1()
[abstract, const
]}
950 \subsubsection{difficulty2
}
951 \texttt{public int difficulty2()
[abstract, const
]}
955 \subsection{Classe GUISettings
}
957 \subsubsection*
{Descrizione generale
}
958 Classe che deriva da
\texttt{AbstractSettings
} e ne implementa l'interfaccia utilizzando le funzionalità fornite dalla derivazione protetta dalla classe
\texttt{QSettings
}.
961 \subsubsection*
{\large{Operazioni
}}
964 \subsubsection{setLanguage
}
965 \texttt{public void setLanguage(QString lang)
[virtual
]}
967 \item Comportamento:
\verb!setValue("GUI/language", lang)!
971 \subsubsection{setGeometry
}
972 \texttt{public void setGeometry(QByteArray geom)
[virtual
]}
974 \item Comportamento:
\verb!setValue("GUI/geometry", geom)!
978 \subsubsection{setDockState
}
979 \texttt{public void setDockState(QByteArray state)
[abstract
]}
981 \item Comportamento:
\verb!setValue("GUI/dock_state", state)!
985 \subsubsection{setDefaultCubeColor
}
986 \texttt{public void setDefaultCubeColor(QColor
color)
[virtual
]}
988 \item Comportamento:
\verb!setValue("GUI/cube_color",
color)!
992 \subsubsection{setBackgroundColor
}
993 \texttt{public void setBackgroundColor(QColor
color)
[virtual
]}
995 \item Comportamento:
\verb!setValue("GUI/bg_color",
color)!
999 \subsubsection{language
}
1000 \texttt{public QString language()
[const, virtual
]}
1002 \item Comportamento:
\verb!return value("GUI/language", "").toString()!
1006 \subsubsection{geometry
}
1007 \texttt{public QByteArray geometry()
[const, virtual
]}
1009 \item Comportamento:
\verb!return value("GUI/geometry",!\\
\verb!QByteArray()).toByteArray()!
1013 \subsubsection{dockState
}
1014 \texttt{public QByteArray dockState()
[abstract, const
]}
1016 \item Comportamento:
\verb!return value("GUI/dock_state",!\\
\verb!QByteArray()).toByteArray()!
1020 \subsubsection{defaultCubeColor
}
1021 \texttt{public QColor defaultCubeColor()
[const, virtual
]}
1023 \item Comportamento:
\verb!return value("GUI/cube_color",!\\
\verb!QColor(parametri)).value<QColor>()!
1027 \subsubsection{backgroundColor
}
1028 \texttt{public QColor backgroundColor()
[const, virtual
]}
1030 \item Comportamento:
\verb!return value("GUI/bg_color",!\\
\verb!QColor(parametri)).value<QColor>()!
1035 \subsection{Classe LocalSettings
}
1037 \subsubsection*
{Descrizione generale
}
1038 Classe che deriva da
\texttt{GUISettings
} e
\texttt{SettingsManager
}, della quale implementa l'interfaccia dichiarata utilizzando le funzionalità fornite dalla derivazione protetta dalla classe
\texttt{QSettings
} attraverso la classe
\texttt{GUISettings
}. \`E la classe pensata per mantenere la persistenza dei dati richiesti nella modalità stand-alone.
1041 \subsubsection*
{\large{Operazioni
}}
1044 \subsubsection{setPlayersInfo
}
1045 \texttt{public void setPlayersInfo(QList<PlayerInfo> info)
[virtual
]}
1047 \item Comportamento: se
\texttt{info.size() ==
2} allora esegue \\
\verb!info.append(PlayerInfo())!.
1048 \
\Poi $
\forall i$ in $
[0,
2]$:
1050 \item \verb!setValue("Local/player_" + QString::number(!$i$
\verb!) +!\\
\verb! "_name", info.at(!$i$
\verb!).name())!
1051 \item \verb!setValue("Local/player_" + QString::number(!$i$
\verb!) +!\\
\verb! "_color", info.at(!$i$
\verb!).
color())!
1052 \item \verb!setValue("Local/player_" + QString::number(!$i$
\verb!) +!\\
\verb! "_type", info.at(!$i$
\verb!).type())!
1057 \subsubsection{setDifficulty1
}
1058 \texttt{public void setDifficulty1(int d1)
[virtual
]}
1060 \item Comportamento:
\verb!setValue("Local/d1", d1)!
1064 \subsubsection{setDifficulty2
}
1065 \texttt{public void setDifficulty2(int d2)
[virtual
]}
1067 \item Comportamento:
\verb!setValue("Local/d2", d2)!
1071 \subsubsection{playersInfo
}
1072 \texttt{public QList<PlayerInfo> playersInfo()
[const, virtual
]}
1074 \item Comportamento: crea una
\texttt{QList<PlayerInfo> info
} vuota; crea una
\texttt{QList<QColor> defaultColors
} e inserisce gli elementi
\verb!QColor(
255,
0,
0)!,
\verb!QColor(
0,
255,
0)! e
\verb!QColor(
0,
0,
255)!; crea una
\texttt{QList<QString>
} e inserisce gli elementi
\verb!"H"!,
\verb!"A"! e
\verb!""!.
1075 \
\Poi $
\forall i$ in $
[0,
2]$:
1077 \item \verb!n = value("Local/player_" + QString::number(!$i$
\verb!) +!\\
\verb! "_name", "").toString()!
1078 \item \verb!c = value("Local/player_" + QString::number(!$i$
\verb!) +!\\
\verb! "_color",defaultColors
[!$i$
\verb!
]).value<QColor>()!
1079 \item \verb!t = value("Local/player_" + QString::number(!$i$
\verb!) +!\\
\verb! "_type", defaultTypes
[!$i$
\verb!
]).toString()!
1080 \item se
\verb|t != ""| esegue
\verb!info.append(PlayerInfo(n, c, t))!.
1082 Infine ritorna la lista
\texttt{info
}.
1086 \subsubsection{difficulty1
}
1087 \texttt{public int difficulty1()
[const, virtual
]}
1089 \item Comportamento:
\verb!return value("Local/d1",
5).toInt()!
1093 \subsubsection{difficulty2
}
1094 \texttt{public int difficulty2()
[const, virtual
]}
1096 \item Comportamento:
\verb!return value("Local/d2",
1).toInt()!
1101 \subsection{Classe ServerSettings
}
1103 \subsubsection*
{Descrizione generale
}
1104 Classe che deriva da
\texttt{GUISettings
} e
\texttt{SettingsManager
}, della quale implementa l'interfaccia dichiarata utilizzando le funzionalità fornite dalla derivazione protetta dalla classe
\texttt{QSettings
} attraverso la classe
\texttt{GUISettings
}. \`E la classe pensata per mantenere la persistenza dei dati richiesti nella modalità server.
1107 \subsubsection*
{\large{Operazioni
}}
1110 \subsubsection{setPlayersInfo
}
1111 \texttt{public void setPlayersInfo(QList<PlayerInfo> info)
[virtual
]}
1113 \item Comportamento: se
\texttt{info.size() ==
2} allora esegue \\
\verb!info.append(PlayerInfo())!.
1114 \
\Poi $
\forall i$ in $
[0,
2]$:
1116 \item \verb!setValue("Server/player_" + QString::number(!$i$
\verb!) +!\\
\verb! "_name", info.at(!$i$
\verb!).name())!
1117 \item \verb!setValue("Server/player_" + QString::number(!$i$
\verb!) +!\\
\verb! "_color", info.at(!$i$
\verb!).
color())!
1118 \item \verb!setValue("Server/player_" + QString::number(!$i$
\verb!) +!\\
\verb! "_type", info.at(!$i$
\verb!).type())!
1123 \subsubsection{setDifficulty1
}
1124 \texttt{public void setDifficulty1(int d1)
[virtual
]}
1126 \item Comportamento:
\verb!setValue("Server/d1", d1)!
1130 \subsubsection{setDifficulty2
}
1131 \texttt{public void setDifficulty2(int d2)
[virtual
]}
1133 \item Comportamento:
\verb!setValue("Server/d2", d2)!
1137 \subsubsection{setServerPort
}
1138 \texttt{public void setServerPort(quint16 port)
}
1140 \item Comportamento:
\verb!setValue("Server/port", port)!
1144 \subsubsection{setTimerDuration
}
1145 \texttt{public void setTimerDuration(int msec)
}
1147 \item Comportamento:
\verb!setValue("Server/timer", msec)!
1151 \subsubsection{setMyColor
}
1152 \texttt{public void setMyColor(QColor
color)
}
1154 \item Comportamento:
\verb!setValue("Server/my_color",
color)!
1158 \subsubsection{playersInfo
}
1159 \texttt{public QList<PlayerInfo> playersInfo()
[const, virtual
]}
1161 \item Comportamento: crea una
\texttt{QList<PlayerInfo> info
} vuota; crea una
\texttt{QList<QColor> defaultColors
} e inserisce gli elementi
\verb!QColor(
255,
0,
0)!,
\verb!QColor(
0,
255,
0)! e
\verb!QColor(
0,
0,
255)!.
1162 \
\Poi $
\forall i$ in $
[0,
2]$:
1164 \item \verb!n = value("Server/player_" + QString::number(!$i$
\verb!) +!\\
\verb! "_name", "").toString()!
1165 \item \verb!c = value("Server/player_" + QString::number(!$i$
\verb!) +!\\
\verb! "_color",defaultColors
[!$i$
\verb!
]).value<QColor>()!
1166 \item \verb!t = value("Server/player_" + QString::number(!$i$
\verb!) +!\\
\verb! "_type", "R").toString()!
1167 \item se
\verb|t != ""| esegue
\verb!info.append(PlayerInfo(n, c, t))!.
1169 Infine ritorna la lista
\texttt{info
}.
1173 \subsubsection{difficulty1
}
1174 \texttt{public int difficulty1()
[const, virtual
]}
1176 \item Comportamento:
\verb!return value("Server/d1",
5).toInt()!
1180 \subsubsection{difficulty2
}
1181 \texttt{public int difficulty2()
[const, virtual
]}
1183 \item Comportamento:
\verb!return value("Server/d2",
1).toInt()!
1187 \subsubsection{serverPort
}
1188 \texttt{public quint16 serverPort()
[const
]}
1190 \item Comportamento:
\verb!return value("Server/port",
42000).toUint()!
1194 \subsubsection{timerDuration
}
1195 \texttt{public int timerDuration()
[const
]}
1197 \item Comportamento:
\verb!return value("Server/timer",
180000).toInt()!
%% 3 minuti %%
1201 \subsubsection{myColor
}
1202 \texttt{public QColor myColor()
[const
]}
1204 \item Comportamento:
\verb!return value("Server/my_color",!\\
\verb!QColor(parametri)).value<QColor>()!
1209 \subsection{Diagrammi UML
} %%%%%%%%
1211 \begin{figure
}[hpbt
]
1213 \includegraphics[width=
13cm
]{HumanPlayer_doMove.png
}
1214 \caption{Diagramma
\texttt{HumanPlayer::doMove
}}
1215 \label{fig:HP_doMove
}
1218 \begin{figure
}[hpbt
]
1220 \includegraphics[width=
13cm
]{RemotePlayer_doMove.png
}
1221 \caption{Diagramma
\texttt{RemotePlayer::doMove
}}
1222 \label{fig:RP_doMove
}
1225 \begin{figure
}[hpbt
]
1227 \includegraphics[width=
7cm
]{AIPlayer_doMove.png
}
1228 \caption{Diagramma
\texttt{AIPlayer::doMove
}}
1229 \label{fig:AP_doMove
}
1232 \begin{figure
}[hpbt
]
1234 \includegraphics[width=
13cm
]{GameLoop_run.png
}
1235 \caption{Diagramma
\texttt{GameLoop::run
}}
1239 \begin{figure
}[hpbt
]
1241 \includegraphics[width=
13cm
]{GameMatrix_add.png
}
1242 \caption{Diagramma
\texttt{GameMatrix::add
}}