1. Arv

For å jobbe med CodeGym-spillmotoren, må du bruke arv . Men hva om du ikke vet hva det er? På den ene siden må du forstå og studere dette emnet. På den annen side er motoren spesialdesignet for å være veldig enkel, slik at du kan klare deg med en overfladisk kunnskap om arv.

Så hva er arv? Enkelt sagt er arv et forhold mellom to klasser. En av dem fungerer som foreldreklassen, og den andre blir barneklassen (etterkommer). Dessuten vet kanskje ikke en foreldreklasse at den har etterkommerklasser. Forelderen har med andre ord ikke mye utbytte av å ha etterkommerklasser.

Men arv gir mange fordeler til barneklassen. Den viktigste av dem er at alle variabler og metoder for overordnet klasse vises i barneklassen, som om koden til overordnet klasse ble kopiert direkte inn i barneklassen. Dette er ikke helt nøyaktig, men det vil være tilstrekkelig for en grunnleggende forståelse av arv.

Her er noen eksempler for å hjelpe deg bedre å forstå arv.

Eksempel 1 - her er det enkleste eksemplet

public class Parent
{
}
Klassen Childarver Parentklassen ved hjelp av nøkkelordet extends.
public class Child extends Parent
{
}

Eksempel 2 — ved å bruke variablene til den overordnede klassen

public class Parent
{
  public int age;
  public String name;
}
Klassen Childkan bruke ageog- namefeltene til klassen Parentsom om de var deklarert i Childselve klassen.
public class Child extends Parent
{
  public void printInfo()
  {
    System.out.println(name + " " + age);
  }
}

Eksempel 3 - ved å bruke metoder fra overordnet klasse

public class Parent
{
   public int age;
   public String name;
   public getName() {
      return name;
   }
}
Klassen Childkan bruke variablene og metodene til Parent-klassen som om de var deklarert i klassen Child. I dette eksemplet bruker vi getName()metoden.
public class Child extends Parent
{
   public void printInfo()
   {
      System.out.println(getName() + " " + age);
   }
}

Ved å utelate noen detaljer kan vi si at fra Java-kompilatorens perspektiv kopierte vi ganske enkelt koden til overordnet klasse inn i koden til barneklassen:

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);
   }
}
Slik Childser klassen ut fra kompilatorens synspunkt


2. Metodeoverstyring

Noen ganger er det situasjoner der vi får klassen vår Childtil å arve en veldig nyttig Parentklasse, noe som får barnet til å arve alle foreldrenes variabler og metoder. Men noen av disse metodene fungerer kanskje ikke helt slik vi vil at de skal eller ikke i det hele tatt slik vi vil.

Hva gjør du i dette tilfellet? Vi kan overstyre en metode hvis implementering vi ikke liker . Dette er en enkel ting å gjøre: i Childklassen vår erklærer vi ganske enkelt en metode med samme signatur som metoden i klassen Parentog skriver deretter vår egen kode i den.

Eksempel 1 — metodeoverstyring

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

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

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

Overforenkling av situasjonen noe fører arv til at koden til overordnet klasse blir kopiert inn i barneklassen. Men hvis en etterkommerklasse allerede er en metode som eksisterer i en stamfarklasse, kopieres ikke denne metoden fra stamfarklassen. Her sier vi at metoden i barneklassen overstyrer metoden i foreldreklassen. Se på eksemplet nedenfor. Kanskje det vil bidra til å gjøre ting litt klarere:

Slik ser Child-klassen ut fra kompilatorens 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 - litt arvemagi (og metodeoverstyring)

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 kalles på en Parenttype, kaller den igjen getName()metoden til Parentklassen.

Hvis printInfo()metoden kalles på et Childobjekt, kaller den igjen getName()metoden til Childklassen.

Metoden er med andre ord printInfo()kun deklarert i Parentklassen, men den kaller getName()metoden til Childklassen hvis printInfo()metoden kalles på et Childobjekt.

Eksempel:

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

Og alt fordi fra kompilatorens synspunkt (en veldig forenklet versjon av den), Childser koden til klassen slik ut:

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

   public void printInfo()
   {
      System.out.println(getName());
   }
}
Slik Childser klassen ut fra kompilatorens synspunkt


3. Lister

Her er en kort påminnelse om lister ( List). Lister har mye til felles med matriser:

  • De kan lagre mye data av en bestemt type.
  • De lar deg få elementer etter indeksen deres.
  • Indeksene til elementene starter på 0.

Fordeler med lister:

I motsetning til matriser, kan lister dynamisk endre størrelse. Umiddelbart etter opprettelsen er størrelsen på en liste 0. Etter hvert som elementer legges til i listen, øker størrelsen. Eksempel på å lage en liste:

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

Verdien som er angitt i vinkelparentesene er datatypen som listen kan lagre.

Her er noen metoder for å jobbe med en liste:

Kode Kort beskrivelse
ArrayList<String> list = new ArrayList<String>();
Opprette en ny liste over strenger
list.add("name");
Legg til et element på slutten av listen
list.add(0, "name");
Legg til et element i starten av listen
String name = list.get(5);
Få et element etter indeksen
list.set(5, "new name");
Endre et element etter indeksen
int count = list.size();
Få antall elementer i listen
list.remove(4);
Fjern et element fra listen

For mer informasjon om lister kan du lese følgende artikler:



4. Tilfeldige tall

CodeGym-spillmotoren har to metoder som kan brukes til å generere tilfeldige tall. Disse metodene er:

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

Den første metoden — getRandomNumber(int max)— returnerer et tilfeldig tall i området 0, 1, 2, ... max-1. Under panseret bruker den Randomklassen fra java.utilpakken, men det endrer ikke hvordan du bruker et tilfeldig tall.

getRandomNumber(int)godtar et heltall som et argument. Dette tallet vil være den øvre grensen for tallene som tilfeldig tallgeneratoren kan returnere. Den nedre grensen er 0. OBS! Tilfeldig tallgeneratoren vil ALDRI returnere verdien av den øvre grensen. For eksempel, hvis du ringer getRandomNumber(3), vil den tilfeldig returnere enten 0, 1 eller 2. Som du kan se, vil den ikke returnere 3. Å bruke en tilfeldig tallgenerator på denne måten er ganske enkelt, men det passer i mange tilfeller.

Den andre metoden — getRandomNumber(int min, int max)— returnerer et tilfeldig heltall i området [min, max-1]. Den vil aldri returnere et tall mindre enn min, og den vil aldri returnere et tall som er større enn max-1.

Hvordan kan disse metodene brukes i praksis?

1. Terninger

Anta at du vil simulere terningkastet og få et tilfeldig tall i området 1-6. Hvordan ville du gjort det? Dette kan gjøres med kode som dette:

int dice = getRandomNumber(1, 7);

Denne metoden vil returnere et tilfeldig heltall i området 1-6.

2. Måltrening

Anta at du ønsker å simulere skyting mot et mål, og nøyaktigheten til et skudd inkluderer en tilfeldig komponent som varierer i området fra -10til +10inklusive. Dette kan gjøres med kode som dette:

int dx = getRandomNumber(-10, 11);

Denne metoden vil returnere et tilfeldig heltall i området -10til +10.

Det er mange måter å bruke tilfeldige tall på i spill. Du er bare begrenset av fantasien din. Skriv dine egne spill, avgrens dem og nyt prosessen.

Alle kan spille spill, men bare programmerere kan lage dem.