1. Arv

For at arbejde med CodeGym-spilmotoren skal du bruge arv . Men hvad hvis du ikke ved hvad det er? På den ene side skal du forstå og studere dette emne. Til gengæld er motoren specialdesignet til at være meget enkel, så man kan klare sig med en overfladisk viden om arv.

Så hvad er arv? Enkelt sagt er arv et forhold mellem to klasser. En af dem fungerer som forældreklassen, og den anden bliver børneklassen (efterkommer). Hvad mere er, kan en forældreklasse ikke engang vide, at den har efterkommerklasser. Forælderen får med andre ord ikke det store udbytte af at have efterkommerklasser.

Men arv giver mange fordele til barneklassen. Den vigtigste af dem er, at alle variabler og metoder i overordnet klasse vises i børneklassen, som om forældreklassens kode blev kopieret direkte ind i børneklassen. Dette er ikke helt præcist, men det vil være tilstrækkeligt til en grundlæggende forståelse af arv.

Her er nogle eksempler, der hjælper dig med at forstå arv bedre.

Eksempel 1 - her er det enkleste eksempel

public class Parent
{
}
Klassen Childarver Parentklassen ved hjælp af nøgleordet extends.
public class Child extends Parent
{
}

Eksempel 2 — ved at bruge variablerne i den overordnede klasse

public class Parent
{
  public int age;
  public String name;
}
Klassen Childkan bruge ageog namefelterne i Parentklassen, som om de var erklæret i Childselve klassen.
public class Child extends Parent
{
  public void printInfo()
  {
    System.out.println(name + " " + age);
  }
}

Eksempel 3 — ved hjælp af metoder fra den overordnede klasse

public class Parent
{
   public int age;
   public String name;
   public getName() {
      return name;
   }
}
Klassen Childkan bruge variablerne og metoderne i forældreklassen, som om de var erklæret i Childklassen. I dette eksempel bruger vi getName()metoden.
public class Child extends Parent
{
   public void printInfo()
   {
      System.out.println(getName() + " " + age);
   }
}

Hvis vi udelader nogle detaljer, kan vi sige, at fra Java-compilerens perspektiv kopierede vi simpelthen koden for den overordnede klasse ind i koden for den underordnede klasse:

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);
   }
}
Her er hvordan Childklassen ser ud fra compilerens synspunkt


2. Metodetilsidesættelse

Nogle gange er der situationer, hvor vi får vores Childklasse til at arve en meget nyttig Parentklasse, hvilket får barnet til at arve alle forældrenes variabler og metoder. Men nogle af disse metoder fungerer måske ikke helt, som vi vil have dem til, eller slet ikke, som vi vil have dem til.

Hvad gør du i dette tilfælde? Vi kan tilsidesætte en metode, hvis implementering vi ikke bryder os om . Dette er en simpel ting at gøre: I vores Childklasse erklærer vi simpelthen en metode med samme signatur som metoden i Parentklassen og skriver derefter vores egen kode i den.

Eksempel 1 — metode tilsidesættelse

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

   public getName() {
      return name;
   }
}
Metoden printInfo()viser følgende sætning:
Luke, No!!!
public class Child extends Parent
{
   public void setName(String nameNew) {
      name = nameNew + ", No!!!";
   }

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

Oversimplificerer situationen noget, så bevirker arv, at koden for den overordnede klasse bliver kopieret ind i den underordnede klasse. Men hvis en efterkommerklasse allerede er en metode, der findes i en forfaderklasse, kopieres denne metode ikke fra forfaderklassen. Her siger vi, at metoden i børneklassen tilsidesætter metoden i forældreklassen. Se på eksemplet nedenfor. Måske vil det hjælpe med at gøre tingene lidt klarere:

Sådan ser Child-klassen ud fra compilerens synspunkt:
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());
   }
}

Eksempel 2 - lidt arvemagi (og metodetilsidesættelse)

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";
   }
}

Hvis printInfo()metoden kaldes på en Parenttype, kalder den igen getName()klassens metode Parent.

Hvis printInfo()metoden kaldes på et Childobjekt, kalder den igen getName()klassens metode Child.

