/* ============================================================ This is the "Kartenstapel" file from Author: Philipp Kotte written on: 05 / 10 / 2023 at: 23:42 ============================================================ */ package Domain; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Random; import Domain.Enums.Kartenfarbe; import Domain.Karten.Karte; import Domain.Karten.Magierkarte; import Domain.Karten.Narrenkarte; import Domain.Karten.Zahlenkarte; import Facade.Spiel; public class Kartenstapel { // Statische Konstanten // Statische Attribute private static int kartenzählen = 1; // Attribute der Objekte /** * Die HashMap besitzt alle Karten in sortierter Reihenfolge Die ArrayList wird * durch Zufall erzeugt und gibt den Key der HashMap wieder. D.h. */ private HashMap kartensortiert = new HashMap<>(); private HashMap kartengemischt = new HashMap<>(); // Konstruktoren public Kartenstapel() { if (Karte.getKartenId() != 60) { // Erstelle Magierkarten for (int i = 1; i <= 4; i++) { kartensortiert.put(i, new Magierkarte()); } // Erstelle Narrenkarten for (int i = 5; i <= 8; i++) { kartensortiert.put(i, new Narrenkarte()); } // Erstelle Charakterkarten MENSCH for (int i = 9; i <= 21; i++) { kartensortiert.put(i, new Zahlenkarte(Kartenfarbe.MENSCH)); } // Erstelle Charakterkarten ELF for (int i = 22; i <= 34; i++) { kartensortiert.put(i, new Zahlenkarte(Kartenfarbe.ELF)); } // Erstelle Charakterkarten RIESE for (int i = 35; i <= 47; i++) { kartensortiert.put(i, new Zahlenkarte(Kartenfarbe.RIESE)); } // Erstelle Charakterkarten ZWERG for (int i = 48; i <= 60; i++) { kartensortiert.put(i, new Zahlenkarte(Kartenfarbe.ZWERG)); } } } // Statische Methoden // Getter und Setter public Karte getKartesortiert(Integer index) { return kartensortiert.get(index); } // Overrides // Public Methoden /** * Die Collection der HashMap 'kartensortiert'. * * @return Die Kartenreferenzen der HashMap. */ public Collection getKartenstapelSortiert() { return kartensortiert.values(); } public Collection getKartenstapelGemischt() { return kartengemischt.values(); } /** * Methode für die Testklasse KartenstapelTest, um die Sortierung Visuell zu * bestätigen. Kann nach Finalem Test und Freigabe gelöscht oder auskommentiert * werden. * * @return 'kg' Eine Namensliste des gemischten Kartenstapel */ public HashMap getStatusGemischt() { HashMap kg = new HashMap<>(); for (int i = 1; i <= 60; i++) { kg.put(i, ((String) kartengemischt.get(i).toString())); } return kg; } /** * Methode mischen(): beinhaltet eine ArrayList 'zahlen' die Zahlenwerte von 1 * bis 60 zur Verfügung stellt. * * @code Mit Random wird ein Zufallsindex gewählt. 'kartensortiert' und * 'kartengemsicht' sind zwei HashMap. 'kartensortiert' beinhaltet alle * Karten in einer initialisierten Reihenfolge. 'kartengemischt' wird * durch die @code Random 'zufall' befüllt. * */ public void mischen() { ArrayList zahlen = new ArrayList<>(); for (int i = 1; i <= 60; i++) { zahlen.add(i); } Random zufall = new Random(); for (int i = 0; i < 60; i++) { int index = zufall.nextInt(zahlen.size()); int schlüsselzahl = zahlen.get(index); kartengemischt.put(i + 1, kartensortiert.get(schlüsselzahl)); zahlen.remove(index); } } /** * Methode getObersteKarte(): Hier wird der Reihe nach die jeweils oberste Karte * an den Spieler verteilt, bzw. am Ende des Verteilens der Trumpf gezogen, * falls noch eine Karte auf dem Stapel liegen sollte. Hierzu wird die Runde, * als Ausgangswert genommen. */ public Karte getObersteKarte() { // Todo: Nur für den Trumpf Karte austeilen = null; if (kartengemischt.get(kartenzählen) != null && kartenzählen <= 60) { austeilen = kartengemischt.get(kartenzählen); kartengemischt.remove(kartenzählen); kartenzählen++; } else if (kartenzählen > 60) { throw new RuntimeException("Es können nicht mehr als 60 Karten ausgeteilt werden."); } else { throw new RuntimeException("Es ist ein Fehler in 'Kartenzählen' aufgetaucht."); } return austeilen; } /** * */ // Private Methoden }