viernes, 26 de noviembre de 2010

TORRES DE HANOI BREVE EXPLICACION

  1. import java.awt.*;

  1. import java.applet.*;

  1. public class torhano extends Applet

  1. {

  1. static final int tamanc = 600;

  1. static final int tamalt = 400;

  1. static final int NULL = -1;

  1. static final int MAX = 20;

  1. static final int MIN = 3;

  1. static final int MAXCOLS = 6;

  1. static final int MINCOLS = 3;

  1. static final Color cfondo=new Color(82,94,53);

  1. static final Color cbarra=Color.black;

  1. static final Color cfin =Color.green;

  1. static final Color ctorre=Color.yellow;

  1. boolean first=true;

  1. int origen,destino;

  1. int movimientos;

  1. int h[] = new int[MAXCOLS];

  1. int Ficha[][] = new int[MAXCOLS][MAX];

  1. int Centorr[] = new int[MAXCOLS];

  1. Button Botjugar[] = new Button[MAXCOLS];

  1. TextField TFTorres, TFCols, TFMovimientos;

  1. int numtorres=5, numcols=3;

  1. void Parametros()

  1. {

  1. String param;

  1. param = getParameter("TORRES");

  1. if (param != null) numtorres = Integer.parseInt(param);

  1. param = getParameter("COLS");

  1. if (param != null) numcols = Integer.parseInt(param);

  1. }

  1. public void init()

  1. {

  1. int i;

  1. setBackground(cfondo);

  1. resize(tamanc,tamalt);

  1. if (first)

  1. {

  1. Parametros();

  1. Herramientas();

  1. first=false;

  1. }

  1. for (i=0; i<>

  1. if (i<>

  1. else Botjugar[i].disable();

  1. for (i=0; i<>

  1. Centorr[i]=(tamanc/(numcols+1))*(i+1);

  1. h[0]=numtorres;

  1. for (i=1; i<>

  1. h[i]=0;

  1. for (i=0; i<>

  1. Ficha[0][i]=numtorres-i;

  1. movimientos=0;

  1. origen=destino=NULL;

  1. }

  1. public void Herramientas()

  1. {

  1. setLayout(new BorderLayout());

  1. Panel p= new Panel();

  1. p.setBackground(cfondo);

  1. for (int i=0; i<>

  1. p.add(Botjugar[i]=new Button(Integer.toString(i+1)));

  1. p.add(new Button("Cancelar"));

  1. p.add(new Button("Terminar"));

  1. p.add(new Button("Juego Nuevo"));

  1. add("South",p);

  1. Panel g= new Panel();

  1. g.setBackground(cfondo);

  1. g.add(new Label("Columnas"));

  1. g.add(TFCols= new TextField(Integer.toString(numcols)));

  1. g.add(new Label("Discos"));

  1. g.add(TFTorres=new TextField(Integer.toString(numtorres)));

  1. g.add(new Label("Jugadas"));

  1. TFMovimientos=new TextField("0",8);

  1. TFMovimientos.disable();

  1. g.add(TFMovimientos);

  1. add("North",g);

  1. }

  1. public void Dibujar_Torres (Graphics g, Color coltorr)

  1. {

  1. int x,y, Long;

  1. int l,k;

  1. int anchomin=(Centorr[1]-Centorr[0])/numtorres;

  1. int altotorre=(tamalt-85)/numtorres;

  1. g.setColor(cbarra);

  1. for (k=0; k<>

  1. g.fillRect(Centorr[k]-1, 35, 2, tamalt-75);

  1. g.setColor(coltorr);

  1. for (k=0; k<>

  1. for (l=0; l<>

  1. {

  1. Long=anchomin*Ficha[k][l];

  1. x=(Centorr[k]-(Long/2));

  1. y=tamalt-60-l*altotorre;

  1. g.fillRect(x,y,Long,altotorre-altotorre/3);

  1. }

  1. }

  1. public void paint(Graphics g)

  1. {

  1. Dibujar_Torres(g, ctorre);

  1. TFMovimientos.setText(Integer.toString(movimientos));

  1. for (int i=1; i<>

  1. if (h[i]==numtorres) Final();

  1. }

  1. public void Final()

  1. {

  1. Dibujar_Torres(getGraphics(), cfin);

  1. }

  1. boolean val(int origen, int destino)

  1. {

  1. if (origen==NULL || destino==NULL || origen==destino) return false;

  1. if (h[origen]==0) return false;

  1. if (h[destino]==0) return true;

  1. if (Ficha[destino][h[destino]-1]<>

  1. return true;

  1. }

  1. public void Resolver()

  1. {

  1. Mover(numtorres,0,1,numcols-1);

  1. }

  1. void Desplazar(int origen, int destino)

  1. {

  1. h[origen]--;

  1. Ficha[destino][h[destino]]=Ficha[origen][h[origen]];

  1. h[destino]++;

  1. movimientos++;

  1. }

  1. void Mover(int Numero, int Comienzo, int Auxiliar, int Final)

  1. {

  1. int varaux;

  1. for (int i=Numero; i>0; i--)

  1. {

  1. Mover(i-1,Comienzo,Final,Auxiliar);

  1. Desplazar(Comienzo,Final);

  1. update(getGraphics());

  1. varaux=Comienzo;

  1. Comienzo=Auxiliar;

  1. Auxiliar=varaux;

  1. }

  1. }

  1. public boolean action(Event e, Object o)

  1. {

  1. if (e.target instanceof Button)

  1. {

  1. int i;

  1. for (i=0 ; i<>

  1. if ((Integer.toString(i+1)).equals(e.arg))

  1. {

  1. if (origen==NULL)

  1. {

  1. origen=i;

  1. Botjugar[origen].disable();

  1. }

  1. else

  1. {

  1. destino=i;

  1. for (i=0; i<>

  1. Botjugar[i].enable();

  1. }

  1. break;

  1. }

  1. if( "Juego Nuevo".equals(e.arg) || "Terminar".equals(e.arg))

  1. {

  1. numtorres=Integer.parseInt(TFTorres.getText());

  1. numcols =Integer.parseInt(TFCols.getText());

  1. if (numtorres< numtorres="">

  1. else if (numtorres>MAX) numtorres=MAX;

  1. if (numcols< numcols="MINCOLS;

  1. else if (numcols>MAXCOLS) numcols=MAXCOLS;

  1. TFTorres.setText(Integer.toString(numtorres));

  1. TFCols.setText(Integer.toString(numcols));

  1. TFMovimientos.setText("0");

  1. init();

  1. }

  1. if( "Cancelar".equals(e.arg))

  1. {

  1. origen=destino=NULL;

  1. for (i=0; i<>

  1. Botjugar[i].enable();

  1. }

  1. if( "Resolver".equals(e.arg)) Resolver();

  1. if (val(origen,destino))

  1. {

  1. Desplazar(origen,destino);

  1. origen=destino=NULL;

  1. }

  1. repaint();

  1. return true;

  1. }

  1. return false;

  1. }
  2. }__________________________________________________________________________________________

Presentación torres de hanoi en JAVA

El siguiente texto corresponde a la explicación de un sencillo código para la realización del conocido juego “torres de Hanoi” en JAVA.

El código va a ser explicado line a línea de forma accesible para el lenguaje manejado por estudiantes universitarios. En este caso serán utilizadas alguna comparaciones con el lenguaje C++ el cual es ya conocido por todos y además del se adjudica la existencia de JAVA.

Algunas líneas serán omitidas de ser mencionadas de forma explicita puesto que pertenecen a la parte lógica del algoritmo, como tal la idea de la explicación va enfocada a la utilización de las herramientas que nos ofrece el amplio paquete de interfaz grafica de JAVA. Además dicha parte lógica tiene valores que son de hecho asignados de forma arbitraria ya que el programador podrá poner las reglas del juego por medio de estas dándole un toque personal.

Codigo JAVA

Línea 1: importamos el kit de herramientas de interfaz grafica de JAVA (awt.*;).

Linea2: importamos la clase applet de JAVA la cual hereda todos los programas que van a actuar como applets.

Linea3 y 4: creamos una clase publica la cual hereda(extends) las herramientas de la clase applet . la línea 4 inicia o abre el contenido de la clase.

Linea5 y 6: declaramos dos variables estaticas de tipo entero cuyos nombres son “tamanc” y “tamalt” y que determinan el tamaño(ancho y altura )de los discos de juego. Donde aparece la sentencia “final” nos dice que estos valores no podrán ser modificados por ninguna de las subclases creadas en la clase principal.

Linea7: declaramos una variable de tipo entero la cual nombramos “null” y le asignamos un valor de -1.

Línea8: declaramos una variable de tipo entero llamada “max” inicializada en 20.

Linea9: se declara una variable de nombre “min” con un valor inicial de 3.

Linea10: declaramos una variable tipo entero de nombre “ maxcols” y se inicializa en 6.

Linea11: declaramos una variable tipo entero de nombre “ mincols” y se inicializa en 3.

Línea12: se declara una variable de tipo color a la que llamamos “cfondo” y se le asignan los valores decimales de su contenido de color (rojo, verde y azul).

Linea13: declaramos una varible de tipo color que nombramos cbarra y se le asigna el valor de black, en este caso el color automatico (negro).

Linea14: declaramos una varible de tipo color que nombramos cfin y se le asigna el valor de green, en este caso el color automatico (verde).

Linea15: declaramos una varible de tipo color que nombramos ctorre y se le asigna el valor de yellow, en este caso el color automatico (amarillo).

Linea16: declaramos una variable de tipo boolean llamada “first” y se le asigna un valor de true.

Linea17: declaramos dos variables de tipo entero las cuales llamamos “origen” y “destino”.

Linea18: declaramos una variable mas de tipo entero que llamamos “movimientos”.

Linea19: declaramos un arreglo (vector) de tipo entero y se le asigna un tamaño de la variable “maxcols” (línea 10.) y lo llamamos “h”.

Linea20: declaramos un arreglo de tipo matriz el cual tendrá unas dimensiones de “maxcols” por “max” variables ya declaradas(linea10. Y linea8.)

Linea21: declaramos un arreglo (vector) de tipo entero y se le asigna un tamaño de la variable “maxcols” (línea 10.) y lo llamamos “centorr”.

Linea22: creamos un objeto de tipo button(botón) le damos el nombre de “botjugar” en este caso de tipo vector y le asignamos el valor de la variable “maxcols”(linea10.)

Linea23: creamos tres objetos de tipo textField(cuadros de texto) y les asignamos sus respectivos nombres, “tftorres, tfcols, tfmovimientos”.

Linea24: declaramos dos variables tipo entero de nombres “numtorres” y “numcols” con valores iniciales de 5 y 3 respectivamente.(los valores iiciales de dichas variable son asignados de forma arbitraria y pueden ser al gusto del programador).

Linea25 y 26: creamos y abrimos un método(función en lenguaje C) void al cual llamaremos “parámetros”.

Linea27: declaramos ya dentro del método una varible de tipo string y la llamamos “param”.

Linea28: llamamos el método getParameter de la clase “applet” con el que le asignamos a nuestro string “param”(línea anterior) el valor de un dato numérico y le damos el argumento “torres”. Esto asigna -coordina el tamaño del applet de acuerdo con la disposición del sitio en el que sea usado.

Linea29: validamos el string “param”(linea27.) preguntando si es null o sea vacio, de ser asi creamos una variable “numtorres” con la cual convertimos el valor de “param” en un tipo entero.

Linea30: llamamos el método getParameter de la clase “applet” con el que le asignamos a nuestro string “param”(línea anterior) el valor de un dato numérico y le damos el argumento “cols”. Esto asigna -coordina el tamaño del applet de acuerdo con la disposición del sitio en el que sea usado.

Linea31 y 32: validamos el string “param”(linea27.) preguntando si es null o sea vacio, de ser asi creamos una variable “numcols” con la cual convertimos el valor de “param” en un tipo entero. Luego cerramos el método(linea32.).

Linea33 y 34: inicializamos el applet con el método init y abrimos el espacio para el código.

Linea35: declaramos una variable de tipo entero que llamamos “i” la cual será utilizada mas adelante.

Linea36: llamamos el método setBackground con el cual asignamos el color de fondo a nuestro applet. La asignación se realiza utilizando la variable “cfondo” (linea12.).

Linea37: se utiliza el resize para mantener la proporción del tamaño de las imágenes durante todo el método.

Linea38, 39, 40, 41, 42 y 43 : esta validación hace que cuando se ejecute el método init (inicialización de applet) lo primero que ejecute sean los métodos “parámetros” y “herramientas”(linea25. Y 57.58.) y luego asigna el valor de false a “first”(linea16.) para que mantenga los valores ya asignados por la ejecución.

Linea44, 45 y 46: este ciclo verifica la cantidad de columnas(será asignada por el usuario en el applet ejecutado) si “i” es menor que ducha cantidad se validara si “i” es menor que “numcols” (linea31.)parámetro que recibe un valor entero, y de ser asi llamara el método enable y el objeto “botjugar” el cual dara los botones para jugar en nuestro applet en ejecución; en cuanto a enable habilita los botones de acuerdo al numero de columnas elegidas y la validación ya realizada.

Linea47 y 48: este ciclo tiene la función de adaptar el tamaño en ancho (variable “tamanc” linea5 y 6)de los discos de juego dividiendo el valor de dicha variable en el numero de columnas asignadas por el jugador ya en el applet.

Linea49: se asigna a la posición 0 del arreglo”h”(linea19.) el valr 0.

Linea50, 51, 52, 53, 54, 55 y 56: estas líneas se ejecutan dentro de toda la clase y permiten el cambio de los valores de los arreglos y variables mencionados en estas todo con el fin de que sean reutilizables en los siguientes métodos de forma distinta ya que han sido inicializadas con otros valores desde el principio del código. Por ultimo cerramos la validación anteriormente iniciada(linea38.).

Linea57 y 58: creamos un nuevo método de nombre “herramientas” y abrimos el bloque de código.

Linea59: los Layout son herramientas predefinidas con las cuales le podemos dar un orden espacial a los objetos utilizados en el applet. En este caso borderLayout permite darle una posición de norte o arriba, sur o abajo, este o derecha y oeste o izquierda de nuestro applet.(dichas posiciones son respectivamente en ingles para el código:north,south,east y west).

Linea60: llamamos el componente panel de awt el cual llamamos “p” y creamos un método panel .

Linea61: llamamos a “p” y por medio de setBackground agregamos a este el color de fondo en este caso el color que toma es el de la variable “cfondo”.

Linea62, 63, 64, 65, 66 y 67: por medio de este ciclo iniciamos la carga en el panel de los botones que nos permitirán realizar las funciones de juego. P.add añadirá un botón al panel con los nombres: cancelar, terminar y juego nuevo respectivamente y por ultimo add.south le dara la posición de abajo a nuestro panel “p”.

Linea68, 69, 70, 71, 72, 73 y 74: cargamos un nuevo panel llamado “g” , asignamos su color de fondo como en el panel anterior y añadimos a este tres label con su respectivo textField estos son utilizados por el usuario para visualizar y además implementar las condiciones de juego como la cantidad de discos y columnas a jugar además podemos visualizar en el label “jugadas” la cantidad de movimientos realizados por el usuario.

Linea75 y 76: son el cuadro de texto del label jugadas el cual tendrá un carácter-valor inicial de 0 y será modificado a medida que el usuario realice sus jugadas. El usuario no podrá modificar manualmente el valor de este cuadro gracias a la utilización de la herramienta disable la cual lo deshabilita mientras no se ejecute ningún movimiento.

Linea77: añade el cuadro de texto al panel.

Linea78 y 79:añade el panel en la posición “north” arriba del applet. Se cierra el método.

Linea80 y 81: creamos un método de nombre “dibujar_ torres” que dibujara los discos con las clases graphics y color del paquete de awt con sus respectivos nombres “g” y “coltorr”. Y abrimos el bloque de código.

Linea82 y 83: declaramos variables de tipo entero “x”,”y” y “long” en un grupo y “l” y “k” en otro grupo.

Linea84-98: declaradas dichas operaciones como variables le asignamos operaciones distintas a cada una dichas operaciones permiten en el desarrollo grafico de los elementos del juego, asignar valores de espacio, tamaño y ubicaion dentro del applet ya que de acuerdo con las condiciones de juego la disposición del espacio dentro del applet varia.

Linea99 y 100: creamos un método paint para que se realicen como tal graficas de los elementos. Abrimos el bloque de código.

Linea101: llamamos el método “dibujar_torres” a nuestro método paint esto con el fin de cargar los valores de tamaño y espacio de distribución de los elementos que vamos a pintar.

Lina102: tomamos el valor que es asignado en el TF “Movimientos” y lo convertimos en un string que lo almacenara en la variable “movimientos”.

Linea103, 104 y 105: este ciclo mencionado tomara el valor de los discos cuando hayan cambiado de columna, si en efecto todos lo discos están correctamente ubicados en otra torre a la inicial cargara un método ”final”. Y luego cerramos el método.

Linea106-109: creamos un método “final” el cual dibujara de un color distinto con la variable “cfinal” (linea14.)los discos cuando hayan cambiado de de columna y estén correctamente ubicados.

Linea110-117: verifica que los valores de “origen”, “destino” y “h” no hayan cambiado durante la ejecución del método anterior de lo contrario retornara un valor ”false”.

Linea118 - 121: creamos un método “resolver”, con el que realizaremos como tal las jugadas en el applet. Abrimos el bloque de código y en este insertamos otro metodo “Mover” .

Linea122 - 128: creamos otra sublase a la que llamamos “Desplazar”. En esta clase añadimos los contadores que serán necesarios para llevar el calculño de las jugadas realizadas por el jugador además de verificar las jugadas incorrectas.

Linea129-141: llamamos nuevamente el método “Mover” pero le asignamos nuevos valores ya que es un método de uso local en otro método “resolver”. Esto nos ayuda mantener el control de los movimientos de los discos en el juego permitiendo que un movimiento pueda ser realizado de forma repetida y además sea corregido.

Linea142-193: todas las líneas que preceden a la implementación de la clase event son las que proporcionan los eventos de los botones anteriormente insertados dicho ”event” llama del método resolver las tareas contenidas en este y se las asigna a cada botón. Dichos botones además son adheridos funcionalmente con la clase “object” del método, o sea se hacen utilizables a través de estas dos clases por medio del método “action”.