Está en la página 1de 46

2012

CAMPO DE BATALLA
RUBY
PROYECTO DE LENGUAJES DE PROGRAMACIN

ANA MORA OCAA ISSAC TORRES 15/06/2012

Introduccin.

Campo de Batalla es un juego de estrategia, de ingenio y reflexin, para dos jugadores. En nuestra versin del Campo de Batalla, el cliente es puesto contra un oponente que puede ser el computador, cualquier otro usuario en red o un jugador en otra computadora.. Cada jugador guarda su propia tabla bidimensional en la que el programa posiciona aleatoriamente un conjunto de naves de varios tamaos. Cada cuadrado de la tabla es una celda. Cada nave ocupa una lnea horizontal o vertical de celdas. Por variedad cada barco es de una clase particular (acorazado, portaaviones, bote de remos, etc.), las naves del usuario son puestas en colores diferentes segn su clase para ayudar al usuario en el seguimiento de las naves. Cada jugador sabe donde estn sus propias naves, pero no tiene informacin sobre las naves del oponente, el tratar de conocer donde se encuentran es parte del juego. Una vez las naves han sido situadas, la batalla empieza. El usuario hace clic en una celda del oponente para disparar. El disparo es comunicado al oponente que responde indicando al usuario si el disparo acert o err. El oponente tiene una oportunidad entonces para disparar un tiro a las naves del usuario y el usuario responde con el resultado. El juego contina as, disparos alternos y las contestaciones. Un disparo en la ltima celda de una nave la hunde. El jugador que primero hunde todas las naves del oponente gana.

Descripcin del juego

Mirando el ejemplo de la primera pgina, el usuario ha disparado en A9, C8, y G2 errneamente (entre otros) y ha acertado en B5. En su ltimo turno, el usuario ha hundido la nave del oponente que ocup la lnea horizontal A4 a travs de A8. El comentario al fondo debe decir el nombre de la nave y el tipo. Mirando las suposiciones de nuestro oponente, ellos no han tenido mucho xito, hay disparos errados esparcidos a lo largo del grfico, y un solo golpe en F1. Los archivos de datos de las naves La informacin de las naves esta almacenada en archivos texto. El archivo comienza con el nmero de clases de naves seguido de la informacin de cada clase. A continuacin esta el nmero de naves y y la informacin de cada nave. El archivo debe estar formateado exactamente como: Num de Clases: 5 <- Nmero de clases de barcos acorazado <- Nombre de esta clase 4 <- Longitud de las naves de esta clase Purpura <- Color del grfico que representa las naves de esta clase
3

(linea en blanco despues de cada clase) portaviones informacin de siguiente clase 5 Verde ... y asi para todas las clases ... Num de Barcos: 7 <- Nmero de barcos a continuacin USS Enterprise <- Nombre del barco Acorazado <- Nombre de la clase del barco (linea en blanco a continuacin de la clase) Andrmeda informacin de siguiente barco portaviones ...y asi para todos los barcos... Se debe probar el programa con varios archivos de datos, en la disquetera a:, que se deben llamar DatoNaves1, DatoNaves2 y as sucesivamente. Al inicio de cada juego el jugador escoge aleatoriamente el archivo a ser usado. Para escogerlo se debe generar un nmero desde 1 hasta el nmero de archivos y este nmero se lo aade a la cadena DatoNaves. Cree sus propios archivos como pruebas. Una ronda del juego Una ronda del juego consiste en ambos jugadores tomando el turno. Si el juego es contra el computador, el jugador juega primero. Existen 5 posibilidades para un disparo: 1. La celda ya ha sido golpeada (indquele que perdio un disparo) 2. El disparo err (indquele que err y marque la celda)

3. El disparo acert (felictelo y marque la celda) 4. El disparo hundi la nave (indquele el nombre, tipo de nave y posicin y mrquelo como hundido) 5. El disparo hundi la ltima nave (felictelo)

Puede a discrecin agregarle sonido y cualquier informacin adicional que mejore el proyecto.

Problemas Encontrados. Problema 1 Debido a que no somos especialistas en la parte grafica encontramos problemas al tratar de generar los botones Solucin: Creando un frame con la ayuda de un IDE

