Нужно пару подсказок по Java

277
12 февраля 2020, 04:50

В main реализовано бой двух персонажев и у меня почему то время от времени умирают они оба, как можно это исправить и еще одно как создать метод который будет заменять исходные значения персонажа.

import static home_work_enum.mmorpg.Characters.MAGE;
import static home_work_enum.mmorpg.Characters.WARRIOR;
/**
 *
 * @author Pivar
 */
public class Home_Work_EnumMMOrpg {
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        while (Characters.fightContinue()) {
            MAGE.atk(WARRIOR);
            WARRIOR.atk(MAGE);
            System.out.println(WARRIOR);
            System.out.println(MAGE);
        }
        if (MAGE.isAlive()) {
            System.out.println("Flawless Victory - " + MAGE.getNAME());
        } else {
            System.out.println("Flawless Victory - " + WARRIOR.getNAME());
        }
    }
}

import java.util.Random;
/**
 *
 * @author Pivar
 */
public enum Characters {
    WARRIOR("DarthVader", 10, 10, true),
    MAGE("DarthSidius", 10, 10, true),
    ARCHER("HanSolo", 100, 10, true);
    private String NAME;
    private int health;
    private int attack;
    private boolean alive;
    public void damage(int inAttack) {
        Random rd = new Random();
        inAttack = rd.nextInt(attack);
        this.health -= inAttack;
        if (this.health <= 0) {
            this.alive = false;
        }
    }
    public void atk(Characters att) {
        att.damage(health);
    }
    @Override
    public String toString() {
        return "Characters{" + "NAME=" + NAME + ", health=" + health + ", attack=" + attack + ", alive=" + alive + '}';
    }
    private Characters(String NAME, int health, int attack, boolean alive) {
        this.NAME = NAME;
        this.health = health;
        this.attack = attack;
        if (health > 0) {
            this.alive = true;
        }
    }
    public boolean isAlive() {
        return alive;
    }
    public void setAlive(boolean alive) {
        this.alive = alive;
    }
    public String getNAME() {
        return NAME;
    }
    public void setNAME(String NAME) {
        this.NAME = NAME;
    }
    public int getHealth() {
        return health;
    }
    public void setHealth(int health) {
        this.health = health;
    }
    public int getAttack() {
        return attack;
    }
    public void setAttack(int attack) {
        this.attack = attack;
    }
    public static boolean fightContinue() {
        int count = 2;
        for (Characters ch : Characters.values()) {
            if (!ch.alive) {
                count--;
            }
        }
        return count > 1;
    }
}

Создать простую игру MMORPG с использованием enum. Типы персонажей - элементы перечисления.

например:

public enum Characters{
    WARRIOR,        
    MAGE,
    ARCHER
}

В enum создать поля имя персонажа, здоровье, аттака, жив (boolean alive;). Добавить методы аттаки, потери здоровья... Переопределить метод toString() чтоб он возвращал информацию о персонаже.

Создать конструктор который будет инициализировать все поля персонажа.

Добавить геттеры и сеттеры.

В элементах перечисления задать значения по умолчанию для каждого типа персонажа.

например: WARRIOR("Воин", 100, 50)

Создать метод который будет заменять исходные значения персонажа.

В main реализовать бой двух персонажей в цикле. Сначала один персонаж атакует второго. Потом наоборот. Цикл продолжается пока здоровье какого-то персонажа не станет меньше или равно нулю. Вывести сообщение кто победил.

Answer 1
while (Characters.fightContinue()) {
    MAGE.atk(WARRIOR);  // Маг атаковал воина и убил его
    WARRIOR.atk(MAGE);  // Мертвый воин поднялся, атаковал мага и тоже убил его
    System.out.println(WARRIOR);
    System.out.println(MAGE);
}

Как должно быть: если у вас в битве участвуют только два персонажа, то так

while (true) {
    MAGE.atk(WARRIOR);
    if (!WARRIOR.isAlive())
        break;
    WARRIOR.atk(MAGE);
    if (!MAGE.isAlive())
        break;
}

или еще лучше

while (true) {
    if (MAGE.atk(WARRIOR))
        break;
    if (WARRIOR.atk(MAGE))
        break;
}
public enum Characters {
    ........
    public boolean atk(Characters att) {
        att.damage(health);
        return !att.isAlive();
    }
    ......
}

