06 - Методы (Функции)
Вы узнаете, что такое методы, как они работают и как с помощью них можно значительно сократить размер кода.
Методы - это повторно используемые блоки кода, выполняющие конкретные задачи. Они помогают вам избежать повторения кода и облегчить понимание ваших программ.
Что такое Метод?
Подумайте о методе как о рецепте. Вы записываете его один раз, затем достаёте его каждый раз, когда вам нужно приготовить блюдо
public class Game {
public static void main(String[] args) {
greet(); // Вызываем метод
greet(); // Ещё раз!
}
// Method definition
public static void greet() {
System.out.println("Добро пожаловать в Hytale!");
}
}Структура Метода
public static void methodName() {
// ^ ^ ^ ^ ^
// | | | | |
// доступ стат. return назв. параметры
// модификатор тип
// Тут должен быть код
}Мы узнаем, что такое public и static позже. Пока что просто используйте их.
Методы с параметрами
Параметры позволяют передавать данные в методы:
public static void greetPlayer(String name) {
System.out.println("Привет, " + name + "!");
}
public static void main(String[] args) {
greetPlayer("Алиса"); // Привет, Алиса!
greetPlayer("Bob"); // Привет, Боб!
}Множество параметров
public static void dealDamage(String target, int damage) {
System.out.println(target + " takes " + damage + " damage!");
}
public static void main(String[] args) {
dealDamage("Зомби", 20); // Зомби получает 20 урона!
dealDamage("Скелет", 15); // Скелет получает 15 урона!
}При вызове метода аргументы должны соответствовать порядку параметров:
public static void createItem(String name, int quantity, double price) {
// ...
}
// Правильный вариант
createItem("Sword", 1, 50.0);
//Неправильный порядок аргументов!
createItem(1, "Sword", 50.0); // Ошибка!Возвращение значений методов с помощью Return
Методы могут отправлять "возвращать" данные с помощью 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/falseString- Возвращает текст
public static String getItemName() {
return "Diamond Sword";
}
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("Hytale никогда не выйдет!!"); // Строка находится после return, значит она не будет выполнена!
}Практические примеры
Система ХП
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("Normal hit: " + damage1);
System.out.println("Critical hit: " + 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("You can level up!");
} else {
int needed = getXPForLevel(playerLevel + 1) - playerXP;
System.out.println("Need " + needed + " more XP");
}
}Счетчик расстояния
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) {
// Check if enemy is in attack range
if (isInRange(0, 0, 5, 5, 10.0)) {
System.out.println("Target in range!");
}
}Перезгрузка метода
У вас может быть несколько методов с одинаковыми названиями, но разными параметрами:
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("Hello"); // Вызываем первый метод (указан только один параметр)
displayMessage("Hello", 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 моддинга
Создание Предметов
ublic 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("Sword", 100);
}
public static Item createPickaxe() {
return createItem("Pickaxe", 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)) {
// Place the block
System.out.println("Placed " + type + " at (" + 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 "Симон продаёт Hytale";
}
}Рекомендации
Старайтесь давать методам достаточно подробные наименования, чтобы было понятно, за что они отвечают:
// Хорошие примеры
public static void calculateDamage() { }
public static boolean isPlayerAlive() { }
public static String getItemName() { }
public static void displayInventory() { }
// Bad
public static void dmg() { } // Слишком коротко
public static void method1() { } // Недостаточно подробно
public static void stuff() { } // Слишком расплывчатымПрактические Задания
-
Конвертер температуры: Напишите методы для конвертирования:
- Цельсий в Фаренгейт:
(C × 9/5) + 32 - Фаренгейт в Цельсии:
(F - 32) × 5/9
- Цельсий в Фаренгейт:
-
Круговой калькулятор: Создайте методы, которые вычисляют:
- Площадь:
π × radius² - Периметр:
2 × π × radius - Используйте
Math.PIдля вместо π
- Площадь:
-
Прочность предмета: Создайте следующие методы:
damageItem(int current, int damage)- возвращает текущую(новую) прочностьisBroken(int durability)- возвращает true, если прочность меньше или равна 0repairItem(int current, int max)- возвращает максимальную прочность
-
Проверка паролей: Создайте метод, который проверяет надёжность пароля:
- Длина должна быть не меньше 8 символов
- Содержит как минимум одно число
- Возвращает true, если пароль достаточно надёжный, false, если нет
When writing a password validator, you may need a way to compare array values. For example:
String[] array1 = {"Apple", "Banana"};
String[] array2 = {"Apple", "Banana"};
//Wrong:
array1[0] == array2[0]; // false
/*
Array is a non-primitive data type. Java compares reference (non-primitive) data types by
their location in Java's memory, not by their values.
*/
// To compare the actual values of reference data types, use the .equals() method:
array1[0].equals(array2[0]); // true
// This does not apply to primitive data types.Распространённые ошибки
// Ошибка, не оператора return
public static int getValue() {
int x = 10;
// Forgot to return!
} !
// Правильный вариант
public static int getValue() {
int x = 10;
return x;
}
// Ошибка, код возращает неправильный тип данных (код возвращает string, но, после static, указано int)
public static int getText() {
return "Hello"; // Error! Should return int, not String
}
// Правильный вариант
public static String getText() {
return "Hello";
}
// Ошибка, метод не вызывается
public static void main(String[] args) {
greet; // Отсутствуют ()
}
// Правильный вариант
public static void main(String[] args) {
greet();
}