MANUAL DE DISEO
JUEGO CAMPO DE BATALLA

Diagramas de Casos de Uso

Diagrama de clases

Actores: 1. Usuario. 2. Computadora. Diagrama de Casos de Uso: 1. 2. 3. 4. Ingresar al Juego. Comenzar Juego nuevo. Ingreso Coordenadas. Salir del Juego.

Detalle de los Actores:

Actor: 1 Nombre: Usuario Descripcin: Jugador que tiene que ingresar las coordenadas.

Actor: 2 Nombre: Computadora Descripcin: Jugador que tiene que aleatoriamente y enviar retroalimentacin. generar el cdigo

Detalle de los Casos de Uso.

CU: 1 Nombre: Ingresar al Juego. Descripcin: Inicia el Juego Campo de Batalla mostrando una Interfaz sin el tablero

CU: 2 Nombre: Comenzar Juego Descripcin: Comienza el Juego mostrando un Tablero, donde en la parte de abajo se encuentra unos espacios para poner las coordenadas, en el tablero se mostrara la retroalimentacin a cada cdigo.

CU: 3 Nombre: Ingreso coordenadas. Descripcin: El Computador de acuerdo al cdigo generado por el Usuario la primera vez ingresa una retroalimentacin.

10

CU: 4 Nombre: Generar Cdigo. Descripcin: El computador genera su coordenada aleatoriamente.

CU: 5 Nombre: Salir. Descripcin: Salir del Juego.

Caso de uso 1: Ingresar al Juego. Escenario 1.1: Ingreso fue exitoso

11

Asunciones: EL cdigo compilo sin problemas. Resultados: Aparece la ventana de ingreso, que pide que ingrese un dato.

Escenario 1.2: Hubo un error al ingresar.

Asunciones: El cdigo dio errores al compilar. Resultados: No se muestra la ventana de inicio

12

Caso de uso 2: Comenzar Juego. Escenario 2.1: Comienzo Exitoso

Asunciones: El usuario ingreso del numero de archivo, cdigo compilo correctamente. Resultados: Se muestra la interfaz que pide el ingreso de un numero.

Escenario 2.2: Hubo un error al comenzar .

13

Asunciones: El usuario no ingreso un nmero correcto en un rango entre el 1-6. Resultados: Muestra un mensaje pidiendo que ingrese un nmero correcto.

Caso de uso 3: Ingreso de numero de archivo. Escenario 3.1: Ingreso Correcto.

14

Asunciones: El cdigo compilo sin errores Resultados: Muestra mensaje si acert o no en un barco.

Escenario 3.1: Ingreso Incorrecto

15

Asunciones: El cdigo no compilo Resultados: No muestra el tablero

Caso de uso 4: Generacin Cdigo. Escenario 4.1: Generacin Correcta.

16

Asunciones: El cdigo compilo sin errores Resultados: Muestra la clave generada.

17

Escenario 5: Fin del Juego

Asunciones: El cdigo compilo sin errores Resultados: Fin del Juego Batalla de barcos.

18

MANUAL DE USUARIO
JUEGO CAMPO DE BATALLA

19

Introduccin.

El software realizado es una variante del Juego del juego campo de batalla, el cual consiste en que un Jugador debe ingresar un nmero, el cual representad el archivo que l elige, otro jugador (computador) ingresa otro nmero, el cual representa al archivo que ste elige. Cada archivo contiene informacin de los barcos a ser cargados en el tablero. Ambos jugadores ingresan coordenadas del tablero para derribar poco a poco los barcos hasta que uno de los dos gana. Requisitos
NetBeans IDE 6.9 o versiones posteriores.

20

Como ejecutar el Proyecto.

Primero copiamos el archivo del proyecto en cualquier directorio, luego abrimos Netbeans 6.9 o superiores, seguimos los siguientes pasos: 1. Dar click Archivo -> Abrir Proyecto y buscamos la carpeta del proyecto en el directorio que lo guardamos.

2. En la parte derecha tiene que estar el nombre del proyecto, para poder ejecutar el proyecto, el nombre de este debe estar en negritas, sino dar click derecho y click en Establecer como proyecto Principal.

21

