Задача на создание игры РПГ

488
10 июня 2021, 16:30

Герой игры обладает никнеймом, силой, ловкостью и интеллектом, помимо этого у него есть здоровье, мана и опыт и позиция на карте в координатах х, у. Любой герой может переместиться за курсором, атаковать, защищаться, выполнить действие. Герой может принадлежать любому из 3 классов - маг, воин, лучник.

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

Помимо базовых характеристик героя, у классов есть свои особенности:

Маг имеет больший запас маны при создании и способен атаковать на расстоянии. Маг имеет возможность произносить заклинания из списка. Маг имеет возможность изучать заклинания в случае нахождения свитка соответствующего заклинания.

Воин имеет больший запас здоровья при создании, больший урон с руки, возможность атаковать при помощи предмета.

Лучник - имеет лук при создании и способен атаковать на расстоянии. Лучник имеет возможность избежать урон при атаке и умеет открывать любые замки. Необходимо описать недостающие методы и добавить часть кода для того, чтобы программа заработала.

Механика метода attack - герой всегда наносит удар первым, потом ждет удара от цели и так до гибели кого либо из атакующих. В случае убийства цели (здоровье цели упало до 0 или ниже) - цель удар не наносит. В этом случае герой приобретает опыт цели. Каждые 500 единиц опыта герой получает новый уровень и это влияет на его характеристике в соответствии с описанием ниже. Если цель убивает героя необходимо вывести в консоль "Ваш герой был убит".

    class Item {
        int price, weight, type;
        public Item(int price, int weight, int type){
            this.price = price;
            this.weight = weight;
            this.type = type;
        }
    }
    class Enemy{
        int hp, damage;
        int exp;
        public Enemy(int hp, int damage, int exp){
            this.hp = hp;
            this.damage = damage;
            this.exp = exp;
        }
    }
    abstract class Hero{
        protected String nickName;
        protected int s, a, i, exp, hp, mana; // сила ловкость интеллект 
    опыт здоровье мана
        protected int x, y; // координаты героя на карте
        protected ArrayList<Item> items = new ArrayList<>(); // список поднятых предметов
        protected int damage; // урон
        public int getMana(){
            return mana;
        }
        public int getDamage(){
            return damage;
        }
        public int getHp(){
            return hp;
        }
        public void goToCursor(int xx, int yy){
            x = xx; y = yy;
        }
        public abstract void attack(Enemy enemy); // этот метод должнен быть определен в классах наследниках
        public abstract void defense(Enemy enemy);// этот метод должнен быть определен в классах наследниках
        public void openItem(Item item){
            // метод должен добавлять предмет в список с вероятностью 50 %
            // для осуществления вероятностных процессов можно использовать случайное число от 0 до 100.
        }
    }
    class Warrior{
        public Warrior(){
            //базовые значение
        }
         /*
    класс должен обладать всеми свойствами героя при создании воин должен 
    обладать следующими характеристиками:
     здоровье - 500, мана - 10, сила - 100, ловкость - 50, интеллект - 1, 
    опыт 0, урон - 150. При атаке герой наносит цели урон и получает урон в 
    ответ от цели, действия повторяются пока кто то не победит. В случае 
    победы герой получает опыт цели, каждые 500 единиц опыта герой получает 
    новый уровень. Новый уровень дает +10 ко всем характеристикам, +200 
    здоровья и +20 урона.Если воин имеет предмет 1 типа, к его урону 
    добавляется 100.
        Уже мертвая цель - урона герою не наносит!!!
        */
    }
    class Archer{
        public Archer(){
            //базовые значение
        }
         /*
            класс должен обладать всеми свойствами героя при создании лучник должен обладать следующими характеристиками: здоровье - 200, мана - 50, сила - 20, ловкость - 150, интеллект - 30, опыт 0, урон - 200.
        атака по аналогии с воином, но в процессе атаки лучник имеет 30% шанс избежать урон
        лучник всегда открывает предмет - 100%
        Новый уровень дает +10 ко всем характеристикам, +50 здоровья и +50 урона и 30 ловкости.
        */
    }
    class Magician{
        public Magician(){
            //базовые значение
        }
        private ArrayList<Item> casts = new ArrayList<>();
        /*
    класс должен обладать всеми свойствами героя при создании маг должен обладать следующими характеристиками: здоровье - 100, мана - 5000, сила - 5, ловкость - 30, интеллект - 300, опыт 0, урон - 40.
атака по аналогии с воином
помимо обычной атаки, маг имеет возможность бить заклинанием в процессе атаки
защита мага осуществляется магическим щитом, который полгащает весь урон, но вместо здоровья тратит ману. Новый уровень дает +10 ко всем характеристикам, +30 здоровья, 1000 маны и +10 урона.
В случае возможности убить врага с руки - маг бьет с руки!!! в Первую очередь
*/
        public void makeCast(Enemy enemy){
            // если в списке есть заклятия можно его произнести потратив 100 маны и нанеся 1000 урона цели.
    // после произнесения предмет из списка пропадает
        }
        public void eduCast(Item item){
                    /*
            если предмет или предметы из списка имеют тип 2, это заклинания 
    и их нужно добавить в список
    заклинаний мага
            */
        }
    }

