1. Herencia

Para trabajar con el motor de juego de CodeGym, deberá utilizar la herencia . Pero, ¿y si no sabes qué es eso? Por un lado, es necesario comprender y estudiar este tema. Por otro lado, el motor está especialmente diseñado para ser muy simple, de modo que pueda arreglárselas con un conocimiento superficial de la herencia.

Entonces, ¿qué es la herencia? En términos simples, la herencia es una relación entre dos clases. Uno de ellos actúa como la clase principal y el otro se convierte en la clase secundaria (descendiente). Es más, es posible que una clase principal ni siquiera sepa que tiene clases descendientes. En otras palabras, el padre no se beneficia mucho de tener clases descendientes.

Pero la herencia da muchas ventajas a la clase secundaria. El más importante de ellos es que todas las variables y métodos de la clase principal aparecen en la clase secundaria, como si el código de la clase principal se hubiera copiado directamente en la clase secundaria. Esto no es del todo exacto, pero será suficiente para una comprensión básica de la herencia.

Aquí hay algunos ejemplos para ayudarlo a comprender mejor la herencia.

Ejemplo 1 : este es el ejemplo más simple

public class Parent
{
}
La Childclase hereda la Parentclase con la ayuda de la extendspalabra clave.
public class Child extends Parent
{
}

Ejemplo 2: usar las variables de la clase principal

public class Parent
{
  public int age;
  public String name;
}
La Childclase puede usar los campos agey namede la Parentclase como si estuvieran declarados en la Childclase misma.
public class Child extends Parent
{
  public void printInfo()
  {
    System.out.println(name + " " + age);
  }
}

Ejemplo 3: uso de métodos de la clase principal

public class Parent
{
   public int age;
   public String name;
   public getName() {
      return name;
   }
}
La Childclase puede usar las variables y métodos de la clase Padre como si estuvieran declarados en la Childclase. En este ejemplo, usamos el getName()método.
public class Child extends Parent
{
   public void printInfo()
   {
      System.out.println(getName() + " " + age);
   }
}

Omitiendo algunos detalles, podemos decir que desde la perspectiva del compilador de Java, simplemente copiamos el código de la clase principal en el código de la clase secundaria:

public class Child extends Parent
{
   public int age;        // An inherited variable
   public String name;    // An inherited variable
   public getName() {     // An inherited method
      return name;
   }

   public void printInfo()
   {
      System.out.println(getName() + " " + age);
   }
}
Así es como Childaparece la clase desde el punto de vista del compilador


2. Anulación de métodos

A veces hay situaciones en las que hacemos que nuestra Childclase herede una clase muy útil Parent, lo que hace que el hijo herede todas las variables y métodos del padre. Pero algunos de esos métodos pueden no funcionar de la manera que queremos o no funcionar de la manera que queremos.

¿Qué haces en este caso? Podemos anular un método cuya implementación no nos guste . Esto es algo simple de hacer: en nuestra Childclase simplemente declaramos un método con la misma firma que el método en la Parentclase y luego escribimos nuestro propio código en él.

Ejemplo 1 : anulación de método

public class Parent
{
   public String name;
   public void setName(String nameNew) {
      name = nameNew;
   }

   public getName() {
      return name;
   }
}
El printInfo()método mostrará la siguiente frase:
Luke, No!!!
public class Child extends Parent
{
   public void setName(String nameNew) {
      name = nameNew + ", No!!!";
   }

   public void printInfo()
   {
      setName("Luke");
      System.out.println(getName());
   }
}

Simplificando un poco la situación, la herencia hace que el código de la clase principal se copie en la clase secundaria. Pero si una clase descendiente ya es un método que existe en una clase antepasada, ese método no se copia de la clase antepasada. Aquí decimos que el método en la clase secundaria anula el método en la clase principal. Mira el ejemplo de abajo. Tal vez ayude a aclarar un poco las cosas:

Así es como aparece la clase Child desde el punto de vista del compilador:
public class Child extends Parent
{
   public String name;    // An inherited variable

   public void setName(String nameNew)  // The overridden method replaces the inherited one
   {
      name = nameNew + ", No!!!";
   }

   public getName()    // An inherited method
   {
      return name;
   }

   public void printInfo()
   {
      setName("Luke");
      System.out.println(getName());
   }
}

Ejemplo 2: un poco de magia de herencia (y anulación de métodos)

public class Parent
{
   public getName() {
      return "Luke";
   }