5.- Luego en la barra de herramientas dar click en ejecutar.

22

Inicio Campo de Batalla. La primera pantalla que nos aparecer es la siguiente:

En esta ventana debemos ingresar el nmero de archivo que queremos escoger. En el archivo se encuentran los barcos

23

Luego aparece la ventana del tablero donde se pone las coordenadas en letra y nmeros que son las coordenadas del tablero del computador

Si le acertaste a algn barco se mara inmediatamente la celda donde le diste y sale un mensaje que dice:

24

Tanto para el jugador como para la computadora.

Si no le acertaste sale un mensaje diciendo:

Tanto para el jugador como para la computadora.


25

Los colores que aparecen an una esquina de la ventana donde est el panel representan a los diferentes barcos

26

PROGRAMA FUENTE
JUEGO CAMPO DE BATALLA

27

Barco.java package model; public class barco { // clase que representa a los barcos public String tipo; // si es acorazado, normal, guerra, buque, portaviones public int longitud;//nmero de casillas que ocupar en el tablero public String color;//color con el cual ser identificado segn su tipo public String nombre;//nombre del barco public int estado; public int pos_ini; public int pos_fin; public barco(String t, int l, String c, String n, int est, int pi, int pf ) { tipo = t; longitud = l; color = c; nombre = n; estado = est; pos_ini = pi; pos_fin = pf; } public barco() { tipo = new String(); longitud = 0; color = new String(); 28

nombre = new String(); estado = 0; pos_ini = 0; pos_fin = 0;

} public String getColor() { return color; } public void setColor(String color) { this.color = color; } public int getEstado() { return estado; } public void setEstado(int estado) { this.estado = estado; } public int getPos_fin() { return pos_fin; } public void setPos_fin(int pos_fin) { this.pos_fin = pos_fin; } public int getPos_ini() { return pos_ini; } 29

public void setPos_ini(int pos_ini) { this.pos_ini = pos_ini; } public int getLongitud() { return longitud; } public void setLongitud(int longitud) { this.longitud = longitud; } public String getNombre() { return nombre; } public void setNombre(String nombre) { this.nombre = nombre; } public String getTipo() { return tipo; } public void setTipo(String tipo) { this.tipo = tipo; } }

Tablero package model; import java.awt.*; public class tablero extends Panel { 30

public Btn t [][];

public tablero() { this.setLayout(new GridLayout(10,11)); //this.setSize(40,40); t = new Btn[10][11]; for(int i=0;i<10;i++) for(int j=0;j<11;j++) { t[i][j] = new Btn(); //t[i][j].setSize(0,0); this.add(t[i][j]); } } public Btn[][] getT() { return t; } public void Panel(Btn[][] t) { this.t = t; } public Btn get_panel(int x , int y) { return t[x][y]; } }

31

Ventana de inicio package view; import java.io.*; import java.util.Random; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.JOptionPane; public class inicio extends javax.swing.JFrame { fr princ; Integer num_comp;

/** Creates new form inicio */ public inicio() { // Ventana de bienvenida, en el cual se ingresa el nmero de archivo initComponents(); princ= new fr(); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor.*/ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() {//function diseadora de la ventana jLabel1 = new javax.swing.JLabel(); jLabel2 = new javax.swing.JLabel(); 32

jButton2 = new javax.swing.JButton(); jButton1 = new javax.swing.JButton(); jTextField1 = new javax.swing.JTextField(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); jLabel1.setText("Batalla de barcos");

jLabel2.setText("Ingrese un nmero del 1 al 6"); jButton2.setText("Salir"); jButton2.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton2ActionPerformed(evt); } }); jButton1.setText("Comenzar"); jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton1ActionPerformed(evt); } }); jTextField1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jTextField1ActionPerformed(evt); } }); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());

33

getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(53, 53, 53)

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addGroup(layout.createSequentialGroup() .addComponent(jButton1) .addGap(64, 64, 64) .addComponent(jButton2)) .addGroup(layout.createSequentialGroup() .addComponent(jLabel2) .addGap(18, 18, 18) .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 49, javax.swing.GroupLayout.PREFERRED_SIZE))) .addContainerGap(143, Short.MAX_VALUE)) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addContainerGap(162, Short.MAX_VALUE) .addComponent(jLabel1) .addGap(156, 156, 156)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(31, 31, 31) .addComponent(jLabel1)

