Hytale Modding
Основи Java

06 - Методи (функції)

Дізнайтеся, як організовувати та повторно використовувати код за допомогою методів.

Методи - це блоки коду, які виконують певні завдання та можуть використовуватися повторно. Вони допомагають уникнути повторення коду та роблять ваші програми більш зрозумілими.

Що таке метод?

Уявіть собі метод як рецепт. Ви визначаєте його один раз, а потім використовуєте, коли це потрібно.

public class Game {
    public static void main(String[] args) {
        greet();        // Викликайте метод
        greet();        // Викликайте його знову!
    }
    
    // Визначення методу
    public static void greet() {
        System.out.println("Ласкаво просимо до Hytale!");
    }
}

Структура методу

public       static       void  methodName() {
//  ^            ^          ^       ^        ^
//  |            |          |       |        |
// модифікатор  статичний   тип    ім'я  параметри
//   доступу              повернення
    // Код вводиться тут
}

Пізніше ми дізнаємося, що означають public і static. А поки що просто використовуйте їх.

Методи з параметрами

Параметри дозволяють передавати дані в методи:

public static void greetPlayer(String name) {
    System.out.println("Привіт, " + name + "!");
}

public static void main(String[] args) {
    greetPlayer("Анна");  // Привіт, Анна!
    greetPlayer("Богдан");    // Привіт, Богдан!
}

Кілька параметрів

public static void dealDamage(String target, int damage) {
    System.out.println(target + " отримує " + damage + " шкоди!");
}

public static void main(String[] args) {
    dealDamage("Зомбі", 20);    // Зомбі отримує 20 шкоди!
    dealDamage("Скелет", 15);  // Скелет отримує 15 шкоди!
}
Порядок параметрів має значення

При виклику методу аргументи повинні відповідати порядку параметрів:

public static void createItem(String name, int quantity, double price) {
    // ...
}

// Правильно
createItem("Меч", 1, 50.0);

// Неправильно - порядок має значення!
createItem(1, "Меч", 50.0);  // Помилка!

Методи з поверненням значень

Методи можуть повертати дані за допомогою return:

public static int add(int a, int b) {
    int sum = a + b;
    return sum;
}

public static void main(String[] args) {
    int result = add(5, 3);
    System.out.println(result);  // 8
}

Тип повернення повинен відповідати тому, що ви повертаєте:

  • void - не повертає нічого
  • int - повертає ціле число
  • double - повертає десяткове число
  • boolean - повертає true/false
  • String - повертає текст
public static String getItemName() {
    return "Діамантовий меч";
}

public static boolean isPlayerAlive(int health) {
    return health > 0;
}

public static double calculateDamage(int attack, double multiplier) {
    return attack * multiplier;
}
Повернення зупиняє виконання

Як тільки метод досягає return, він негайно завершується. Код після return не виконується!

public static int getValue() {
    return 10;
    System.out.println("Це ніколи не виконається!");  // Недосяжний код!
}

Практичні приклади

Система здоров'я

public static void displayHealth(String name, int health, int maxHealth) {
    double percentage = (health * 100.0) / maxHealth;
    System.out.println(name + ": " + health + "/" + maxHealth + 
                      " (" + percentage + "%)");
}

public static void main(String[] args) {
    displayHealth("Гравець", 75, 100);
    displayHealth("Бос", 450, 500);
}

Калькулятор шкоди

public static int calculateDamage(int baseAttack, int weaponDamage, boolean isCritical) {
    int totalDamage = baseAttack + weaponDamage;
    
    if (isCritical) {
        totalDamage *= 2;
    }
    
    return totalDamage;
}

public static void main(String[] args) {
    int damage1 = calculateDamage(10, 15, false);  // 25
    int damage2 = calculateDamage(10, 15, true);   // 50
    
    System.out.println("Нормальний удар: " + damage1);
    System.out.println("Критичний удар: " + damage2);
}

Вимоги до рівня

public static int getXPForLevel(int level) {
    return level * 100;
}

public static boolean canLevelUp(int currentXP, int currentLevel) {
    int required = getXPForLevel(currentLevel + 1);
    return currentXP >= required;
}

public static void main(String[] args) {
    int playerXP = 450;
    int playerLevel = 4;
    
    if (canLevelUp(playerXP, playerLevel)) {
        System.out.println("Ви можете підвищити свій рівень!");
    } else {
        int needed = getXPForLevel(playerLevel + 1) - playerXP;
        System.out.println("Треба ще " + needed + " досвід(-у)");
    }
}

Калькулятор відстані

public static double calculateDistance(int x1, int y1, int x2, int y2) {
    int dx = x2 - x1;
    int dy = y2 - y1;
    return Math.sqrt(dx * dx + dy * dy);
}