   public void printInfo()
   {
      System.out.println( getName() );
   }
}
public class Child extends Parent
{
   public getName() {
      return "Luke, I am your father";
   }
}

Si el printInfo()método se llama en un Parenttipo, a su vez llama al getName()método de la Parentclase.

Si el printInfo()método se llama en un Childobjeto, a su vez llama al getName()método de la Childclase.

En otras palabras, el printInfo()método se declara solo en la Parentclase, pero llama al getName()método de la Childclase si el printInfo()método se llama en un Childobjeto.

Ejemplo:

Parent parent = new Parent();
parent.printnInfo();
Este código muestra el siguiente texto en la pantalla:
Luke
Child child = new Child();
child.printnInfo();
Este código muestra el siguiente texto en la pantalla:
Luke, I am your father

Y todo porque desde el punto de vista del compilador (una versión muy simplificada del mismo), el código de la Childclase queda así:

public class Child extends Parent
{
   public getName() {
      return "Luke, I am your father";
   }

   public void printInfo()
   {
      System.out.println(getName());
   }
}
Así es como Childaparece la clase desde el punto de vista del compilador


3. Listas

He aquí un breve recordatorio acerca de las listas ( List). Las listas tienen mucho en común con las matrices:

  • Pueden almacenar una gran cantidad de datos de un tipo específico.
  • Te permiten obtener elementos por su índice.
  • Los índices de los elementos comienzan en 0.

Ventajas de las listas:

A diferencia de las matrices, las listas pueden cambiar de tamaño dinámicamente. Inmediatamente después de la creación, el tamaño de una lista es 0. A medida que se agregan elementos a la lista, su tamaño aumenta. Ejemplo de creación de una lista:

ArrayList<String> myList = new ArrayList<String>();
Creando un nuevoArrayList

El valor indicado entre paréntesis angulares es el tipo de datos que la lista puede almacenar.

Estos son algunos métodos para trabajar con una lista:

Código Breve descripción
ArrayList<String> list = new ArrayList<String>();
Crear una nueva lista de cadenas
list.add("name");
Agregar un elemento al final de la lista
list.add(0, "name");
Agregar un elemento al inicio de la lista
String name = list.get(5);
Obtener un elemento por su índice
list.set(5, "new name");
Cambiar un elemento por su índice
int count = list.size();
Obtener el número de elementos en la lista
list.remove(4);
Eliminar un elemento de la lista

Para obtener más información sobre las listas, puede leer los siguientes artículos:



4. Números aleatorios

El motor de juego CodeGym tiene dos métodos que se pueden usar para generar números aleatorios. Estos métodos son:

int getRandomNumber(int max)
int getRandomNumber(int min, int max)

El primer método — getRandomNumber(int max)— devuelve un número aleatorio en el rango 0, 1, 2, ... max-1. Debajo del capó, usa la Randomclase del java.utilpaquete, pero eso no cambia la forma en que usa un número aleatorio.

getRandomNumber(int)acepta un número entero como argumento. Este número será el límite superior de los números que puede devolver el generador de números aleatorios. El límite inferior es 0. ¡Atención! El generador de números aleatorios NUNCA devolverá el valor del límite superior. Por ejemplo, si llama a getRandomNumber(3), devolverá aleatoriamente 0, 1 o 2. Como puede ver, no devolverá 3. Usar un generador de números aleatorios de esta manera es bastante simple, pero es adecuado para muchos casos.

El segundo método, getRandomNumber(int min, int max)devuelve un número entero aleatorio en el rango [min, max-1]. Nunca devolverá un número menor que min, y nunca devolverá un número mayor que max-1.

¿Cómo se pueden utilizar estos métodos en la práctica?

1. Dados

Suponga que desea simular el lanzamiento de un dado y obtener un número aleatorio en el rango 1-6. ¿Como lo harias? Esto se puede hacer con un código como este:

int dice = getRandomNumber(1, 7);

Este método devolverá un número entero aleatorio en el rango 1-6.

2. Práctica de tiro

Suponga que desea simular disparar a un objetivo y la precisión de un disparo incluye un componente aleatorio que varía en el rango de -10hasta +10inclusive. Esto se puede hacer con un código como este:

int dx = getRandomNumber(-10, 11);

Este método devolverá un entero aleatorio en el rango -10de +10.

Hay muchas formas de usar números aleatorios en los juegos. Solo estás limitado por tu imaginación. Escriba sus propios juegos, refínelos y disfrute el proceso.

Todos pueden jugar juegos, pero solo los programadores pueden crearlos.