24.8 Juego de Tres en raya (Gato) tipo cliente/servidor, utilizando un servidor con subprocesamiento...
1027
en la línea 280 se envía un mensaje al cliente indicando que el movimiento fue inválido. El programa mantiene
las ubicaciones en el tablero como números del 0 al 8 (del 0 al 2 para la primera fi la, del 3 al 5 para la segunda y
del 6 al 8 para la tercera).
1
// Fig. 24.14: PruebaServidorTresEnRaya.java
2
// Prueba el ServidorTresEnRaya.
3
import
javax.swing.JFrame;
4
5
public class
PruebaServidorTresEnRaya
6
{
7
public static void
main( String args[] )
8
{
9
ServidorTresEnRaya aplicacion =
new
ServidorTresEnRaya();
10
aplicacion.setDefaultCloseOperation(
JFrame.EXIT_ON_CLOSE
);
11
aplicacion.execute();
12
}
// fin de main
13
}
// fin de la clase PruebaServidorTresEnRaya
Figura 24.14
| Clase que prueba el servidor de Tres en raya.
El método
validarYMover
(líneas 118 a 163 en la clase
ServidorTresEnRaya
) sólo permite que se mueva
un jugador en un momento dado, con lo cual se evita que ambos jugadores modifi quen la información de estado
del juego al mismo tiempo. Si el
Jugador
que trata de validar un movimiento no es el jugador actual (es decir, el
que puede hacer un movimiento), ese
Jugador
se coloca en estado de
espera hasta que sea su turno para realizar un
movimiento. Si la ubicación para el movimiento que se está validando ya está ocupada en el tablero,
validarY-
Mover
devuelve
false
. En caso contrario, el servidor coloca una marca para el jugador en su representación local
del tablero (línea 142), notifi ca al otro objeto
Jugador
(línea 146) que se ha realizado un movimiento (para que
se pueda enviar un mensaje al cliente), invoca al método
signal
(línea 152) para que el
Jugador
en espera (si hay
uno) pueda validar un movimiento y devuelve
true
(línea 159) para indicar que el movimiento es válido.
La clase
ClienteTresEnRaya
Cada aplicación
ClienteTresEnRaya
(fi gura 24.15) mantiene su propia versión de GUI del tablero de Tres en
raya en el que se muestra el estado del juego. Los clientes pueden colocar una marca solamente en un cuadro vacío
en el tablero. La clase interna
Cuadro
(líneas 205 a 262 de la fi gura 24.15) implementa a cada uno de los nueve
cuadros en el tablero. Cuando un objeto
ClienteTresEnRaya
comienza a ejecutarse, crea un objeto
JTextArea
en el cual se muestran los mensajes del servidor, junto con una representación del tablero en la que se muestran
nueve objetos
Cuadro
. El método
iniciarCliente
(líneas 80 a 100) abre una conexión con el servidor y obtiene
los fl ujos de entrada y salida asociados del objeto
Socket
. En las líneas 85 y 86 se realiza una conexión con el
servidor. La clase
ClienteTresEnRaya
implementa a la interfaz
Runnable
, por lo que un subproceso separado
24_MAQ_CAP_24_Deiltel.indd1027
4/19/081:35:02AM