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
|
Klassen Child arver Parent klassen ved hjælp af nøgleordet extends . |
|
Eksempel 2 — ved at bruge variablerne i den overordnede klasse
|
Klassen Child kan bruge age og name felterne i Parent klassen, som om de var erklæret i Child selve klassen. |
|
Eksempel 3 — ved hjælp af metoder fra den overordnede klasse
|
Klassen Child kan bruge variablerne og metoderne i forældreklassen, som om de var erklæret i Child klassen. I dette eksempel bruger vi getName() metoden. |
|
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);
}
}
Child
klassen ser ud fra compilerens synspunkt
2. Metodetilsidesættelse
Nogle gange er der situationer, hvor vi får vores Child
klasse til at arve en meget nyttig Parent
klasse, 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 Child
klasse erklærer vi simpelthen en metode med samme signatur som metoden i Parent
klassen og skriver derefter vores egen kode i den.
Eksempel 1 — metode tilsidesættelse
|
Metoden printInfo() viser følgende sætning:
|
|
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: |
---|
|
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 Parent
type, kalder den igen getName()
klassens metode Parent
.
Hvis printInfo()
metoden kaldes på et Child
objekt, kalder den igen getName()
klassens metode Child
.
Med andre ord printInfo()
er metoden kun erklæret i Parent
klassen, men den kalder getName()
klassens metode Child
, hvis printInfo()
metoden kaldes på et Child
objekt.
Eksempel:
|
Denne kode viser følgende tekst på skærmen:
|
|
Denne kode viser følgende tekst på skærmen:
|
Og alt sammen fordi fra compilerens synspunkt (en meget forenklet version af det), Child
ser 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());
}
}
Child
klassen 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>();
ArrayList
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 |
---|---|
|
Oprettelse af en ny liste over strenge |
|
Tilføj et element til slutningen af listen |
|
Tilføj et element til starten af listen |
|
Få et element ved dets indeks |
|
Ændre et element ved dets indeks |
|
Få antallet af elementer på listen |
|
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 Random
klassen fra java.util
pakken, 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 -10
til +10
inklusive. Dette kan gøres med kode som denne:
int dx = getRandomNumber(-10, 11);
Denne metode returnerer et tilfældigt heltal i området -10
til +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.