Al principio eso era lo que nos pasó. Pero, como dijimos, en cuanto supimos que era una lista enlazada, ayudándonos de los apuntes, empezamos a intentar resolverlo.
Esta es la clase Pieza que ya implementamos en la práctica anterior con su respectivo prueba.
|
class Pieza
{
private char tipo;
private int x;
private int y;
public Pieza(int x,int y,char tipo)
{
this.x=x;
this.y=y;
this.tipo=tipo;
}
public Pieza(char tipo)
{
this.tipo=tipo;
x=0;
y=0;
}
public void mover(int x,int y)
{
this.x=x;
this.y=y;
}
public void setPieza(char tipo)
{
this.tipo=tipo;
}
public char getPieza()
{
return tipo;
}
public String toString()
{
return “Pieza de tipo “+tipo+” en x=”+x+”,y=”+y;
}
}
|
|
class PruebaPieza
{
public static void main(String[] args)
{
Pieza nueva_1=new Pieza(5,8,’O');
System.out.println(nueva_1);
Pieza nueva_2=new Pieza(‘L’);
System.out.println(nueva_2
);
}
}
|
Y compilamos y ejecutamos todo:

Ahora si empieza lo bueno. Vamos a realizar una lista de objetos (de aquí que un atributo de la clase Nodo sea un object) utilizando memoria dinámica, es decir, que no importa el número de elementos que insertemos, el límite está en la RAM del ordenador. Como desde un principio se trataba de hacer un vector dinámico sin utilizar clases ya implementadas en java, pues obviamente la solución era crear nuestras propias clases.
Lo primero era escribir la clase Nodo, el cual se compone de dos atributos: un object, siendo una referencia a cualquier clase que se use (recordamos que todas las clases heredan de la clase Object), y una referencia al nodo siguiente, un objeto de tipo nodo.
Los métodos que contiene esta clase son: los constructores, setObject, setNode, getObject, getNode. Es decir, tiene más básico y sencillo que puede tener cualquier clase. En el primer constructor le pasamos por parámetro un object y un nodo, para inicializar los atributos con el valor que queramos más adelante; en cambio en el segundo constructor, no le pasamos nada por parámetro, inicializando los atributos a null. Los set y get son como siempre.
|
public class Node
{
private Object objeto;
private Node siguiente;
public Node(Object o, Node n)
{
objeto=o;
siguiente=n;
}
public Node()
{
objeto=null;
siguiente=null;
}
public void setObject(Object o)
{
objeto=o;
}
public void setNode(Node n)
{
siguiente=n;
}
public Object getObject()
{
return objeto;
}
public Node getNode()
{
return siguiente;
}
}
|
Probamos la clase nodo con el siguiente prueba, en el cual vamos creando nodos y enlazándolos. El prueba nodo hemos decido explicarlo por cada línea para que resulte más cómodo de leer y entender:
|
public class PruebaNodo
{
public static void main(String[] args)
{
Node nuevo=new Node(” hola “, null);
/*creo un primer nodo, este sera el nodo incial
Importante: el primer nodo siempre tiene la referencia hacia null
*/
System.out.println((String) nuevo.getObject());
/*imprimo por pantall el contenido del nodo
Importante:No hago System.out.println((String)nuevo.getNode().getObject());
porque el nodo inicial apunta a null, entonces si hago esto nos saltar un
NullPointerException, pero si que puedo sacar el objeto porque si que contiene uno
*/
Node otro=new Node(” que tal estas “,nuevo);
/*declaramos otro nodo, le pasamos como argumentos un String y el primer nodo (en este caso se llama nuevo)
*/
System.out.println((String)otro.getNode().getObject()+(String)otro.getObject());
/*ahora presentamos la referencia y el objeto que tiene*/
Node ok=new Node(” la clase nodo funciona perfectamente “,otro);
System.out.println((String)ok.getNode().getObject()+(String) ok.getObject());
/*Ahora para trabajar con las piezas del tetris*/
System.out.println(“\nPrimer Nodo”);
Pieza uno=new Pieza(‘O’);
Node pieza1=new Node (uno,null);
System.out.println(“Este es el primer nodo apunta a null”);
System.out.println(“Este nodo contiene el objeto=>”+(Pieza)pieza1.getObject());
System.out.println(“\nSegundo Nodo”);
Pieza dos=new Pieza(‘L’);
Node pieza2=new Node(dos,pieza1);
System.out.println(“Referencia a =>”+(Pieza)pieza2.getNode().getObject());
System.out.println(“Este nodo contiene el objeto=>”+(Pieza)pieza2.getObject());
System.out.println(“\nTercer Nodo”);
Pieza tres=new Pieza(‘I’);
Node pieza3=new Node(tres,pieza2);
System.out.println(“referancia a =>”+(Pieza)pieza3.getNode().getObject());
System.out.println(“Este nodo contiene el objeto=>”+(Pieza)pieza3.getObject());
}
}
|
La muestra de que “furula”, compila y ejecuta:

A continuación la clase Contenedor.
|
public class Contenedor
{
private Node inicial;
private Node siguiente;
private int tamano;
public Contenedor()
{
inicial=new Node();
siguiente=new Node();
tamano=0;
}
public void Push(Object nueva)
{
Node temp=new Node(nueva,null);
if(tamano==0)
inicial=temp;
else
siguiente.setNode(temp);
siguiente=temp;
tamano++;
}
public Object Pop()
{
Object temp=null;
if(!isEmpty())
{
temp=inicial.getObject();
inicial=inicial.getNode();
tamano–;
}
if(isEmpty())
siguiente=null;
return temp;
}
public boolean isEmpty()
{
return tamano==0;
}
public int Size()
{
return tamano;
}
}
|
La prueba correspondiente a la clase Contenedor:
|
import java.io
.*;
public class PruebaContenedor
{
public static BufferedReader datos=new BufferedReader(new InputStreamReader(System.in));
public static void main(String[] args)
{
Contenedor prueba=new Contenedor();
boolean sigue=false;
System.out.println(“\n—————–Push—————”);
do
{
try
{
System.out.print(“Inserte una pieza: “);
prueba.Push(new Pieza((datos.readLine()).toUpperCase().charAt(0)));
System.out.print(“Desea seguir insertando? precione S o N: “);
sigue=Afirma();
}
catch(IOException e)
{
sigue=true;
}
catch(StringIndexOutOfBoundsException e)
{
sigue=true;
}
}while(sigue!=false);
System.out.println(“\n—————–Pop—————-”);
do
{
System.out.println((Pieza)prueba.Pop());
}while(prueba.Size()!=0);
}
public static boolean Afirma()
{
boolean respuesta=false;
boolean confirma=false;
String revisa;
do
{
try
{
revisa=datos.readLine();
revisa=revisa.toUpperCase();
if(revisa.length()>=2)
{
confirma=false;
System.out.print(“\nError de opcion precione S o N: “);
}
else if((revisa.charAt(0)==’S')||(revisa.charAt(0)==’N'))
{
if(revisa.charAt(0)==’S')
respuesta=true;
else
respuesta=false;
confirma=true;
}
else
{
confirma=false;
System.out.print(“\nError de opcion precione S o N: “);
}
}
catch(Exception e)
{
System.out.print(“\nError de opcion precione S o N: “);
confirma=false;
}
}while(confirma!=true);
return respuesta;
}
}
|
Mostrándose por pantalla de comandos:


HASTA PRONTO!!! XD
jolin….q artistas!!!creemos que solo por esto os mereceis el aprobado xq nadie nadie consigio hacer nada y que lo hayais resuelto debe dar muchos animos…habrá que mirarlo detenidamente e intentaremos hacerlo nosotras xo….y bueno que tengais suerte y que sigais asi!!!
un saludo
Por: natymari el Abril 17, 2008
a las 8:52 pm
¿Nadie ha conseguido hacerlo? ¿Ni siquiera en casa? Ummm… ¡Quiero a la gente preguntando dudas pero ya!!
Por: Jose Jesus el Abril 22, 2008
a las 10:55 am