public static boolean isInRange(int x1, int y1, int x2, int y2, double range) {
    double distance = calculateDistance(x1, y1, x2, y2);
    return distance <= range;
}

public static void main(String[] args) {
    // Перевірка, чи ворог знаходиться в зоні атаки
    if (isInRange(0, 0, 5, 5, 10.0)) {
        System.out.println("Ціль в зоні атаки!");
    }
}

Перевантаження методів

Ви можете мати кілька методів з однаковою назвою, але з різними параметрами:

public static void displayMessage(String message) {
    System.out.println(message);
}

public static void displayMessage(String message, int times) {
    for (int i = 0; i < times; i++) {
        System.out.println(message);
    }
}

public static void main(String[] args) {
    displayMessage("Привіт");           // Викликає першу версію
    displayMessage("Привіт", 3);        // Викликає другу версію
}
Правила перевантаження методів

Методи вважаються різними, якщо вони мають:

  • Різну кількість параметрів
  • Різні типи параметрів
  • Різний порядок параметрів
public static void test(int a) { }
public static void test(int a, int b) { }        // Різна кількість
public static void test(double a) { }            // Різний тип
public static void test(String a, int b) { }     // Різні типи
public static void test(int a, String b) { }     // Різний порядок

// Неправильно - відрізняється тільки тип повернення
public static int test(int a) { }

Поширені шаблони в модифікаціях Hytale

Створення предметів

public static Item createItem(String name, int durability) {
    Item item = new Item();
    item.setName(name);
    item.setDurability(durability);
    return item;
}

public static Item createSword() {
    return createItem("Меч", 100);
}

public static Item createPickaxe() {
    return createItem("Кайло", 150);
}

Перевірка розміщення блоку

public static boolean canPlaceBlock(int x, int y, int z) {
    // Перевірити, чи позиція є допустимою
    if (y < 0 || y > 255) {
        return false;
    }
    
    // Перевірити, чи блок вже існує
    if (isBlockAt(x, y, z)) {
        return false;
    }
    
    return true;
}

public static void placeBlock(int x, int y, int z, String type) {
    if (canPlaceBlock(x, y, z)) {
        // Розмістити блок
        System.out.println("Розміщено " + type + " в (" + x + ", " + y + ", " + z + ")");
    } else {
        System.out.println("Неможливо розмістити блок у цьому місці!");
    }
}

Перевірка стану гравця

public static boolean isLowHealth(int health, int maxHealth) {
    return (health * 100.0 / maxHealth) < 25;
}

public static String getHealthStatus(int health, int maxHealth) {
    double percentage = (health * 100.0) / maxHealth;
    
    if (percentage >= 75) {
        return "Здоровий";
    } else if (percentage >= 50) {
        return "Поранений";
    } else if (percentage >= 25) {
        return "Критичний";
    } else {
        return "На межі смерті";
    }
}

Кращі практики

Назва методу

Використовуйте описові імена на основі дієслів, які пояснюють, що робить метод:

// Добре
public static void calculateDamage() { }
public static boolean isPlayerAlive() { }
public static String getItemName() { }
public static void displayInventory() { }

// Погано
public static void dmg() { }        // Занадто коротко
public static void method1() { }    // Не описово
public static void stuff() { }      // Занадто абстрактно

Практичні вправи

  1. Перетворювач температури: Напишіть методи для перетворення:

    • Цельсію в Фаренгейт: (C × 9/5) + 32
    • Фаренгейт в Цельсій: (F - 32) × 5/9
  2. Калькулятор кола: Створіть методи для обчислення:

    • Площа: π × radius²
    • Довжину кола: 2 × π × radius
    • Використовуйте Math.PI для π
  3. Міцність предмета: Напишіть такі методи:

    • damageItem(int current, int damage) - повертає нову міцність
    • isBroken(int durability) - повертає true, якщо міцність менше або дорівнює 0
    • repairItem(int current, int max) - повертає максимальну міцність
  4. Перевірка пароля: Створіть метод, який перевіряє, чи пароль є дійсним:

    • Довжина не менше 8 символів
    • Містить принаймні одну цифру
    • Повертає true, якщо дійсний, інакше false

Поширені помилки

// Неправильно - забули оператор return
public static int getValue() {
    int x = 10;
    // Забули return!
} !

// Правильно
public static int getValue() {
    int x = 10;
    return x;
}

// Неправильно - неправильний тип повернення
public static int getText() {
    return "Привіт";  // Помилка! Повинно повертати int, а не String
}

// Правильно
public static String getText() {
    return "Привіт";
}

// Неправильно - не викликається метод
public static void main(String[] args) {
    greet;  // Помилка! Відсутні ()
}

// Правильно
public static void main(String[] args) {
    greet();
}