Проблемы с векторными списками - PullRequest
0 голосов
/ 16 апреля 2019

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

Не знаю, знаком ли кто-нибудь с игрой Clash Royal? Это игра, основанная на повышении трофеев и сборе карт. И каждая арена открывает новые карты.

Я хочу создать колоду. Где вы можете выбрать 8 карт, и я рассчитываю среднюю стоимость эликсира. Мне нужна функция, которая может отображать все карты, доступные для вашего диапазона трофеев.

Позвольте мне объяснить мою проблему: Я создал Superclass: Card, и классы Troop, Spell, DefBuilding и PassiveBuilding распространяются на этот суперкласс. После этого я создал класс: CardPool, в котором я определил все объекты для всех «классов карт».

Затем я создал Class: Arena, и в основном я объявил все арены. То, с чем я борюсь, это то, что я не знаю, как я помещаю все несколько карт в вектор соответствующей Арены. Что-то вроде карты 1-2-3 должно входить в вектор Арены 1, а карты 4-5-6 - в вектор Арены 2. Только у меня есть 4 разных класса, все из которых являются картами.

Итак, актуальный вопрос таков: Как я могу составить список векторов Арены 1 (или 2,3,4) и поместить 2 войска, 1 заклинание, 1 defBuilding в этот список векторов? И, в конце концов, сможете отображать их.

Последним, что я попробовал, было приведение класса, как вы можете видеть в моем классе CardPool. Это не сработало.

примечание: я сделал свой Class CardPool интерфейсом просто для того, чтобы попробовать что-то, слышал что-то об этом в школе.

Суперкласс: Карта

public class Card {
    private String name;
    private int elixer;

    public Card(String name, int elixer) {
        this.name = name;
        this.elixer = elixer;
    }
}

Класс: Отряд (только с Отрядом остальные классы одинаковы)

public class Troop extends Card {

    private int dammage;
    private int dammagePerSecond;
    private int hitpoints;
    private double range;
    private double hitSpeed;
    private String speed;
    private int deathDammage;
    private int count;

    public Troop(String name, int elixer, int dammage, int dammagePerSecond, int hitpoints, double range, double hitSpeed, String speed, int deathDammage, int count) {
        super(name, elixer);
        this.dammage = dammage;
        this.dammagePerSecond = dammagePerSecond;
        this.hitpoints = hitpoints;
        this.range = range;
        this.hitSpeed = hitSpeed;
        this.speed = speed;
        this.deathDammage = deathDammage;
        this.count = count;
    }
}

class: CardPoop (теперь интерфейс, я показываю только 2 каждого класса)

public interface CardPool {

    CardPool pekka = (CardPool) new Troop("P.E.K.K.A.", 7, 984, 546, 3458, 0, 1.8, "Slow", 0, 1 );
    CardPool archer = (CardPool) new Troop ("Archer", 3,  89, 74, 252, 5, 1.2, "Medium", 0, 2 );

    CardPool bombTower = (CardPool) new DefensiveBuilding ("Bomb Tower", 4, 184, 115, 1126, 6, 1.6, 35 );
    CardPool cannon = (CardPool) new DefensiveBuilding("Cannon", 3, 127, 158, 742, 5.5, 0.8, 30);

    CardPool barbarianHut = (CardPool) new PassiveBuilding("Barbarian Hut", 7,  1936, 60);
    CardPool elixirCollector = (CardPool) new PassiveBuilding("Elixer Collector", 6, 888, 70);

    CardPool arrow = (CardPool) new Spell("Arrows", 3, 243, 86, 4);
    CardPool goblinBarrel = (CardPool) new Spell ("Goblin Barrel", 3, 300, 900, 1.5);

класс: Арена

import java.util.ArrayList;

public class Arena {
    private String name;
    private int minTrophies;
    private int maxTrophies;

    private ArrayList<CardPool> cardList = new ArrayList<>();

    public ArrayList<CardPool> getCardList() {return cardList;}

    public Arena(String name, int minTrophies, int maxTrophies) {
        this.name = name;
        this.minTrophies = minTrophies;
        this.maxTrophies = maxTrophies;
    }
}

класс: Main (только показывает первую арену полностью)

public class Main {

    public static void main(String[] args) {

        Arena trainingCamp = new Arena("Training Camp", 0, 0);

        trainingCamp.getCardList().add(CardPool.arrow);
        trainingCamp.getCardList().add(CardPool.minions);
        trainingCamp.getCardList().add(CardPool.archer);
        trainingCamp.getCardList().add(CardPool.knight);
        trainingCamp.getCardList().add(CardPool.fireBall);
        trainingCamp.getCardList().add(CardPool.miniPekka);
        trainingCamp.getCardList().add(CardPool.musketeer);
        trainingCamp.getCardList().add(CardPool.giant);
        trainingCamp.getCardList().add(CardPool.wallBreakers);
        trainingCamp.getCardList().add(CardPool.prince);
        trainingCamp.getCardList().add(CardPool.babyDragon);
        trainingCamp.getCardList().add(CardPool.skeletonArmy);

Так что теперь я получаю сообщение об ошибке, что я не могу разыграть Cardpool.

Что мне делать?

Надеюсь, некоторые из вас могут мне помочь.

Thx, Pex

Ответы [ 2 ]

1 голос
/ 16 апреля 2019

Ваша проблема, вероятно, появляется, потому что карты не должны быть типа CardPool.

Возьмите, например, 'PEKKA'.Это отряд, который является дочерним классом Card и не имеет ничего общего с CardPool (поэтому приведение к CardPool - это чушь).В результате ваш CardPool может быть базовым классом с предопределенными общедоступными статически доступными объектами Card для всех различных карт.

Тогда для каждой арены вы можете просто иметь ArrayList, который будет действовать как ваш cardList.как у вас сейчас.

Как еще одно предложение, добавление метода 'addCard (Card c)' в Arena было бы для вас лучше, чем необходимость каждый раз вызывать 'getCardList (). add ()'.

0 голосов
/ 16 апреля 2019

Вы кастуете на CardPool, а не Card. Вам нужно будет сделать Card орудия CardPool

public class Card implements CardPool

или Troop само

public class Troop extends Card implements CardPool

чтобы иметь возможность привести его к CardPool.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...