Top Trumps卡的类结构

时间:2016-03-27 10:27:52

标签: java android

我是Java的新手(并且一般的编码技能有限),我正在尝试实施Top Trumps游戏(游戏控制台是主题)。它最终会成为一个Android应用程序,但我想首先使用文本输出来获取机制,看看事情是否有效。

牌组中的每张牌都有五个类别,全部是整数,所有牌都是相同的。我认为这些应该是类中的静态成员。每张卡还有一个布尔值,它定义哪个类别最好(机器人玩家将在机器人转弯时选择它)。我还没有创造这些。

至少可以说,我很难挣扎。到目前为止我所得到的是(这里只有三个类别,但显然可以添加到这些类别中)。

public class Category {
    int stat;
    boolean isBest;

    public Category(int inStat, boolean inIsBest) {
        stat = inStat;
        isBest = inIsBest;
    }
}

public class Card {

    public Card () {
        Category cat1 = new Category(1977, true);
        Category cat2 = new Category(1989, false);
        Category cat3 = new Category(2000, false);
    }
}

这里的问题是我无法将创建的类别绑定到一张卡片中,以便稍后我可以写,比如说:

if (card1.cat1.stat < 1000) ...

有什么建议吗?我已经在网上看了很多,而且在这里和我的脑袋在旋转。

2 个答案:

答案 0 :(得分:1)

由于您总是有五个类别,因此您有两个选择:

<强> 1 即可。要么你把它们中的每一个都具有你的类的属性

public class Card {

    Category yearOfRelease;
    Category ramSize;
    Category cpuSpeed;
    Category nbrOfGames;
    Category geekFactor;

    ...
}

<强> 2 即可。或者你可以将它们放在一个集合中:

public class Card {

    Collection<Category> categories;

    ...
}

我建议你按照第二种方法。

作为一种可能的解决方案,您可以使用Map而不是List,因为它可以让您(稍后使用 bot )直接访问每个你的一个类别。

因此,您可以先创建一个枚举,然后放置您的类别类型:

public enum CategoryType {

    YEAR_OF_RELEASE,
    RAM_SIZE,
    CPU_SPEED,
    NUMBER_GAMES,
    GEEK_FACTOR;

}

Category类的定义可能如下所示:

public class Category {

    // The category type
    private CategoryType categoryType;

    // The category value
    private int value;

    public Category(CategoryType categoryType, int value) {
        this.categoryType = categoryType;
        this.value = value;
    }

    // getters ands setters
}

您的Card课程可以通过以下方式实施:

public class Card {

    // Defines the best category (for later use)
    private CategoryType bestCategoryType;

    // Holds all categories, easily accessible by type
    private Map<CategoryType, Category> categories;

    public Card() {
        categories = new HashMap<>();
        // by default, the year of release will be the best category
        bestCategory = CategoryType.YEAR_OF_RELEASE;
    }

    public void createCategory(CategoryType categoryType, int value, boolean isBest) {
        createCategory(categoryType, value);

        if (isBest) {
            bestCategoryType = categoryType;
        }
    }

    public void createCategory(CategoryType categoryType, int value) {
        Category category = new Category(categoryType, value);
        categories.put(categoryType, category);
    }

    // Attains the best category
    public CategoryType getBestCategoryType() {
        return bestCategoryType;
    }

    // Attains the map of categories
    public Map<CategoryType, Category> getCategories() {
        return categories;
    }
}

最后,下面描述了如何使用它的示例:

public class TopTrumps {

    public static void main(String[] args) {
        // list of cards per user
        List<Card> cards = new ArrayList<>();

        Card card1 = new Card();
        card1.createCategory(CategoryType.YEAR_OF_RELEASE, 1995);
        card1.createCategory(CategoryType.RAM_SIZE, 128);
        card1.createCategory(CategoryType.CPU_SPEED, 300);
        card1.createCategory(CategoryType.NUMBER_GAMES, 1000);
        // for card #1, the geek factor will be the best category
        card1.createCategory(CategoryType.GEEK_FACTOR, 7, true);

        // for card #2, since the best category, by default, is the year of
        // release, we'll leave it as it is
        Card card2 = new Card();
        card2.createCategory(CategoryType.YEAR_OF_RELEASE, 2005);
        card2.createCategory(CategoryType.RAM_SIZE, 256);
        card2.createCategory(CategoryType.CPU_SPEED, 500);
        card2.createCategory(CategoryType.NUMBER_GAMES, 750);
        card2.createCategory(CategoryType.GEEK_FACTOR, 4);

        // we'll add each card to our list
        cards.add(card1);
        cards.add(card2);

        // then, in order to access each category, one could do the following
        for (Card card : cards) {
            // retrieve the best category
            Category bestCategory = card.getCategories().get(card.getBestCategoryType());

            System.out.println("Best category: " + bestCategory.getCategoryType() + "=" + bestCategory.getValue());

            System.out.println("Card categories: ");

            // retrieve each card's category value
            for (Category category : card.getCategories().values()) {
                System.out.println(category.getCategoryType() + "=" + category.getValue());
            }
        }
    }
} 

答案 1 :(得分:0)

我不知道这场比赛是什么,但是我认为这是一个明智的课堂设计:

您需要将成员添加到Card ArrayList类别 然后,您可以使用addCategory()类中的Card方法填充它们:

public class Card {
    private ArrayList<Category> categories = null;

    public Card () {
        //initialize categories arraylist
        categories = new ArrayList<Category>();
    }

    public void addCategory(int stat, boolean isBest){
        categories.add(new Category(stat, isBest));
    }

    //use this method to get category at any index (0 - n) to compare with other categories
    public Category getCategory(int index){
        return categories.get(index);
    }
}

用法示例:

Card card1 = new Card();
card.addCategory(1977,true);
card.addCategory(1921,false);