1. Наследство

За да работите с двигателя на играта CodeGym, ще трябва да използвате наследяване . Но Howво, ако не знаете Howво е това? От една страна, трябва да разберете и проучите тази тема. От друга страна, двигателят е специално проектиран да бъде много прост, така че можете да се справите с повърхностни познания за наследството.

И така, Howво е наследство? С прости думи, наследяването е връзка между два класа. Единият от тях действа като родителски клас, а другият става дъщерен (потомък) клас. Нещо повече, родителският клас може дори да не знае, че има наследствени класове. С други думи, родителят не получава голяма полза от наличието на класове потомци.

Но наследяването дава много предимства на дъщерния клас. Най-важното от тях е, че всички променливи и методи на родителския клас се появяват в дъщерния клас, сякаш codeът на родителския клас е копиран директно в дъщерния клас. Това не е съвсем точно, но ще бъде достатъчно за основно разбиране на наследството.

Ето няколко примера, които да ви помогнат да разберете по-добре наследяването.

Пример 1 — ето най-простият пример

public class Parent
{
}
Класът Childнаследява Parentкласа с помощта на extendsключовата дума.
public class Child extends Parent
{
}

Пример 2 — използване на променливите на родителския клас

public class Parent
{
  public int age;
  public String name;
}
Класът Childможе да използва полетата ageи nameна класа Parent, сякаш са декларирани в Childсамия клас.
public class Child extends Parent
{
  public void printInfo()
  {
    System.out.println(name + " " + age);
  }
}

Пример 3 — използване на методи на родителския клас

public class Parent
{
   public int age;
   public String name;
   public getName() {
      return name;
   }
}
Класът Childможе да използва променливите и методите на класа Parent, сякаш са декларирани в Childкласа. В този пример използваме getName()метода.
public class Child extends Parent
{
   public void printInfo()
   {
      System.out.println(getName() + " " + age);
   }
}

Пропускайки някои подробности, можем да кажем, че от гледна точка на компилатора на Java ние просто копирахме codeа на родителския клас в codeа на дъщерния клас:

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);
   }
}
Ето How Childизглежда класът от гледна точка на компилатора


2. Замяна на метода

Понякога има ситуации, в които караме нашия Childклас да наследи много полезен Parentклас, карайки детето да наследи всички променливи и методи на родителя. Но някои от тези методи може да не работят точно по начина, по който искаме or изобщо не по начина, по който искаме.

Какво правите в този случай? Можем да отменим метод, чиято реализация не ни харесва . Това е лесно нещо, което трябва да направите: в нашия Childклас ние просто декларираме метод със същата сигнатура като метода в Parentкласа и след това пишем наш собствен code в него.

Пример 1 — отмяна на метода

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

   public getName() {
      return name;
   }
}
Методът printInfo()ще покаже следната фраза:
Luke, No!!!
public class Child extends Parent
{
   public void setName(String nameNew) {
      name = nameNew + ", No!!!";
   }

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

Донякъде опростявайки ситуацията, наследяването кара codeът на родителския клас да бъде копиран в дъщерния клас. Но ако клас наследник вече е метод, който съществува в клас предшественик, тогава този метод не се копира от класа предшественик. Тук казваме, че методът в дъщерния клас замества метода в родителския клас. Вижте примера по-долу. Може би това ще помогне да направим нещата малко по-ясни:

Ето How изглежда класът Child от гледна точка на компилатора:
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());
   }
}

Пример 2 - малко магия за наследяване (и замяна на метод)

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

Ако printInfo()методът се извиква на Parentтип, той от своя страна извиква getName()метода на Parentкласа.

Ако printInfo()методът се извика на Childобект, той от своя страна извиква getName()метода на Childкласа.

С други думи, printInfo()методът се декларира само в Parentкласа, но извиква getName()метода на Childкласа, ако printInfo()методът е извикан на Childобект.

Пример:

Parent parent = new Parent();
parent.printnInfo();
Този code показва следния текст на екрана:
Luke
Child child = new Child();
child.printnInfo();
Този code показва следния текст на екрана:
Luke, I am your father

И всичко това, защото от гледна точка на компилатора (негова много опростена version) codeът на класа Childизглежда така:

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

   public void printInfo()
   {
      System.out.println(getName());
   }
}
Ето How Childизглежда класът от гледна точка на компилатора


3. Списъци

Ето кратко напомняне за списъците ( List). Списъците имат много общо с масивите:

  • Те могат да съхраняват много данни от определен тип.
  • Те ви позволяват да получавате елементи по техния индекс.
  • Индексите на елементите започват от 0.

Предимства на списъците:

За разлика от масивите, списъците могат динамично да променят размера си. Веднага след създаването, размерът на списъка е 0. Когато елементите се добавят към списъка, неговият размер се увеличава. Пример за създаване на списък:

ArrayList<String> myList = new ArrayList<String>();
Създаване на новArrayList

Стойността, посочена в ъгловите скоби, е типът данни, който списъкът може да съхранява.

Ето някои методи за работа със списък:

Код Кратко описание
ArrayList<String> list = new ArrayList<String>();
Създаване на нов списък от низове
list.add("name");
Добавете елемент в края на списъка
list.add(0, "name");
Добавете елемент в началото на списъка
String name = list.get(5);
Вземете елемент по неговия индекс
list.set(5, "new name");
Промяна на елемент по неговия индекс
int count = list.size();
Вземете броя на елементите в списъка
list.remove(4);
Премахване на елемент от списъка

За повече информация относно списъците можете да прочетете следните статии:



4. Случайни числа

Игровият двигател CodeGym има два метода, които могат да се използват за генериране на произволни числа. Тези методи са:

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

Първият метод — getRandomNumber(int max)— връща произволно число в диапазона 0, 1, 2, ... max-1. Под капака той използва Randomкласа от java.utilпакета, но това не променя начина, по който използвате произволно число.

getRandomNumber(int)приема цяло число като аргумент. Това число ще бъде горната граница на числата, които генераторът на произволни числа може да върне. Долната граница е 0. Внимание! Генераторът на случайни числа НИКОГА няма да върне стойността на горната граница. Например, ако извикате getRandomNumber(3), той произволно ще върне 0, 1 or 2. Както можете да видите, няма да върне 3. Използването на генератор на произволни числа по този начин е доста просто, но е подходящо за много случаи.

Вторият метод — getRandomNumber(int min, int max)— връща произволно цяло число в диапазона [min, max-1]. Никога няма да върне число min, по-малко от и никога няма да върне число, по-голямо от max-1.

Как тези методи могат да се използват на практика?

1. Зарове

Да предположим, че искате да симулирате хвърляне на зар и да получите произволно число в диапазона 1-6. Как бихте го направor? Това може да стане с code като този:

int dice = getRandomNumber(1, 7);

Този метод ще върне произволно цяло число в диапазона 1-6.

2. Целева практика

Да предположим, че искате да симулирате стрелба по мишена и точността на изстрела включва произволен компонент, който варира в диапазона от -10до +10включително. Това може да стане с code като този:

int dx = getRandomNumber(-10, 11);

Този метод ще върне произволно цяло число в диапазона -10до +10.

Има много начини за използване на произволни числа в игрите. Вие сте ограничени само от вашето въображение. Напишете свои собствени игри, усъвършенствайте ги и се насладете на процеса.

Всеки може да играе игри, но само програмистите могат да ги създават.