или так

while (!MAGE.atk(WARRIOR) && !WARRIOR.atk(MAGE));

Далее, смысла этого кода я не понял

public enum Characters {
    ...................
    public void damage(int inAttack) {
        // создание генератора на каждом вызове неправильно.
        // Это должно быть статическое поле класса
        Random rd = new Random();
        // мы игнорируем переданный ущерб и генерируем свой
        // причем ущерб нанесенный персонажу не выше уровня атаки этого персонажа
        inAttack = rd.nextInt(attack);
        this.health -= inAttack;
        if (this.health <= 0) {
            this.alive = false;
        }
    }
    public void atk(Characters att) {
        att.damage(health);  // мы атакуем своим здоровьем
    }
    ...................
}

поехали дальше

public enum Characters {
    ...................
    public void damage(int inAttack) {
        Random rd = new Random();
        inAttack = rd.nextInt(attack);
        this.health -= inAttack;
        if (this.health <= 0) {
            this.alive = false;
        }
    }
    ...................
    public boolean isAlive() {
        return alive;
    }
    ...................
}

поле alive здесь не нужно совсем. Достаточно писать так

public enum Characters {
    ...................
    public void damage(int inAttack) {
        Random rd = new Random();
        inAttack = rd.nextInt(attack);
        this.health -= inAttack;
    }
    ...................
    public boolean isAlive() {
        return this.health > 0;
    }
    ...................
}

Модифицировать поля enum значений это нонсенс. У них все поля хорошо объявить финальными. Иначе проблем на более менее большой программе, не оберетесь. Да и зачем вам здесь enum, если достаточно обычного класса?

В итоге получаем, что-то типа такого

public class Character {
    private static final Random rd = new Random();
    private String NAME;
    private int health;
    private int attack;
    public boolean damage(int inAttack) {
        this.health -= rd.nextInt(inAttack);
        return isAlive();
    }
    public boolean atk(Characters att) {
        return att.damage(this.attack);
    }
    @Override
    public String toString() {
        return "Character {" + "NAME=" + NAME + ", health=" + health + ", attack=" + attack + "}";
    }
    public Character (String NAME, int health, int attack) {
        this.NAME = NAME;
        this.health = health;
        this.attack = attack;
    }
    public boolean isAlive() {
        return alive;
    }
    public String getNAME() {
        return NAME;
    }
    public void setNAME(String NAME) {
        this.NAME = NAME;
    }
    public int getHealth() {
        return health;
    }
    public void setHealth(int health) {
        this.health = health;
    }
    public int getAttack() {
        return attack;
    }
    public void setAttack(int attack) {
        this.attack = attack;
    }
}
public class Home_Work_EnumMMOrpg {
    public static void main(String[] args) {
        Character WARRIOR = new Character("DarthVader", 10, 10);
        Character MAGE = new Character("DarthSidius", 10, 10);
        while (!MAGE.atk(WARRIOR) && !WARRIOR.atk(MAGE)) {
            System.out.println(WARRIOR);
            System.out.println(MAGE);
        }
        Character victory = (MAGE.isAlive()) ? MAGE : WARRIOR;
        System.out.println("Flawless Victory - " + victory.getNAME());
    }
}
READ ALSO
Динамическое построение PDF-документов

Динамическое построение PDF-документов

Есть андроид приложение, в которое посылает скрипту сайта запрос на формирование PDF документаВыглядит это так:

239
Возникла ошибка при шифровании текста, с подключенным методом генерации помех

Возникла ошибка при шифровании текста, с подключенным методом генерации помех

Возникла следующая проблемаПытаюсь реализовать шифровку текста

251
a jni error has occurred .jar

a jni error has occurred .jar

Работаю с javaFX 11 / JDK 11,экспортирую проект в jar при запуске выскакивает окно: "a jni error has occurred please check your installation and try again", но если работать с JDK 8 и плагином...

269
Как передавать разные значения data в один и тот же инпут по onclick?

Как передавать разные значения data в один и тот же инпут по onclick?

Имеется несколько ссылок с атрибутамиЗначения атрибутов задаются через php и они все разные

250