1. Наследство
За да работите с двигателя на играта CodeGym, ще трябва да използвате наследяване . Но Howво, ако не знаете Howво е това? От една страна, трябва да разберете и проучите тази тема. От друга страна, двигателят е специално проектиран да бъде много прост, така че можете да се справите с повърхностни познания за наследството.
И така, Howво е наследство? С прости думи, наследяването е връзка между два класа. Единият от тях действа като родителски клас, а другият става дъщерен (потомък) клас. Нещо повече, родителският клас може дори да не знае, че има наследствени класове. С други думи, родителят не получава голяма полза от наличието на класове потомци.
Но наследяването дава много предимства на дъщерния клас. Най-важното от тях е, че всички променливи и методи на родителския клас се появяват в дъщерния клас, сякаш codeът на родителския клас е копиран директно в дъщерния клас. Това не е съвсем точно, но ще бъде достатъчно за основно разбиране на наследството.
Ето няколко примера, които да ви помогнат да разберете по-добре наследяването.
Пример 1 — ето най-простият пример
|
Класът Child наследява Parent класа с помощта на extends ключовата дума. |
|
Пример 2 — използване на променливите на родителския клас
|
Класът Child може да използва полетата age и name на класа Parent , сякаш са декларирани в Child самия клас. |
|
Пример 3 — използване на методи на родителския клас
|
Класът Child може да използва променливите и методите на класа Parent, сякаш са декларирани в Child класа. В този пример използваме getName() метода. |
|
Пропускайки някои подробности, можем да кажем, че от гледна точка на компилатора на 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);
}
}
Child
изглежда класът от гледна точка на компилатора
2. Замяна на метода
Понякога има ситуации, в които караме нашия Child
клас да наследи много полезен Parent
клас, карайки детето да наследи всички променливи и методи на родителя. Но някои от тези методи може да не работят точно по начина, по който искаме or изобщо не по начина, по който искаме.
Какво правите в този случай? Можем да отменим метод, чиято реализация не ни харесва . Това е лесно нещо, което трябва да направите: в нашия Child
клас ние просто декларираме метод със същата сигнатура като метода в Parent
класа и след това пишем наш собствен code в него.
Пример 1 — отмяна на метода
|
Методът printInfo() ще покаже следната фраза:
|
|
Донякъде опростявайки ситуацията, наследяването кара codeът на родителския клас да бъде копиран в дъщерния клас. Но ако клас наследник вече е метод, който съществува в клас предшественик, тогава този метод не се копира от класа предшественик. Тук казваме, че методът в дъщерния клас замества метода в родителския клас. Вижте примера по-долу. Може би това ще помогне да направим нещата малко по-ясни:
Ето How изглежда класът Child от гледна точка на компилатора: |
---|
|
Пример 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
обект.
Пример:
|
Този code показва следния текст на екрана:
|
|
Този code показва следния текст на екрана:
|
И всичко това, защото от гледна точка на компилатора (негова много опростена version) codeът на класа Child
изглежда така:
public class Child extends Parent
{
public getName() {
return "Luke, I am your father";
}
public void printInfo()
{
System.out.println(getName());
}
}
Child
изглежда класът от гледна точка на компилатора
3. Списъци
Ето кратко напомняне за списъците ( List
). Списъците имат много общо с масивите:
- Те могат да съхраняват много данни от определен тип.
- Те ви позволяват да получавате елементи по техния индекс.
- Индексите на елементите започват от
0
.
Предимства на списъците:
За разлика от масивите, списъците могат динамично да променят размера си. Веднага след създаването, размерът на списъка е 0
. Когато елементите се добавят към списъка, неговият размер се увеличава. Пример за създаване на списък:
ArrayList<String> myList = new ArrayList<String>();
ArrayList
Стойността, посочена в ъгловите скоби, е типът данни, който списъкът може да съхранява.
Ето някои методи за работа със списък:
Код | Кратко описание |
---|---|
|
Създаване на нов списък от низове |
|
Добавете елемент в края на списъка |
|
Добавете елемент в началото на списъка |
|
Вземете елемент по неговия индекс |
|
Промяна на елемент по неговия индекс |
|
Вземете броя на елементите в списъка |
|
Премахване на елемент от списъка |
За повече информация относно списъците можете да прочетете следните статии:
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
.
Има много начини за използване на произволни числа в игрите. Вие сте ограничени само от вашето въображение. Напишете свои собствени игри, усъвършенствайте ги и се насладете на процеса.
Всеки може да играе игри, но само програмистите могат да ги създават.
GO TO FULL VERSION