import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Formatter;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
public class Cliente extends JFrame implements Runnable, ActionListener {
private JTextField jTextField1;
private JTextField jTextField2;
private JTextArea jTextArea;
private JButton boton;
private String[][] tablero = {{"1", "1", "1", "1", "1", "1", "1", "1", "1"},
{"", "", "", "", "", "", "", "", ""},
{"", "", "", "", "", "", "", "", ""},
{"", "", "", "", "", "", "", "", ""},
{"", "", "", "", "", "", "", "", ""},
{"", "", "1", "", "1", "1", "1", "1", ""},
{"", "", "", "", "", "", "", "", ""},
{"", "", "", "", "", "", "", "", ""},
{"", "", "", "", "", "", "", "", "1"}};
private int[] ubicacionNaves;
private int casillaActual;
private Socket conexion;
private Scanner entrada;
private Formatter salida;
private String host;
private String turno;
private boolean miTurno;
private final String MARCA_1 = "1"; // mark for first client
private final String MARCA_2 = "2"; // mark for second client
public Cliente(String host) {
super("Cliente");
this.host = host;
jTextArea = new JTextArea(4, 30);
jTextArea.setEditable(false);
add(new JScrollPane(jTextArea), BorderLayout.CENTER);
System.out.println("Cliente: Inicializada Area de Texto");
jTextField1 = new JTextField();
jTextField1.setEditable(false);
add(jTextField1, BorderLayout.NORTH);
System.out.println("Cliente: Inicializada TextField 1");
jTextField2 = new JTextField();
jTextField2.setEditable(true);
jTextField2.addActionListener(this);
add(jTextField2, BorderLayout.SOUTH);
System.out.println("Cliente: Inicializada TextField 2");
ubicacionNaves = new int[15];
getNaves();
setSize(300, 225);
setVisible(true);
iniciarCliente();
System.out.println("Cliente: Iniciando Cliente...");
}
private void getNaves() {
int index = 0;
int ubicacion = 0;
for (int i = 0; i < tablero.length; i++) {
for (int y = 0; y < tablero[0].length; y++) {
if (tablero[i][y].equals("1")){
ubicacionNaves[index] = ubicacion;
index++;
}
ubicacion++;
}
}
}
public void iniciarCliente() {
try {
conexion = new Socket(InetAddress.getByName(host), 12345);
entrada = new Scanner(conexion.getInputStream());
salida = new Formatter(conexion.getOutputStream());
System.out.println("Cliente: Cliente iniciado");
//Para enviar el tablero, envia un negativo
for(int i = 0; i<ubicacionNaves.length; i++){
int temp = ubicacionNaves[i];
int temp2 = temp * 2;
salida.format("%d\n", temp-temp2);
salida.flush();
}
} catch (IOException ioException) {
ioException.printStackTrace();
}
ExecutorService worker = Executors.newFixedThreadPool(1);
System.out.println("Cliente: Ejecutor Iniciado");
worker.execute(this);
System.out.println("Cliente: Hilo Iniciando");
}
public void run() {
turno = entrada.nextLine();
System.out.println("Cliente: Capturando Turno");
SwingUtilities.invokeLater(
new Runnable() {
public void run() {
jTextField1.setText("Eres el jugador\"" + turno + "\"");
System.out.println("Cliente: Indicando Turno");
}
});
miTurno = (turno.equals(MARCA_1));
System.out.println("Cliente: Asignando Turno");
while (true) {
if (entrada.hasNextLine()) {
procesarMensaje(entrada.nextLine());
System.out.println("Cliente: Capturando Mensajes");
}
}
}
private void procesarMensaje(String mensaje) {
if (mensaje.equals("Jugada Valida.")) {
mostrarMensaje("Jugada Valida, espere.\n");
System.out.println("Cliente: Procesando Jugada Valida");
} else if (mensaje.equals("Jugada Invalida, prueba otra vez")) {
mostrarMensaje(mensaje + "\n");
miTurno = true;
System.out.println("Cliente: Procesando Jugada invalida");
} else if (mensaje.equals("Movida Oponente")) {
int location = entrada.nextInt();
entrada.nextLine();
int row = location / 3;
int column = location % 3;
mostrarMensaje(Integer.toString(location));
mostrarMensaje("Movida del Oponente. Su turno.\n");
miTurno = true;
System.out.println("Cliente: Procesando jugada del oponente");
} else if (mensaje.equals("Conexion Rechazada\n")) {
JOptionPane.showMessageDialog(rootPane, "Conexion Rechazada desde el Servidor");
} else {
mostrarMensaje(mensaje + "\n");
}
}
private void mostrarMensaje(final String mensaje) {
SwingUtilities.invokeLater(
new Runnable() {
public void run() {
jTextArea.append(mensaje);
System.out.println("Cliente: Mostrando mensaje");
}
});
}
public void enviarJugada(int location) {
if (miTurno) {
salida.format("%d\n", location);
salida.flush();
miTurno = false;
System.out.println("Cliente: Enviando Jugada");
}
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == jTextField2) {
int num = Integer.parseInt(jTextField2.getText());
enviarJugada(num);
jTextField2.setText("");
System.out.println("Cliente: Capturando Evento");
}
}
}