34

.addGap(49, 49, 49)

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel2) .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(60, 60, 60)

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jButton1) .addComponent(jButton2)) .addContainerGap(103, Short.MAX_VALUE)) ); pack(); }// </editor-fold>

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { //evento que valida lo ingresado e inicia el juego // TODO add your handling code here: if(this.valida_inicio()) { Random r = new Random(); this.setVisible(false); this.dispose(); princ.setVisible(true); num_comp = r.nextInt(3)+1; try { princ.play(this.jTextField1.getText(), num_comp.toString()); } catch (FileNotFoundException ex) { 35

Logger.getLogger(inicio.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(inicio.class.getName()).log(Level.SEVERE, null, ex); } } } private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { //evento que cancela toda accin de la ventana y acaba el juego // TODO add your handling code here: this.setVisible(false); this.dispose(); }

private void jTextField1ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: }

/* public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new inicio().setVisible(true); } }); }*/ public static void main(String a[]) {//main del proyecto inicio in;

36

in = new inicio(); in.setVisible(true); } public boolean valida_inicio() {//valida los datos ingresados if (!isNumeric(this.jTextField1.getText()) ) { // valida si el usuario no ingreso basura JOptionPane.showMessageDialog(null, "Por favor, ingrese numeros y no letras", "alerta", JOptionPane.WARNING_MESSAGE); this.jTextField1.setText(null); return false; } if(Integer.parseInt(this.jTextField1.getText())<0 || Integer.parseInt(this.jTextField1.getText())>6) { JOptionPane.showMessageDialog(null, "Por favor, ingrese numeros entre 1 y 3", "alerta", JOptionPane.WARNING_MESSAGE); this.jTextField1.setText(null); return false; } return true; } private static boolean isNumeric(String cadena) { //funcion para validar strings y enteros try { Integer.parseInt(cadena); return true; } catch (NumberFormatException nfe) { return false; } } 37

// Variables declaration - do not modify public javax.swing.JButton jButton1; public javax.swing.JButton jButton2; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; public javax.swing.JTextField jTextField1; // End of variables declaration }

public class fr extends javax.swing.JFrame { // Ventana que contiene los tableros barco bj[]; barco bc[]; //inicio in; Random r; int band_turno; LinkedList eleg_list_jug; LinkedList eleg_list_comp;

/** Creates new form fr */ public fr() { initComponents();//inicializa components visuales bj = new barco[4]; //cada jugador tendr 4 barcos for(int i=0;i<4;i++) bj[i] = new barco(); bc= new barco[4]; for(int i=0;i<4;i++) bc[i]= new barco(); 38

r = new Random(); band_turno = 1; eleg_list_jug = new LinkedList();//lista de celdas que va a ocupar los barcos del jugador eleg_list_comp = new LinkedList();//lista de celdas que va a ocupar los barcos del computador //in = new inicio();

} private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { //evento que ejecuta la accin de derribar una celda de un barco // TODO add your handling code here: Btn abj, abc; String let_comp = null; Integer num_comp; int suerte; if(this.valida_inicio()) { abj = but_ac(this.cx.getText(),Integer.parseInt(this.cy.getText()),2); if(abj.estado==1) { abj.setLabel("X"); abj.estado=2; JOptionPane.showMessageDialog(null, "Le diste a un barco del computador", "Turno del jugador", JOptionPane.INFORMATION_MESSAGE); if(ganador(eleg_list_comp)==true) { JOptionPane.showMessageDialog(null,"Felicitaciones, le ganaste al computador"); 39

this.dispose(); return; } } else if(abj.estado == 0) {

JOptionPane.showMessageDialog(null, "Celda vaca, perdiste el turno", "Turno del jugador", JOptionPane.INFORMATION_MESSAGE); } else if(abj.estado == 2) { JOptionPane.showMessageDialog(null, "ya le diste a esa celda", "Turno del jugador", JOptionPane.INFORMATION_MESSAGE); }

//---------------------------------------------------------------------------------------

suerte = r.nextInt(10)+1; if(suerte==1) let_comp="A"; else if(suerte==2) let_comp="B"; else if(suerte==3) let_comp="C"; else if(suerte==4) let_comp="D"; else if(suerte==5) 40

let_comp="E"; else if(suerte==6) let_comp="F"; else if(suerte==7) let_comp="G"; else if(suerte==8) let_comp="H"; else if(suerte==9) let_comp="I"; else if(suerte==10) let_comp="J";

num_comp = r.nextInt(11)+1; abc = but_ac(let_comp,num_comp,1); if(abc.estado==1) { abc.setLabel("X"); abc.estado=2;

JOptionPane.showMessageDialog(null, "El computador te di en un barco ("+let_comp+","+num_comp.toString()+")", "Turno del computador", JOptionPane.INFORMATION_MESSAGE); if(ganador(eleg_list_jug)==true) { JOptionPane.showMessageDialog(null,"Lo siento, el computador gan"); this.dispose(); return; } 41

} else if(abc.estado == 0) { JOptionPane.showMessageDialog(null, "Celda vaca, el computador perdi el turno ("+let_comp+","+num_comp.toString()+")", "Turno del computador", JOptionPane.INFORMATION_MESSAGE); } else if (abc.estado == 2) { JOptionPane.showMessageDialog(null, "El computador ya le haba dado a la celda, perdi el turno ("+let_comp+","+num_comp.toString()+")", "Turno del computador", JOptionPane.INFORMATION_MESSAGE); } }

