From d4c3e1b0fdb25d9a48d5ddd007a8c443c3bb04a9 Mon Sep 17 00:00:00 2001 From: dustineversmann Date: Tue, 26 Mar 2024 10:03:41 +0100 Subject: [PATCH] feat(Blackjack): umwandeln in neues Projekt --- .idea/.gitignore | 8 ++ .idea/BlackJack.iml | 9 ++ .idea/misc.xml | 6 ++ .idea/modules.xml | 8 ++ .idea/vcs.xml | 12 +++ .../java/de/deversmann/BlackJackSpiel.java | 48 ++++++++++ src/main/java/de/deversmann/BlackJackUI.java | 59 +++++++++++++ src/main/java/de/deversmann/Karte.java | 23 +++++ src/main/java/de/deversmann/Kartenstapel.java | 32 +++++++ src/test/java/BlackJackSpielTest.java | 87 +++++++++++++++++++ src/test/java/KarteTest.java | 46 ++++++++++ src/test/java/KartenstapelTest.java | 33 +++++++ 12 files changed, 371 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/BlackJack.iml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 src/main/java/de/deversmann/BlackJackSpiel.java create mode 100644 src/main/java/de/deversmann/BlackJackUI.java create mode 100644 src/main/java/de/deversmann/Karte.java create mode 100644 src/main/java/de/deversmann/Kartenstapel.java create mode 100644 src/test/java/BlackJackSpielTest.java create mode 100644 src/test/java/KarteTest.java create mode 100644 src/test/java/KartenstapelTest.java diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/BlackJack.iml b/.idea/BlackJack.iml new file mode 100644 index 0000000..d6ebd48 --- /dev/null +++ b/.idea/BlackJack.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..6f29fee --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..748b502 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..7ddfc9e --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/de/deversmann/BlackJackSpiel.java b/src/main/java/de/deversmann/BlackJackSpiel.java new file mode 100644 index 0000000..fbc47cf --- /dev/null +++ b/src/main/java/de/deversmann/BlackJackSpiel.java @@ -0,0 +1,48 @@ +package de.deversmann; + +import java.util.ArrayList; +import java.util.List; + +public class BlackJackSpiel { + private final Kartenstapel stapel; + private final List hand; + + public BlackJackSpiel(Kartenstapel stapel) { + this.stapel = stapel; // Verwendet den übergebenen Kartenstapel + hand = new ArrayList<>(); + // Zieht die ersten zwei Karten für die Hand des Spielers + hand.add(stapel.zieheKarte()); + hand.add(stapel.zieheKarte()); + } + + + public void zieheWeitereKarte() { + if (getPunkte() < 21) { + hand.add(stapel.zieheKarte()); + } + } + + public int getPunkte() { + int punkte = 0; + int assAnzahl = 0; + + for (Karte karte : hand) { + punkte += karte.getPunkte(); + if ("Ass".equals(karte.wert())) { + assAnzahl++; + } + } + + while (punkte > 21 && assAnzahl > 0) { + punkte -= 10; // Ass von 11 auf 1 Punkt reduzieren + assAnzahl--; + } + + return punkte; + } + + public List getHand() { + return hand; + } +} + diff --git a/src/main/java/de/deversmann/BlackJackUI.java b/src/main/java/de/deversmann/BlackJackUI.java new file mode 100644 index 0000000..36fcb86 --- /dev/null +++ b/src/main/java/de/deversmann/BlackJackUI.java @@ -0,0 +1,59 @@ +package de.deversmann; + +import java.util.Scanner; + +public class BlackJackUI { + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + // Initialisiert den Kartenstapel einmal für alle Spiele + Kartenstapel stapel = new Kartenstapel(); + + while (true) { + // Prüft, ob genügend Karten für ein neues Spiel vorhanden sind + if (stapel.getVerbleibendeKarten() < 4) { // Geht davon aus, dass mindestens 4 Karten für ein Spiel benötigt werden + System.out.println("Nicht genügend Karten im Stapel für ein weiteres Spiel. Spiel beendet."); + break; + } + + BlackJackSpiel spiel = new BlackJackSpiel(stapel); // Verwendet den existierenden Stapel für das neue Spiel + System.out.println("Neues Spiel gestartet. Viel Glück!"); + + while (true) { + System.out.println("Aktuelle Hand: " + spiel.getHand() + ". Aktuelle Punkte: " + spiel.getPunkte()); + + if (spiel.getPunkte() >= 21) { + break; + } + + System.out.print("Möchten Sie eine weitere Karte ziehen? (j/n): "); + String eingabe = scanner.nextLine(); + + if ("j".equalsIgnoreCase(eingabe)) { + spiel.zieheWeitereKarte(); + } else if ("n".equalsIgnoreCase(eingabe)) { + break; + } else { + System.out.println("Ungültige Eingabe. Bitte antworten Sie mit 'j' für ja oder 'n' für nein."); + } + } + + System.out.println("Spielende. Ihre finale Hand: " + spiel.getHand() + ". Ihre Punkte: " + spiel.getPunkte()); + if (spiel.getPunkte() > 21) { + System.out.println("Sie haben verloren. Mehr als 21 Punkte."); + } else if (spiel.getPunkte() == 21) { + System.out.println("Glückwunsch, Blackjack!"); + } else { + System.out.println("Spiel beendet. Vielen Dank fürs Spielen."); + } + + System.out.print("Möchten Sie noch eine Runde spielen? (j/n): "); + String erneutSpielen = scanner.nextLine(); + if (!"j".equalsIgnoreCase(erneutSpielen)) { + break; // Beendet die Schleife und das Programm + } + } + + System.out.println("Danke fürs Spielen. Auf Wiedersehen!"); + scanner.close(); + } +} diff --git a/src/main/java/de/deversmann/Karte.java b/src/main/java/de/deversmann/Karte.java new file mode 100644 index 0000000..0d63eb5 --- /dev/null +++ b/src/main/java/de/deversmann/Karte.java @@ -0,0 +1,23 @@ +package de.deversmann; + +public record Karte(String farbe, String wert) { + + public int getPunkte() { + switch (wert) { + case "Ass" -> { + return 11; // Standardwert, Anpassung an die Hand erfolgt später + } + case "Bube", "Dame", "König" -> { + return 10; + } + default -> { + return Integer.parseInt(wert); + } + } + } + + @Override + public String toString() { + return wert + " " + farbe; + } +} diff --git a/src/main/java/de/deversmann/Kartenstapel.java b/src/main/java/de/deversmann/Kartenstapel.java new file mode 100644 index 0000000..64c0a56 --- /dev/null +++ b/src/main/java/de/deversmann/Kartenstapel.java @@ -0,0 +1,32 @@ +package de.deversmann; + +import java.util.Collections; +import java.util.Stack; + +public class Kartenstapel { + private final Stack stapel; + + public Kartenstapel() { + stapel = new Stack<>(); + String[] farben = {"Kreuz", "Pik", "Herz", "Karo"}; + String[] werte = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "Bube", "Dame", "König", "Ass"}; + + for (String farbe : farben) { + for (String wert : werte) { + stapel.push(new Karte(farbe, wert)); + } + } + + Collections.shuffle(stapel); + } + + public Karte zieheKarte() { + if (stapel.isEmpty()) { + throw new RuntimeException("Alle Karten wurden bereits gezogen."); + } + return stapel.pop(); + } + public int getVerbleibendeKarten() { + return stapel.size(); + } +} diff --git a/src/test/java/BlackJackSpielTest.java b/src/test/java/BlackJackSpielTest.java new file mode 100644 index 0000000..0ae09dc --- /dev/null +++ b/src/test/java/BlackJackSpielTest.java @@ -0,0 +1,87 @@ +import de.deversmann.BlackJackSpiel; +import de.deversmann.Karte; +import de.deversmann.Kartenstapel; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.when; + +class BlackJackSpielTest { + + @Mock + private Kartenstapel mockStapel; + + @BeforeEach + void setUp() { + MockitoAnnotations.openMocks(this); + } + + @Test + void testGetHandGibtKorrekteHandZurueck() { + // Konfigurieren des Mocks, um spezifische Karten zurückzugeben + when(mockStapel.zieheKarte()) + .thenReturn(new Karte("Herz", "10")) + .thenReturn(new Karte("Karo", "Ass")); + + // Initialisieren des Spiels mit dem gemockten Kartenstapel + BlackJackSpiel spiel = new BlackJackSpiel(mockStapel); + + // Überprüfen, ob die Hand des Spielers die erwarteten Karten enthält + assertEquals(2, spiel.getHand().size()); + assertEquals("Herz", spiel.getHand().get(0).farbe()); + assertEquals("10", spiel.getHand().get(0).wert()); + assertEquals("Karo", spiel.getHand().get(1).farbe()); + assertEquals("Ass", spiel.getHand().get(1).wert()); + } + @Test + void testGetHandGibtKorrekteHandMit3KartenZurueck() { + // Konfigurieren des Mocks, um spezifische Karten zurückzugeben + when(mockStapel.zieheKarte()) + .thenReturn(new Karte("Herz", "9")) + .thenReturn(new Karte("Karo", "Ass")) + .thenReturn(new Karte("Pik", "Ass")); + + // Initialisieren des Spiels mit dem gemockten Kartenstapel + BlackJackSpiel spiel = new BlackJackSpiel(mockStapel); + spiel.zieheWeitereKarte(); + + // Überprüfen, ob die Hand des Spielers die erwarteten Karten enthält + assertEquals(3, spiel.getHand().size()); + assertEquals("Herz", spiel.getHand().get(0).farbe()); + assertEquals("9", spiel.getHand().get(0).wert()); + assertEquals("Karo", spiel.getHand().get(1).farbe()); + assertEquals("Ass", spiel.getHand().get(1).wert()); + assertEquals("Pik", spiel.getHand().get(2).farbe()); + assertEquals("Ass", spiel.getHand().get(2).wert()); + assertEquals(21, spiel.getPunkte()); + } + + @Test + void testBlackjackMitZweiKarten() { + when(mockStapel.zieheKarte()).thenReturn(new Karte("Herz", "Ass"), new Karte("Pik", "König")); + BlackJackSpiel spiel = new BlackJackSpiel(mockStapel); + assertEquals(21, spiel.getPunkte()); + } + + @Test + void testUeber21MitMehrerenKarten() { + when(mockStapel.zieheKarte()) + .thenReturn(new Karte("Herz", "10"), new Karte("Pik", "8"), new Karte("Karo", "4")); + BlackJackSpiel spiel = new BlackJackSpiel(mockStapel); + spiel.zieheWeitereKarte(); // Zieht die dritte Karte + assertTrue(spiel.getPunkte() > 21); + } + + @Test + void testAssWertAnpassung() { + when(mockStapel.zieheKarte()) + .thenReturn(new Karte("Herz", "Ass"), new Karte("Pik", "9"), new Karte("Karo", "Ass")); + BlackJackSpiel spiel = new BlackJackSpiel(mockStapel); + spiel.zieheWeitereKarte(); // Zieht die dritte Karte + assertEquals(21, spiel.getPunkte()); + } +} diff --git a/src/test/java/KarteTest.java b/src/test/java/KarteTest.java new file mode 100644 index 0000000..8dbf148 --- /dev/null +++ b/src/test/java/KarteTest.java @@ -0,0 +1,46 @@ +import de.deversmann.Karte; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class KarteTest { + + @Test + void karteErstellenUndWertePruefen() { + Karte karte = new Karte("Herz", "10"); + assertEquals("Herz", karte.farbe()); + assertEquals("10", karte.wert()); + } + + @Test + void punkteFuerZahlenkarten() { + Karte zwei = new Karte("Karo", "2"); + assertEquals(2, zwei.getPunkte()); + + Karte zehn = new Karte("Pik", "10"); + assertEquals(10, zehn.getPunkte()); + } + + @Test + void punkteFuerBildkarten() { + Karte bube = new Karte("Kreuz", "Bube"); + assertEquals(10, bube.getPunkte()); + + Karte dame = new Karte("Herz", "Dame"); + assertEquals(10, dame.getPunkte()); + } + + @Test + void punkteFuerAss() { + Karte ass = new Karte("Pik", "Ass"); + assertEquals(11, ass.getPunkte()); + } + + @Test + public void testToString() { + Karte karte = new Karte("Herz", "Ass"); + + String erwarteterString = "Ass Herz"; + assertEquals(erwarteterString, karte.toString()); + } +} diff --git a/src/test/java/KartenstapelTest.java b/src/test/java/KartenstapelTest.java new file mode 100644 index 0000000..0ac5e43 --- /dev/null +++ b/src/test/java/KartenstapelTest.java @@ -0,0 +1,33 @@ +import de.deversmann.Karte; +import de.deversmann.Kartenstapel; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class KartenstapelTest { + + @Test + void stapelErstellenUndKarteZiehen() { + Kartenstapel stapel = new Kartenstapel(); + Karte karte = stapel.zieheKarte(); + assertNotNull(karte); // Einfacher Test, um sicherzustellen, dass eine Karte gezogen wird + } + + @Test + void alleKartenZiehen() { + Kartenstapel stapel = new Kartenstapel(); + for (int i = 0; i < 52; i++) { // Zieht alle 52 Karten + assertNotNull(stapel.zieheKarte()); + } + + // Versucht, eine 53. Karte zu ziehen, was eine RuntimeException auslösen sollte + assertThrows(RuntimeException.class, stapel::zieheKarte); + } + + @Test + void verbleibendeKarten() { + Kartenstapel stapel = new Kartenstapel(); + stapel.zieheKarte(); // Zieht eine Karte + assertEquals(51, stapel.getVerbleibendeKarten()); // Erwartet 51 verbleibende Karten + } +}