Med andre ord printInfo()er metoden kun erklæret i Parentklassen, men den kalder getName()klassens metode Child, hvis printInfo()metoden kaldes på et Childobjekt.

Eksempel:

Parent parent = new Parent();
parent.printnInfo();
Denne kode viser følgende tekst på skærmen:
Luke
Child child = new Child();
child.printnInfo();
Denne kode viser følgende tekst på skærmen:
Luke, I am your father

Og alt sammen fordi fra compilerens synspunkt (en meget forenklet version af det), Childser klassens kode sådan ud:

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

   public void printInfo()
   {
      System.out.println(getName());
   }
}
Her er hvordan Childklassen ser ud fra compilerens synspunkt


3. Lister

Her er en kort påmindelse om lister ( List). Lister har meget til fælles med arrays:

  • De kan gemme en masse data af en bestemt type.
  • De lader dig få elementer efter deres indeks.
  • Indeksene for elementerne starter ved 0.

Fordele ved lister:

I modsætning til arrays kan lister dynamisk ændre størrelse. Umiddelbart efter oprettelsen er størrelsen af ​​en liste 0. Efterhånden som elementer føjes til listen, øges dens størrelse. Eksempel på oprettelse af en liste:

ArrayList<String> myList = new ArrayList<String>();
Oprettelse af en nyArrayList

Værdien angivet i vinkelparenteserne er den datatype, som listen kan gemme.

Her er nogle metoder til at arbejde med en liste:

Kode Kort beskrivelse
ArrayList<String> list = new ArrayList<String>();
Oprettelse af en ny liste over strenge
list.add("name");
Tilføj et element til slutningen af ​​listen
list.add(0, "name");
Tilføj et element til starten af ​​listen
String name = list.get(5);
Få et element ved dets indeks
list.set(5, "new name");
Ændre et element ved dets indeks
int count = list.size();
Få antallet af elementer på listen
list.remove(4);
Fjern et element fra listen

For mere information om lister kan du læse følgende artikler:



4. Tilfældige tal

CodeGym-spilmotoren har to metoder, der kan bruges til at generere tilfældige tal. Disse metoder er:

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

Den første metode — getRandomNumber(int max)— returnerer et tilfældigt tal i området 0, 1, 2, ... max-1. Under motorhjelmen bruger den Randomklassen fra java.utilpakken, men det ændrer ikke på, hvordan du bruger et tilfældigt tal.

getRandomNumber(int)accepterer et heltal som et argument. Dette tal vil være den øvre grænse for de tal, som generatoren af ​​tilfældige tal kan returnere. Den nedre grænse er 0. OBS! Tilfældig talgeneratoren returnerer ALDRIG værdien af ​​den øvre grænse. For eksempel, hvis du kalder getRandomNumber(3), vil den tilfældigt returnere enten 0, 1 eller 2. Som du kan se, returnerer den ikke 3. Det er ret simpelt at bruge en tilfældig talgenerator på denne måde, men det er velegnet til mange tilfælde.

Den anden metode — getRandomNumber(int min, int max)— returnerer et tilfældigt heltal i området [min, max-1]. Det vil aldrig returnere et tal mindre end min, og det vil aldrig returnere et tal større end max-1.

Hvordan kan disse metoder bruges i praksis?

1. Terninger

Antag, at du vil simulere terningkast og få et tilfældigt tal i området 1-6. Hvordan ville du gøre det? Dette kan gøres med kode som denne:

int dice = getRandomNumber(1, 7);

Denne metode returnerer et tilfældigt heltal i området 1-6.

2. Måltræning

Antag, at du vil simulere skydning mod et mål, og nøjagtigheden af ​​et skud inkluderer en tilfældig komponent, der varierer i området fra -10til +10inklusive. Dette kan gøres med kode som denne:

int dx = getRandomNumber(-10, 11);

Denne metode returnerer et tilfældigt heltal i området -10til +10.

Der er mange måder at bruge tilfældige tal i spil. Du er kun begrænset af din fantasi. Skriv dine egne spil, forfin dem, og nyd processen.

Alle kan spille spil, men kun programmører kan skabe dem.