public boolean ganador(LinkedList gan)//function que determina si hay un ganador { LinkedList l_btn; Btn aux; int contador_1=0; int contador_2=0;

for(int i=0;i<gan.size();i++) { l_btn = (LinkedList) gan.get(i); contador_1=0; for(int j=0;j<l_btn.size();j++) { aux = (Btn) l_btn.get(j); 42

if(aux.estado==2) contador_1++; } if(contador_1==l_btn.size()) contador_2++;

} if(contador_2==gan.size()) return true; else return false;

public void play(String arch, String arch2) throws FileNotFoundException, IOException//function qwue inicia el juego { //this.jPanel2.setVisible(false); inicializa_barcos(bj,"datosnaves"+arch+".txt","clasesnaves.txt"); inicializa_barcos(bc,"datosnaves"+arch2+".txt","clasesnaves.txt");

ubica_barcos(bj,1,eleg_list_jug);//1 para el jugador ubica_barcos(bc,2,eleg_list_comp);//2 para el computador

43

public void inicializa_barcos( barco b[] , String archivo1, String archivo2) throws FileNotFoundException, IOException, EOFException//function que carga los barcos desde los archivos { String arch, arch2; File ar; int cont_lin = 0; int cont_barcos =0; //ar = new File("C:\\datosnaves1.txt"); BufferedReader bf = new BufferedReader(new FileReader(archivo1)); BufferedReader bf2 = new BufferedReader(new FileReader(archivo2));

//try //{ while(bf.read()!=-1) { arch = bf.readLine(); if(cont_lin !=0) { if(!arch.isEmpty() ) { if(arch.equals("portaviones") || arch.equals("acorazado")|| arch.equals("buque") || arch.equals("normal") || arch.equals("guerra")) { b[cont_barcos].setTipo(arch); } else {

44

b[cont_barcos].setNombre(arch); } if(!b[cont_barcos].getNombre().isEmpty() && !b[cont_barcos].getTipo().isEmpty()) { cont_barcos++; }

} } cont_lin++; }

for( int i=0; i<b.length; i++) { if(b[i].tipo.equals("portaviones")) { b[i].setColor("verde"); b[i].setLongitud(5); } if(b[i].tipo.equals("acorazado")) { b[i].setColor("blanco"); b[i].setLongitud(4); } if(b[i].tipo.equals("buque"))

45

{ b[i].setColor("amarillo"); b[i].setLongitud(3); } if(b[i].tipo.equals("normal")) { b[i].setColor("azul"); b[i].setLongitud(2); } if(b[i].tipo.equals("guerra")) { b[i].setColor("rojo"); b[i].setLongitud(6); } } }

46

También podría gustarte