Для меня это вообще нереально сложная пока задача, поэтому буду признателен, если поможете разобраться в ней!

Класс Main для тестов логики боя выглядит примерно так:

    public class TestClass {
        public static void main(String[] args) throws IOException {
            Hero myHero = new Warrior();
            // Hero myHero = new Archer();
            // Hero myHero = new Magician();
            ArrayList<Enemy> enemies = new ArrayList<>();
            enemies.add(new Enemy(30, 20, 1200)); // 1 - Крестьянин
            enemies.add(new Enemy(2018, 1, 350)); // 2 - Стая собак
            enemies.add(new Enemy(280, 50, 3050)); // 3 - Вор
            enemies.add(new Enemy(100500, 100500, 100500)); // 4 - 
    Берсерк
            //найден клад
            for (int i = 0; i < 300; i++) {
                Item item = new Item(0, 0, i % 3); // i%3 - будет задавать 
    предмету тип 0, 1, 2
                myHero.openItem(item);  // герои получает предмет в руки
            }
            System.out.println("Всего собрано: " + myHero.items.size());
            // бой!
            int count = 1;
            for (Enemy enemy : enemies) {
                System.out.println(count++ + "-й бой:");
                System.out.println("  Герои { hp=" + myHero.hp + " mana=" + 
    myHero.mana + " }");
                System.out.println("  Враг { hp=" + enemy.hp + " }");
                int counter = 1;
                while (myHero.hp > 0 & enemy.hp > 0) {
                    System.out.println(counter++ + " раунд:");
                    myHero.attack(enemy);
                    myHero.defense(enemy);
                    System.out.println("    Герои { hp=" + myHero.hp + " 
    mana=" + myHero.mana + " }");
                    System.out.println("    Враг { hp=" + enemy.hp + " }");
                }
                System.out.println(myHero.hp > 0 ? "Победа, герой получил 
    опыт " + enemy.exp : "Поражение");
                System.out.printf("Герой { HP=%d, MANNA=%d, damage=%d, 
    exp=%d }\n", myHero.hp, myHero.mana, myHero.damage, myHero.exp);
            }
        }
    }
Answer 1

Методы переопределяются так:

class Enemy {}
abstract class Hero {
    public abstract void attack(Enemy enemy);
}
class Warrior extends Hero {
    @Override // можно не писать
    public void attack(Enemy enemy) {
    }
}

Я так понимаю, что вам нужно что-то вроде этого:

Enemy[] enemies = new Enemy[3];
Scanner scanner = new Scanner(System.in);
boolean battleFinished = false;
while(!battleFinished) {
    System.out.println("Выберите действите: 1)Атака , 2)Защита , 3) Суицид");
    switch (scanner.nextLine()) {
        case "1":
        case "Атака":
            System.out.printf("Выберите врага. (всего врагов %d)\n", enemies.length);
            //код атаки на какого-то врага
        case "2":
        case "Защита":
            //код защиты
        case "3":
        case "Суицид":
            //код суицида
    }
}
READ ALSO
HashMap и чтение из файла

HashMap и чтение из файла

Написать программу в которой можно из консоли делать текстовые записи в файл (с помощью Scanner) в кодировке "cp1251"

159
Реестр и параметры Java

Реестр и параметры Java

Ребят, подскажите, где в реестре лежат значения Java ? Например, выделенная в данный момент память для Jav'ыили любой другой путь, где лежит конфиг...

146
Как внедрить версию библиотеки из другой ветки в maven?

Как внедрить версию библиотеки из другой ветки в maven?

Есть большой проект, в него подтягиваются библиотеки с gitlab к которым у меня есть доступМне нужно поменять некоторые методы в этих библиотеках...

212
return возвращает неожидаемый результат

return возвращает неожидаемый результат

В сообщении хочу вывести сгенерированый парольОт меня программа ждёт цифру определяющую количество символов в нём

109