Añadiendo una lista de puntuaciones en Asteroides

Muchos videojuegos permiten recordar las puntuaciones de partidas anteriores, de esta forma, un jugador puede tratar de superar su propio récord o mejorar el de otros jugadores.

En el capítulo 9 estudiaremos varios métodos para que esta información se almacene permanentemente en el sistema. En el capítulo 10 estudiaremos como podemos compartirlo utilizando Internet. En este capítulo nos centraremos en representar esta lista de puntuaciones de forma atractiva utilizando la vista ListView.

Vamos a intentar que el mecanismo de acceso a esta lista de puntuaciones sea lo más independiente posible del método final escogido. Con este propósito, vamos a definir la interfaz AlmacenPuntuaciones.

Ejercicio paso a paso: El interfaz AlmacenPuntuaciones

1. Abre la aplicación Asteroides.

2. Pulsa con el botón derecho sobre la carpeta de código (org.example.asteroides) y selecciona New > Java Class.

3. En el campo Name: introduce AlmacenPuntuaciones, en el campo Kind introduce Interface  y pulsa Ok.

4. Introduce el código que se muestra a continuación:  

public interface AlmacenPuntuaciones {
      public void guardarPuntuacion(int puntos,String nombre,long fecha);
      public List<String> listaPuntuaciones(int cantidad);
}

Nota sobre Java: La interfaz es una clase abstracta pura, es decir una clase donde se indican los métodos pero no se implementa ninguno (en este caso se dice que los métodos son abstractos). Permite al programador de la clase establecer la estructura de esta (nombres de métodos, sus parámetros y tipos que retorna, pero no el código de cada método). Una interfaz también puede contener constantes, es decir campos de tipo staticy final.

Las diferentes clases que definamos para almacenar puntuaciones han de implementar esta interfaz. Como ves tiene dos métodos. El primero para guardar la puntuación de una partida, con los parámetros puntuación obtenida, nombre del jugador y fecha de la partida. La segunda es para obtener una lista de puntuaciones previamente almacenadas. El parámetro cantidad indica el número máximo de puntuaciones que ha de devolver.

5. Veamos a continuación una clase que utiliza esta interfaz. Para ello crea en el proyecto la clase AlmacenPuntuacionesArray.

6. Introduce el siguiente código:

public class AlmacenPuntuacionesList implements AlmacenPuntuaciones{
     private List<String> puntuaciones;

     public AlmacenPuntuacionesList() {
          puntuaciones= new List();
          puntuaciones.add("123000 Pepito Domingez");
          puntuaciones.add("111000 Pedro Martinez");
          puntuaciones.add("011000 Paco Pérez");
     }
     @Override public void guardarPuntuacion(int puntos,
                                       String nombre, long fecha) {
          puntuaciones.add(0, puntos + " "+ nombre);
     }
     @Override public List<String> listaPuntuaciones(int cantidad) {
          return  puntuaciones;
     }
}

Esta clase almacena la lista de puntuaciones en un vector de String. Tiene el inconveniente de que al tratarse de una variable local, cada vez que se cierre la aplicación se perderán las puntuaciones. El constructor inicializa el array e introduce tres valores. La idea es que aunque todavía no esté programado el juego y no podamos jugar, tengamos ya algunas puntuaciones para poder representar una lista. El método guardarPuntuacion() se limita a insertar en la primera posición del array un String con los puntos y el nombre. La fecha no es almacenada. El método listaPuntuaciones() devuelve la lista de String entero, sin tener en cuenta el parámetro cantidad que debería limitar el número de Strings devueltos. 

7. En la actividad MainActivity tendrás que declarar una variable para almacenar las puntuaciones:

         

public static AlmacenPuntuaciones almacen= new AlmacenPuntuacionesArray();

 Nota sobre Java:El modificador static permite compartir el valor de una variable entre todos los objetos de la clase. Es decir, aunque se creen varios objetos, solo existirá una única variable almacen compartida por todos los objetos. El modificador public permite acceder a la variable desde fuera de la clase. Por lo tanto, no será necesario crear métodos getters y setters. Para acceder a esta variable no tendremos más que escribir el nombre de la clase seguida de un punto y el nombre de la variable. Es decir MainActivity.almacen.    

8. Para que los jugadores puedan ver las últimas puntuaciones obtenidas, modifica el cuarto botón del layout activity_main.xml para que en lugar del texto “Salir” se visualice “Puntuaciones”. Para ello modifica los ficheros res/values/strings. También sería interesante que cambiaras el fichero res/values-en/strings.

9. Modifica el escuchador asociado al cuarto botón para que llame al método:

public void lanzarPuntuaciones(View view) {
Intent i = new Intent(this, Puntuaciones.class);
startActivity(i);
}

10. De momento no te permitirá ejecutar la aplicación. Hasta que en el siguiente apartado no creemos la actividad Puntuaciones no será posible.