2016-03-27 8 views
0

Ich bin neu in Java (und habe nur begrenzte Programmierkenntnisse) und versuche ein Top-Trumps-Spiel zu implementieren (Spielkonsolen ist das Thema). Am Ende wird es eine Android-App sein, aber ich möchte zuerst die Mechanik an Ort und Stelle bringen, mit Textausgabe, um zu sehen, dass die Dinge funktionieren.Klassenstruktur für Top Trumps Karte

Jede Karte im Stapel hat fünf Kategorien, alle Ganzzahlen und alle Karten dieselbe. Ich denke, das sollten statische Mitglieder in einer Klasse sein. Jede Karte hat auch einen booleschen Wert, der definiert, welche Kategorie am besten ist (der Bot-Spieler wählt dies, wenn der Bot an der Reihe ist). Ich habe diese noch nicht erstellt.

Ich kämpfe, um es gelinde auszudrücken. Was ich bisher habe, ist unten (nur drei Kategorien hier, aber offensichtlich können diese hinzugefügt werden).

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); 
    } 
} 

Die hier Problem ist, dass ich keine Möglichkeit, binden die erstellten Kategorien in einer Karte haben, so dass später kann ich sagen, schreiben:

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

Jede Beratung? Ich habe ausgiebig online und hier geschaut und mein Kopf dreht sich.

+0

Sie sollten in unserem 'Card' Klasse eine Liste der Kategorien haben:' Liste categoryList'. – aribeiro

+0

Danke. Könntest du das weiter erläutern? Liste ist ein neues Konzept für mich. – Jason

+0

Im Grunde sehen Sie eine Liste als Tasche, wo Sie Elemente eines Typs speichern können. Bevor Sie fortfahren, schlage ich vor, dass Sie sich die [Dokumentation] (https://docs.oracle.com/javase/7/docs/api/java/util/List.html) ansehen, um ihre Vorteile zu verstehen . Werfen Sie auch einen Blick auf [ArrayList] (https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html), das eine der Implementierungen von List ist und vielleicht am besten geeignet ist für dich. – aribeiro

Antwort

0

Ich weiß nicht, was dieses Spiel ist, aber Klasse Design weise schlage ich dies:

Sie ein Mitglied Card hinzufügen müssen, welche ArrayList der Kategorien ist dann können Sie sie mit addCategory() Methode in Card füllen Klasse:

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); 
    } 
} 

Verwendungsbeispiel:

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

Da Sie immer fünf Kategorien haben, haben Sie hier zwei Möglichkeiten:

. Entweder Sie legen jedes von ihnen Attribute der Klasse hat

public class Card { 

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

    ... 
} 

. Oder Sie könnten sie in einer Sammlung haben:

public class Card { 

    Collection<Category> categories; 

    ... 
} 

Ich würde Ihnen raten, den zweiten Ansatz zu folgen.

Als eine mögliche Lösung, könnten Sie eine Map anstelle eines List verwenden, weil es Ihnen erlauben würde, später mit Ihrem bot, direkt jede Ihrer Kategorien zugreifen.

So konnten Sie durch die Schaffung einer Aufzählung beginnen, wo Sie Ihre Kategorietypen setzen würde:

public enum CategoryType { 

    YEAR_OF_RELEASE, 
    RAM_SIZE, 
    CPU_SPEED, 
    NUMBER_GAMES, 
    GEEK_FACTOR; 

} 

Die Definition Ihrer Category Klasse wie folgt aussehen könnte:

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 
} 

Ihre Card Klasse könnte auf folgende Weise implementiert werden:

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; 
    } 
} 

Schließlich zeigt die folgenden ein Beispiel, wie Sie es verwenden könnte:

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()); 
      } 
     } 
    } 
}