Buen día a todos.
Esta publicación tiene la intención de mostrar un programa simple que construí acerca del juego muy conocido por todos Piedra, Papel y Tijeras. El código esta basando en el programa Chat de la Doctora Elisa y PPT tambien de ella que se pueden encontrar al final de la publicación.
El programa esta dividido en los siguientes tres archivos.
Este es el archivo "Client.java".
package PPT;
import java.util.Scanner;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
public class Client extends Principal {
public Client(String name) { // Constructor recibe el nombre y pues revisar constructor de principal para saber que hace con este
super(name);
}
public void actionPerformed( ActionEvent e){ // redefine esta funcion para que solo envie la informacion, todo lo logico lo hace el servidor
String cmd = e.getActionCommand();
if (cmd == "Piedra"){
this.envia.println("1");
return;
}
if (cmd == "Papel"){
this.envia.println("2");
return;
}
if (cmd == "Tijeras"){
this.envia.println("3");
return;
}
}
protected boolean lector() { // todo lo que le llegue lo imrpime en la pantalla
try {
String s = this.recibe.readLine().trim();
if (s != null) {
System.out.println(" Mensaje recibido "+s);
this.Texto.append(s + "\n");
super.repaint();
}
} catch (Exception e) {}
return true;
}
public static final Scanner into = // Scaner para escibir el ip y el nombre en el CMD
new Scanner(System.in);
public static void main(String[] args) {
// nombre, puerto y servidor(iP)
String direccion, puerto;
System.out.print(" Introduza El Puerto \n >>");
puerto = Server.into.next();
System.out.print(" Introduza El IP \n >>");
direccion = Server.into.next();
System.out.print(" Introduza Su Nombre \n >>");
Client cc = new Client("Cliente - "+Server.into.next()); // nuevo objeto cliente que y le manda el nombre del jugador ala funcion constructora
try {
cc.corre(Integer.parseInt(puerto), direccion); // le manda el puerto y la direccion ala funcion corre que despues manda la informaciona abrirflujo que abre un socket
} catch (Exception e) {
System.err.println("No se pudo establecer la conexion talves este mal el puerto o la Ip");//ERROR -.-
}
}
private void corre(int puerto, String servidor) // recibe puerto e IP
throws IOException {
try {
super.abrirFlujo(new Socket(servidor, puerto)); // Configura el socket y lo abre
} catch (UnknownHostException e) {
System.err.println("Desconozco el servidor " +
servidor + ".");
System.exit(1);
} catch (IOException e) {
System.err.println("No se pudo conectar a " + // No se puedo conectar se sale
servidor + ".");
System.exit(1);
} catch (Exception e) {
System.err.println("Algo no funciona.");
System.exit(1);
}
while (true) { // cicla hasta que manden falso pero no puse ningun comando para eso o.0
try {
Thread.sleep(200);// duerme. asi no se gasta toda la potencia de la computadora
} catch (Exception e) {}
if (!this.lector()) { // manda a lector quien verifica si se ha mandandado algo
break;
}
}
super.cerrarFlujo(); // se cierran los buffers
return;
}
}
Este es el archivo "Server.java".
package PPT;
import java.util.Scanner;
import java.net.*;
import java.io.*;
public class Server extends Principal { // Extiende aprincipañ
public Server(String name) {// el metodo constructor que recibe el nombre
super(name);
}
public void corre(int puerto) { //
ServerSocket servidor = null;
Socket entrante = null;
BufferedReader recibes = null;
String entrada = null;
try {
servidor = new ServerSocket(puerto); // nuevo socket para servidor
} catch (IOException e) {
System.err.println("No se pudo " +
"escuchar al puerto " +
puerto + ".");
}
// aceptar una conexion entrante
try {
System.out.println("Listo para aceptar " +
"una conexion al puerto "
+ puerto + ".");
super.abrirFlujo(servidor.accept()); // esto no estoy seguro para que sirve me lo copie de la doc pero supongo que solo conecta el socket servidor con el printwriter y bufferReader
while (true) {
try {
Thread.sleep(200);
} catch (Exception e) {}
if (!super.leer()) { // manda ala funcion leer
break;
}
}
super.cerrarFlujo(); // cierra el socket
servidor.close();// cierra los bufers
} catch (Exception e) {
System.err.println("Hubo pleito:"); // Errores
e.printStackTrace();
}
System.exit(-1);
return;
}
public static final Scanner into = // escaner para el nombre y el puerto
new Scanner(System.in);
public static void main(String[] args) {
System.out.print(" Introduza El Puerto \n >>");
String puerto = Server.into.next();
System.out.print(" Introduza su nombre \n >>");
Server cs = new Server("Servidor - " + Server.into.next()); // se crea un objeto servidor
cs.corre(Integer.parseInt(puerto));
return;
}
}
Este es el archivo "Principal.java"
package PPT; // paquete PPT
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*; // Libreria para el BufferReader y el printWriter
import java.net.*; // Libreria para el socket
class Principal extends JFrame implements ActionListener{
protected PrintWriter envia; //
protected BufferedReader recibe;
protected Socket flujo;
protected JTextArea Texto = new JTextArea(" Bienvenido al juego de Piedra, Papel y Tijeras",40,40); // area para escribir en pantalla
protected JScrollPane barra; // barra para visualizar el texto que no cabe en el JtextArea
protected String name;
protected int jugador = 0, eleccion1 = 0, eleccion2 = 0; // Jugador Elección
protected boolean player1 = true, player2 = true; // para lo funcion logico
protected void abrirFlujo(Socket s) throws Exception { // Consfigura el socket
this.flujo = s; // Socket que recibe de los class cliente o servidor
this.envia = new PrintWriter(this.flujo.getOutputStream(), true); // manda la informacion escribiendo en el socket
this.recibe = new BufferedReader(new InputStreamReader(this.flujo.getInputStream())); // Lee el buffer del socket y traduce la informacion que le llega
}
protected boolean leer() { // funcion que verifica si se ah enviado elago y si es asi lo reconoce como texto y lo imprime o como una eleccion del jugador y lo manda a la funcion logico
try {
String s = this.recibe.readLine().trim(); // lee lo que que esta en el buffer y segun entinedo el .trim borra los espacios al principio y al final
if (s != null) {
System.out.println(" Mensaje recibido ");
if( (Integer.parseInt(s) == 1) ||(Integer.parseInt(s) == 2) ||(Integer.parseInt(s) == 3)){ // si es una eleccion del jugador
System.out.println(" Lo que llego al servidor Se envia a el operador logico");
this.logico(Integer.parseInt(s),2);// lo manda a logico
}
else{
this.Texto.append(s + "\n"); // si no es una eleccion se imprime en el JTextArea
super.repaint();
}
}
} catch (Exception e) { System.out.println(" Error al recibir un mensaje");}
return true;
}
protected void cerrarFlujo() { // cierra los buffers y el socket
try {
this.recibe.close();
this.envia.close();
this.flujo.close();
} catch (Exception e) {}
super.setVisible(false); // si no se logra hace que se desaparesca la ventana
return;
}
// servidor el 1 cliente el 2
// 1 Piedra, 2 Papel y 3 tijeras
public void logico(int a, int b){// la funciona logico recibe dos variables
jugador = b; // una para identificar quien la llama
if( jugador == 1) // y la otra para identificar el comando del que la llama
eleccion1 = a;
else
eleccion2 = a;
System.out.println("Servidor = "+eleccion1+" - Cliente = " + eleccion2);
if((eleccion1 != 0) && (player1 == true)){ // funcion que hace saber a los dos jugadores que uno ah hecho su eleccion
switch(eleccion1){
case 1: this.Texto.append(" Has picado Piedra - Esperando al oponente ... \n");
break;
case 2: this.Texto.append(" Has picado Papel - Esperando al oponente ... \n"); //texto para el servidor
break;
case 3: this.Texto.append(" Has picado Tijeras - Esperando al oponente ... \n");
break;
}
this.envia.println(" "+name+" esta esperandote ... ");// texto para el cliente
super.repaint();
player1 = false; // en caso de hacer su eleccion no se puede volver a llegar hasta esta parte hasta que el otro tambien haga la suya
}
if((eleccion2 != 0) && (player2 == true)){
switch(eleccion2){
case 1:this.envia.println(" Has picado Piedra - Esperando al oponente ... ");
break;
case 2:this.envia.println(" Has picado Papel - Esperando al oponente ... ");
break;
case 3:this.envia.println(" Has picado Tijeras - Esperando al oponente ... "); //Texto para el cliente
break;
}
this.Texto.append(" "+name+" esta esperandote ... \n"); // texto para el servidor
super.repaint();
player2 = false;
}
if( (eleccion1 != 0) && (eleccion2 != 0)){
switch(eleccion1){ // Cuatro switch para poder identificar al ganador y despues imprime una notificacion a los dos jugadores
case 1:
switch(eleccion2){
case 1: this.Texto.append(" Empate o_o\n\n");
this.envia.println(" Empate o_o\n");
super.repaint();
break;
case 2:this.Texto.append(" Lo siento pero has perdido tu oponente escogio Papel :/\n\n"); // servidor
this.envia.println(" Felicidades Ganaste!!! be happy =D \n"); // cliente
super.repaint();
break;
case 3:this.Texto.append(" Felicidades Ganaste!!!! restregaselo en la cara ;) \n\n");
this.envia.println(" Lo siento tu oponente escogio Piedra :/ \n");
super.repaint();
break;
}
break;
case 2: switch(eleccion2){
case 1:this.Texto.append(" Felicidades Ganaste!!! be happy =D\n\n");
this.envia.println(" Lo siento perdiste tu oponente eligio Papel :/ \n");
super.repaint();
break;
case 2:this.Texto.append(" Empate o_o\n\n");
this.envia.println(" Empate o_o \n\n");
super.repaint();
break;
case 3:this.Texto.append(" Lo siento perdiste tu oponente eligio Tijeras :/\n\n");
this.envia.println(" Felicidades Ganaste!!! restregaselo en la cara ;)\n");
super.repaint();
break;
}
break;
case 3: switch(eleccion2){
case 1:this.Texto.append(" Lo siento perdiste tu oponente eligio Piedra :/\n\n");
this.envia.println(" Felicidades Ganaste!!! be happy =D \n");
super.repaint();
break;
case 2:this.Texto.append(" Felicidades Ganaste!!! restregaselo en la cara ;) \n\n");
this.envia.println(" Lo siento perdiste tu oponente eligio Tijeras :/ \n");
super.repaint();
break;
case 3:this.Texto.append(" Empate o_o\n\n");
this.envia.println(" Empate o_o \n");
super.repaint();
break;
}
break;
}
eleccion1 = eleccion2 = 0; // eleccion se vuelve cero para poder jugar otra ves
player1 = player2 = true; // igual se vuelven verdaderas
return;
}
}
public Principal (String nombre){ // Recibe el nombre del jugador de las clases cliente o servidor
name = nombre; // lo guarda en una variable para la clase
super.setLocation(300,200); // locacion del la ventana
super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Salir del programa en caso de cerrar la ventana
super.setTitle("Piedra, Papel y Tijera"); // Titulo de la ventana
this.Texto.setEditable(false); // El texto dentro del JTextArea no puede ser editado por el usuario
JPanel PBoton = new JPanel(new GridLayout(3,0)); // panel auxiliar que contiene a los botones y un layout para este
JButton Pi = new JButton("Piedra"); // Los botones
Pi.setActionCommand("Piedra"); // el comando que mandara a el escuchador
Pi.addActionListener(this); // Se asigna una funcion que escuche al boton
JButton Pa = new JButton("Papel");
Pa.setActionCommand("Papel");
Pa.addActionListener(this);// se le asigna el escuchador que extiende esta ventana por eso se manda el this
JButton T = new JButton("Tijeras");
T.setActionCommand("Tijeras");
T.addActionListener(this);
PBoton.add(Pi,1,0);
PBoton.add(Pa,2,0);
PBoton.add(T,3,0);
barra = new JScrollPane(Texto); // Barra la barra debe contener el area de texto
super.setLayout( new BorderLayout());
super.add(this.barra, BorderLayout.CENTER);
super.add(PBoton, BorderLayout.SOUTH);
super.setSize(400,400); // dimenciones de la ventana
super.setVisible(true); // Hacer visible la ventana
Texto.append("\n\n "+name+" - Esperando al contrincante...\n");
}
// 1 piedra, 2 papel, 3 tijera
public void actionPerformed( ActionEvent e){// YO SOY UNA FUNCION QUE ESCUCHA
String cmd = e.getActionCommand(); // El action event es como el mensajero y le da el mensaje al String cmd
if (cmd == "Piedra"){ // dependiento de el comando le envia un numero y el identificador de jugador a logico
this.logico(1, 1);
return;
}
if (cmd == "Papel"){
this.logico(2, 1);
return;
}
if (cmd == "Tijeras"){
this.logico(3, 1);
return;
}
}
}
Son tres partes todas van dentro de la carpeta PPT.
para compilarlo se compila toda la carpeta de esta manera:
Todos los objetos están dentro de la carpeta "PPT" que en el ejemplo de abajo esta dentro de la carpeta "Max". Para ejecutar el cliente y el servidor, tienes que posicionarte dentro de la carpeta "Max" y ejecutar el paquete "PPT" de la siguiente manera:
Servidor:
Cliente: