2017-02-18 17 views
2

Я хочу закодировать небольшое текстовое приключение/подземелье типа гусеницы. На данный момент у меня есть классы Creature, Player и Enemy. Классы Player и Enemy являются подклассами Creature.Атрибуты зависимостей между двумя классами

Я хочу, чтобы уровень противника зависел от уровня игрока. Так, например, уровень противника всегда должен быть на 1 уровень выше уровня игрока. Поэтому, когда игрок уровня 4, вы должны быть только в состоянии противостоять врагам, которые находятся на одном уровне 5.

Моя идея состояла в том, чтобы положить что-то вроде этого в конструкторе Enemy класса:

public Enemy(String name, int hp, int atk, int exp) { 
    super(name, Player.getLevel + 1, hp, atk); 
    this.exp = exp; 
} 

Но это явно не допускается. Теперь я понятия не имею, как достичь этого результата. Мне не хватает базового понимания Java, но я хочу учиться.

В настоящее время мой код выглядит так. Я оставил геттеры и сеттеры для лучшей читаемости.

public class Creature { 

    private String name; 
    private int level; 
    private int hp; 
    private int atk; 

    public Creature (String name, int level, int hp, int atk){ 
     this.name = name; 
     this.level = level; 
     this.hp = hp; 
     this.atk = atk; 
    } 
} 


public class Player extends Creature { 

    private int currentEXP; 
    private int expBar; 

    public Player(String name) { 
     super(name, 1, 100, 10); 
     this.currentEXP = 0; 
     this.expBar = 50; 
    } 
} 


public class Enemy extends Creature { 

    int exp; 

    public Enemy(String name, int level, int hp, int atk, int exp) { 
     super(name, level, hp, atk); 
     this.exp = exp; 
    } 
} 
+0

Ничего себе, этот ответ пришел быстро! Большое спасибо, я думаю, теперь понимаю, в чем была моя проблема. Сначала мне нужно создать экземпляр объекта моего игрока, который затем я могу передать конструктору класса врага. В этом есть смысл! Спасибо за быстрый ответ. :) – Apocabal

ответ

1

Прежде всего, модификатор private делает level недоступен в подклассах. Чтобы решить эту проблему, вы можете внести изменения private в protected (или ничего/по умолчанию), или вы можете предоставить доступный метод получения (int getLevel() { return level; }).

Enemy Ваш конструктор принимает level аргумент, поэтому для реализации функции player level + 1, вы можете просто передать player.getLevel() + 1, в качестве альтернативы передать player.getLevel() и пусть конструктор заботиться о добавлении 1.

метод с использованием этих классов (предполагая, что main на данный момент) будет выглядеть примерно так:

public static void main(String[] args) { 
    Player p = new Player("Player1"); 
    Enemy e = new Enemy("Enemy1", p.getLevel() + 1, 100, 10, 40); 
} 

Чтобы уточнить, причину, почему Player.getLevel + 1 не работает потому, что Player является классом, но вам нужно a Playerобъект (т. результат вызова new Player(...)), чтобы обратиться к полям или методам экземпляра, таким как getLevel.

+0

Извините, только что заметили, что вы сказали, что «оставили геттеры и сеттеры для лучшей удобочитаемости». Я думаю, вы можете проигнорировать первую часть. –

+0

Благодарим вас за разъяснения, которые сделали многое еще более ясным. Имейте славный день! – Apocabal