<div class="page">
<div class="cover text-center">
<img class="mx-auto" src=/itb/images/logo_mislata.png alt="logo">
# 3 en ratlla
<div class="text-end fit-content ms-auto my-3 mt-auto pt-3">
<p><strong>Autor:</strong> Joan Puigcerver Ibáñez</p>
<p><strong>Correu electrònic:</strong> j.puigcerveribanez@edu.gva.es</p>
<p><strong>Curs:</strong> 2024/2025</p>
</div>
<div>
<p class="fw-bold mb-0">Llicència: BY-NC-SA</p>
<p class="d-none d-md-block">(Reconeixement - No Comercial - Compartir Igual)</p>
<a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.ca" target="_blank">
<img class="mx-auto" src="/itb/images/license.png" alt="Licence"/>
</a>
</div><!--license-->
</div><!--cover-->
</div><!--page-->
{:toc}
# Objectius
Implementar un programa amb estructura client-servidor
amb un protocol complex utilitzant l'eniviament d'objectes.
# Introducció
Tots els exercicis han d'estar situats en el package corresponent.
- __Package:__ ud3.exericises.tictactoe
Acaba la implementació del joc 3 en ratlla basante amb el codi font proporcionat.
## Codi font
- __Models__:
- <a href="/itb/DAM-PSP/files/ud3/exercicis/tictactoe/models/Board.java" download="Board.java">Board.java</a>
- <a href="/itb/DAM-PSP/files/ud3/exercicis/tictactoe/models/BoardChoice.java" download="BoardChoice.java">BoardChoice.java</a>
- <a href="/itb/DAM-PSP/files/ud3/exercicis/tictactoe/models/TicTacToeMessage.java" download="TicTacToeMessage.java">TicTacToeMessage.java</a>
- <a href="/itb/DAM-PSP/files/ud3/exercicis/tictactoe/models/TicTacToeMessageType.java" download="TicTacToeMessageType.java">TicTacToeMessageType.java</a>
- __Servidor__:
- <a href="/itb/DAM-PSP/files/ud3/exercicis/tictactoe/server/TicTacToeServer.java" download="TicTacToeServer.java">TicTacToeServer.java</a>
- <a href="/itb/DAM-PSP/files/ud3/exercicis/tictactoe/server/TicTacToeGame.java" download="TicTacToeGame.java">TicTacToeGame.java</a>
- <a href="/itb/DAM-PSP/files/ud3/exercicis/tictactoe/server/TicTacToeServerPlayerHandler.java" download="TicTacToeServerPlayerHandler.java">TicTacToeServerPlayerHandler.java</a>
- __Client__:
- <a href="/itb/DAM-PSP/files/ud3/exercicis/tictactoe/client/TicTacToeClient.java" download="TicTacToeClient.java">TicTacToeClient.java</a>
## TicTacToeServer
El servidor és l'encarregat de gestionar les partides de 3 en ratlla.
- El servidor esperarà a que es connecten dos jugadors perquè comencen una partida entre ells.
- Quan dos jugadors es connecten, llançarà un nou fil que gestionarà la partida entre els dos jugadors.
### TicTacToeGame
Aquest fil és l'encarregat de portar a terme la partida entre els dos jugadors connectats.
Internament, emmagatzemara el tauler `Board` amb l'estat de la partida actual.
Preguntarà per torns als jugadors per un moviment, que anirà actualitzant en el seu tauler. A més,
comunicarà a cada jugador els moviments perquè el client puga actualitzar el seu tauler.
La comunicació es gestionarà mitjançant objectes `TicTacToeMessage`, el qual té un `TicTacToeMessageType`, un missatge i un objecte.
Els misatges poden ser del tipus:
- `INFO`: El servidor envia un missatge d'informàció als clients.
- `ERROR`: El servidor envia un missatge d'error als clients.
- `START_GAME`: El servidor indica als jugadors que la partida acaba de començar.
- `START_TURN`: El servidor indica a un jugador que és el seu torn i que espera rebre la seua jugada.
- `WAIT_TURN`: El servidor indica a un jugador que és el torn del contrincant i que cal esperar la seua jugada.
- `POST`: El client indica al servidor quina és la jugada realitzada.
- `INVALID_CHOICE`: El servidor indica a un jugador que la jugada que ha intentat fer no és correcta i que ha de tornar a triar una jugada.
- `UPDATE_BOARD`: El servidor indica que el tauler ha segut actualitzat amb una nova jugada, indicada en el missatge.
- `END_GAME`: El servidor indica que la partida ha finalitzat.
## TicTacToeClient
El client es composarà d'un únic fil d'execució que ha de reaccionar als missatges enviats pel servidor
i actuar en conseqüència, seguint el protocol.
Aquest lloc web utilitza galetes per millorar l'experiència de l'usuari