2013-12-15 3 views
2

Я (в основном) программист с самообучением с одним классом java под моим поясом, поэтому я все еще очень новичок в этом, и я пытаюсь сделать свой первый реальный приложение с нуля.Java - Создание карточной игры, вопросы по классам

В принципе, я делаю версию игры с карточной игрой, которую я владею (только для меня! Не продавать или что-то еще!), И в этой карточной игре вы в основном используете стартовые карты, чтобы «купить» больше карт с список карт, взятых из основной колоды. Эти карты имеют несколько значений, связанных с ними, которые хорошо переводили бы в приложение, такое как «уровень мощности» и «значение точки», и, кроме того, каждая из этих карт делает что-то особенное, когда вы играете в нее, как «нарисовать дополнительную карту» или «уничтожить» карту "или" дать другому игроку отрицательную карточку "- тот тип вещи.

Я уже сделал весь пользовательский интерфейс для игры, и у меня есть (в основном), и теперь я работаю над мясом и картофелем всего этого - кода. Я сделал именная карта класса конструктор, который выглядит следующим образом:

public class Card 
{ 
private int power; 
private int value; 
private String type; 
private String cardName; 
private ImageIcon image; 

    public Card(int power, int value, String type, String cardName, ImageIcon image) 
    { 
     this.power = power; 
     this.value = value; 
     this.type = type; 
     this.cardName = cardName; 
     this.image = image; 
    } 
... 
} 

С эллипсов, представляющих все мои методы геттер/сеттер.

Таким образом, вы можете видеть, что мой класс карты будет присваивает все необходимые им значения, но один - специальный «вещь», что каждый из них (рисовать карты/уничтожить card..etc)

Я не знаю, где/как я должен поместить это в свой код. Поскольку у меня есть значение типа, которое будет представлять различные типы карт, которые вы можете нарисовать (оборудование/супермодер/герой/и т. Д.), Я думаю, что я должен сделать отдельный класс для каждого типа карты. Это хорошее кодирование практика?

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

+0

Итак, вы реализуете игру на строительство колоды, да? –

+0

Ха-ха, да, сэр. Это игра на платформе DC, я в нее влюблен и думаю, что правила казались такими жесткими и идеальными для цифровой версии, как мой первый настоящий проект. – lfernandes

+1

[Этот??] (Http://boardgamegeek.com/boardgame/125678/dc-comics-deck-building-game) –

ответ

2

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

Недостатком интерфейса является то, что вы должны повторно реализовать все поля как частные переменные для подкласса.

Аннотация

public abstract class Card { 
    protected int power; 
    protected int value; 
    protected String type; 
    protected String cardName; 
    protected ImageIcon image; 

    // You cannot instantiate this directly, only through children. 
    public Card(int power, int value, String type, String cardName, ImageIcon image) { 
     this.power = power; 
     this.value = value; 
     this.type = type; 
     this.cardName = cardName; 
     this.image = image; 
    } 

    // Getters/Setters... 
} 

public class AttackCard extends Card { 
    public AttackCard(int power, int value, String type, String cardName, ImageIcon image); 
     super(power, value, type, cardName, image); 
    } 
} 

Интерфейс

public interface Card { 
    int getPower(); 
    int getValue(); 
    String getType(); 
    String getCardName(); 
    ImageIcon getImage(); 
} 

public class AttackCard implements Card { 
    private int power; 
    private int value; 
    private String type; 
    private String cardName; 
    private ImageIcon image; 

    public AttackCard(int power, int value, String type, String cardName, ImageIcon image); 
     this.power = power; 
     this.value = value; 
     this.type = type; 
     this.cardName = cardName; 
     this.image = image; 
    } 

    // Implement methods from Card... 
} 

Редактировать

Если вы реализуете й e DC Comics для игры на колоде, тогда вам может понадобиться только 1 абстрактный класс для всех карт и интерфейс для Hero, Villain, Super Power и Starter. Не уверен, что все, что они набирают, ... Тогда все Герои расширили бы класс абстрактных карт для всех общих свойств карточек и реализовали бы методы, специфичные для героя.

Для каждой карточки вам не потребуется отдельный класс. Каждый герой просто был бы героем. У вас будет только коллекция карт Hero.

// Hierarchy 
abstract class Card 
interface Hero 
interface Villain 
class HeroCard extends Card implements Hero 
class VillainCard extends Card implements Villain 

// Example constructors definitions for reference? 
Card(String name, int value, int power); 
HeroCard(String name, int value, int power); 
VillainCard(String name, int value, int power); 

// Create all heroes 
List<Hero> heroes = new ArrayList<Hero>(); 
heroes.add(new HeroCard("Green Arrow", 5, 2)); 

// Create all villains 
List<Villain> villains = new ArrayList<Villains>(); 
villains.add(new VillainCard("Ra's Al Ghul", 8, 3)); 

// All all the heroes and villains to all cards 
List<Card> cards = new ArrayList<Card>(); 
cards.addAll(heroes); 
card.addAll(villains); 
+0

Если я сделал карту интерфейсом, я все равно мог бы сохранить все свои частные переменные и конструкторы правильно? И если да, могу ли я сделать каждую другую карту, используя метод интерфейса карты для «особой вещи» индивидуально в пределах одного класса, или мне нужно будет создать новый класс для каждой карты? – lfernandes

+1

К сожалению, я обновил свой ответ. Реализация должна будет повторно реализовать все переменные, поскольку интерфейсы могут иметь только общедоступные методы и поля, а методы не могут быть блоками. Абстрактный класс предоставляет все поля для всех детей, если они ** защищены **. –

+0

Мне нравится, как выглядит версия интерфейса, но то, о чем я спрашивал раньше, это если я так делаю, не нужно ли мне создавать отдельный класс для каждой карты? Единственная причина, по которой меня беспокоит, - это огромное количество разных карт (около 64 разных карт!) – lfernandes

1

Вы можете использовать inheritance где общий класс будет там functionality общие для всех Card классов, которые вы можете положить туда и после этого в каждом из подклассов Card вы можете поставить конкретные функции класса, а также могут использовать общие функциональные возможности базы class.Also вы можете переопределить методы суперкласса.

http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

public class SuperCardClass { 
........ 

    public void someCommonFunction() { 

    } 

} 

public class SubCardFirstClass extends SuperCardClass { 

    @Override 
    public void someCommonFunction() { 
    //specific to sub class 
    } 

} 
+0

Наследование имеет смысл для разных «типов», но в то же время мне нужно будет реализовать какой-то метод для каждой карты для особого, что они делают. Каждая карта (основанная на героях DC) имеет уникальную вещь, которую только она может сделать, и мне нужно каким-то образом реализовать эту вещь и прикрепить ее к построенной карте. – lfernandes

+0

@lfernandes Вы можете поместить эту функциональность в базовый класс и можете переопределить эту функциональность в каждом подклассе – Deepak

Смежные вопросы