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