В 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 реализовать бой двух персонажей в цикле. Сначала один персонаж атакует второго. Потом наоборот. Цикл продолжается пока здоровье какого-то персонажа не станет меньше или равно нулю. Вывести сообщение кто победил.
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());
}
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Есть андроид приложение, в которое посылает скрипту сайта запрос на формирование PDF документаВыглядит это так:
Возникла следующая проблемаПытаюсь реализовать шифровку текста
Работаю с javaFX 11 / JDK 11,экспортирую проект в jar при запуске выскакивает окно: "a jni error has occurred please check your installation and try again", но если работать с JDK 8 и плагином...
Имеется несколько ссылок с атрибутамиЗначения атрибутов задаются через php и они все разные