2013-12-15 46 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; 
    } 
... 
} 

与代表我所有的getter/setter方法省略号。

所以你可以看到我的卡类将所有分配给他们必要的值只有一个 - 特殊的“东西”他们每个人都(划卡/销毁card..etc)

我不知道我应该把它放在我的代码中。由于我有一个类型值,它将代表你可以绘制的不同类型的牌(装备/超级能量/英雄等等)。我想我应该为每种牌类别制作一个单独的类别..这是一个很好的编码实践?因此,为了总结这篇非常冗长的文章,总结 - 我应该将所有不同的卡片“类型”分成不同的类别,我应该如何实现每张卡片所特有的“事物”?我觉得它会被包装在一个方法中,但据我所知,我不能让方法成为构造函数的一部分,对吗?

+0

所以你正在实施一个甲板建设游戏,是吧? –

+0

哈哈是先生。这是DC甲板建设游戏,我爱上了它,并认为规则似乎对我的第一个真正的项目来说是如此僵化和完美的数字版本。 – lfernandes

+1

[This one?](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漫画甲板游戏,那么你可能只需要为所有卡片提供1个抽象类,并为Hero,Villain,Super Power和Starter提供一个界面。不知道他们是什么类型的......然后所有的英雄会扩展抽象牌类以获得牌的所有共同属性,并实现特定于英雄的方法。

你不需要为每个卡片单独的类。每个英雄都只是英雄的一个实例。你只需要一个英雄卡集合。

// 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其中普通类将在那里为所有Card类,你可以把有共同的functionality之后,在每个子类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