Kartenspiel

Miguel22

Mitglied
Hallo habe folgendes Problem und wollte fragen ob mir jemand helfen kann.




Java:
package cardgame;

public class Card {
    private final CardValue value;
    private final CardColor color;

    public Card(CardColor color, CardValue value) {
        this.color = color;
        this.value = value;
    }

    @Override
    public String toString() {
        return this.value.name() + " of " + this.color.name();
    }

    @Override
    public boolean equals(Object other) {
        Card otherCard = (Card) other;
        return value == otherCard.value && color == otherCard.color;
    }
}


-----
    
package cardgame;

public enum CardColor {
    HEARTS, DIAMONDS, SPADES, CLOVER
}

-----

package cardgame;

public enum CardValue {
    
    SEVEN(7), EIGHT(8), NINE(9), TEN(10), JACK(10), DAME(10), KING(10), AS(11);
    
    private int value;
    
    CardValue(int value){
        this.value =  value;
    }
    
    public int getCardValue() {
        return value;
    }
    
    
    
}

------
    
package cardgame;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class Stack {
    final static private int STACK_SIZE = 32;

    /**
     * The actual stack of cards.
     */
    Card[] cards;

    /**
     * The topmost card of this stack.
     */
    int top;

    /**
     * Generates the stack of cards recursively.
     *
     * The generated stack consists of an ordered set of {@link #STACK_SIZE} cards,
     * i.e. every possible combination of {@link cardgame.CardColor} and {@link cardgame.CardValue}.
     *
     * TODO: implement me
     * @param color
     * @param value
     */
    private void generateCards(int color, int value) {
        // anchor
        if (top == Stack.STACK_SIZE)
            return;

        // ...

        // recursion step
        generateCards(color, value);
    }

    private void generateCardsAndShuffle() {
        generateCards(0, 0);
        shuffle();
    }

    /**
     * Shuffles the stack of cards.
     *
     * TODO: implement me. Helpful: {@link Collections} and {@link Arrays}
     */
    public void shuffle() {
    }

    /**
     * Get the amount of cards remaining in this stack.
     *
     * @return {@link #top}
     */
    public int size() {
        return top;
    }

    /**
     * Get the topmost card from this stack.
     *
     * TODO: implement me
     * @return
     */
    public Card reveal() {
        return null;
    }
}
 
Zuletzt bearbeitet:

Miguel22

Mitglied
Ja genau vor einer Aufgabe, ich weiss nicht genau, wie ich da vorgehen soll.
Also bsp die Karten generieren. 32 Karten gibt es, aber wie gehe ich es an?
 
K

kneitzel

Gast
Dann beschreibe doch einfach in Worten, wie Du alle Karten bekommen kannst...

Angenommen du müsstest uns jetzt alle Karten im Kartenspiel nennen: Könntest Du das? Wie gehst Du vor, um alle Karten zu nennen und keine zu vergessen?
 

MoxxiManagarm

Top Contributor
Also bsp die Karten generieren. 32 Karten gibt es, aber wie gehe ich es an?

Jetzt wirst du schon genauer, danke dafür, und danke für das Editieren mit den Code Tags.

Ich würde nicht mit dem Generieren anfangen, ich sehe du musst 3 Methoden vervollständigen.
- reveal
- shuffle
- generateCards

reveal ist absolut einfach, du musst nur die richtige Karte aus dem Array holen und zurückgeben. Es kommt jedoch nicht klar raus, ob reveal ggf. gleichzusetzen ist mit Karte vom Stapel nehmen. Möglicherweise musst du den Index von top noch verändern.

Für shuffle kannst du dir unzählige Beispiele aus dem Netz ergooglen. Versuchs doch z.B. so:

generateCards ist vermutlich am "anspruchvollsten". Die Aufgabe sieht vor rekursiv vorzugehen.
Den Einstiegspunkt der Rekursion hast du schon. Das ist in deinem oberen Code die Zeile 98. Der Einstiegspunkt beginnt bei 0, 0.
Deine Karten-Attribute sind Enum-Werte. Ein Enum hat mit der Methode Enum::values die Möglichkeit ein Array der Enum Werte zu erhalten. Auf dieses Array kannst du mit 0 (anfänglich) als Index zugreifen. Mit jedem Rekursionsschritt veränderst du einen der beiden Indexe.
 
Zuletzt bearbeitet:

Miguel22

Mitglied
ja komme da alleine nicht drauf wie man jetzt den Kartenstapel erzeugt.
man muss die Enums Verbinden und dann wohl am besten in ein Array einlesen und irgendwie überprüfen, dass es keine doppelten Karten gibt, aber ja ich komme da nicht weiter.
 

MoxxiManagarm

Top Contributor
und irgendwie überprüfen, dass es keine doppelten Karten gibt
Ne, das musst du nicht direkt.

ja komme da alleine nicht drauf wie man jetzt den Kartenstapel erzeugt.

Eine Rekursion ist eine Vorgang, bei dem sich eine Methode selbst wieder aufruft. Dabei gilt das Teile und herrsche Prinzip. Du musst von deinem Problem ein direkt lösbares Problem absplitten. Das klingt erstmal kryptisch, ist es aber nicht. Dein gesamtes Problem heißt: erzeuge und speichere 32 Karten. Das direkt lösbare Problem: erzeuge und speichere 1 Karte.

Du willst also erstmal mit der Methode erreichen eine Karte zu erzeugen. Dafür hast mit dem Rekursionsanfang (1. Rekursionsschritt) die Werte 0 und 0. Eine Karte erzeugst du mit dem Konstruktur
Java:
public Card(CardColor color, CardValue value) {
Du willst also erstmal die Werte 0 und 0 auf einen CardColor und einen CardValue Wert mappen. Dafür nutzt du die genannte values Methode von Enums.
Java:
Cardcolor.values()[0] // ist CardColor.HEARTS
Diese mit dem Konstruktor erzeugte Karte speicherst du auf den nächsten Platz im Array. Dieser nächste Platz wird durch den top-Index gegeben. Nach dem Speichern musst du diesen Index also auch erhöhen.
Damit hast du das Teilproblem "erzeuge und speichere 1 Karte" gelöst. Jetzt musst du dir überlegen wie der Aufruf für den nächsten Rekursionsschritt aussieht. Dafür wird sich mindestens ein Wert von 0, 0 ändern. Du musst einen Wert hochzählen (und machmal zurücksetzen). Das wars schon, der Rest ist bereits in deinem Code gegeben.


Side-note:
Ich möchte hier nur loswerden, dass das kein typischer Anwendungsfall für Rekursion ist. Vermutlich würde das jeder iterativ machen. Aus meiner Sicht sollten Rekursionen auch immer pure sein, vielleicht ist die Impureness auch etwas, was dich in diesem Fall indirekt verwirrt. Deine Aufgabe gilt sicherlich wirklich nur dem Übungszweck, ist aber aus meiner Sicht kein Vorzeigebeispiel einer Rekursionsübung.
 
Zuletzt bearbeitet:

Miguel22

Mitglied
ja das Problem ist Umsetzung.
Theoretisch weiss ich ungefähr was ich machen muss nur das wie ist das große Problem.
Ich habe 4 versch. Farben und 8 verschiedene Kartenwerte die ich miteinander verbinden muss.
 
K

kneitzel

Gast
Dann schreib doch einfach mal alle Kombinationen auf (oder fang an ... kannst ja etwas abkürzen, wenn Du ein Schema hast ... ) Du kannst die Werte etwas sortieren wenn Du magst ... und dann schau doch einmal, ob Du irgend eine Regel aufstellen kannst, um die Karten zu nennen ...

Wichtig ist: Du musst nicht ungefähr wissen, was du machen musst. Du musst es genau wissen. Aber das ist doch nicht so komplex. Spielt ihr nie Karten? Nie ein Kartenspiel gehabt, wo eine Karte gefehlt hat und ihr wissen wolltet, welche Karte fehlt?

Aber zur Not: Rein Mathematisch: Du hast zwei Mengen -> Wie kannst Du alle möglichen Kombinationen generieren lassen von zwei Elementen von denen eines jeweils aus einer Menge kommt und deren Reihenfolge im 2er-Tupel immer gleich ist - also keine Unterscheidung in Herz 7 und 7 Herz.... Falls es auch Probleme mit Mathe gibt:
 

MoxxiManagarm

Top Contributor
Du hast die Verbindung doch durch die 2 Int Werte gegeben. Einer davon hat die Range 0123 (color) und der andere 01234567 (value) du hast jeweils eine Kombination in einem methodenaufruf. Der nächste rekursionsaufruf ist schlicht (color,value+1) ausnahme: value ist größer 7, dann wird der Wert wieder 0 und du erhöhst color
 
K

kneitzel

Gast
Das Video ist allerdings in meinen Augen stark verbesserungswürdig :)
Ich habe es mir nicht einmal richtig angesehen. Auf einem Terminal Server ohne Ton gestartet und dann nur kurz im Video gesprungen und geschaut, ob das, was er da macht, wirklich das ist, was ich suchte ....

Und die wichtigen Fachbegriffe sind damit ja gefallen - da kann problemlos einiges mehr gefunden werden. Irgend eines der vielen Videos wird da bestimmt es verständlich genug darstellen...
 

temi

Top Contributor
ja das Problem ist Umsetzung.
Theoretisch weiss ich ungefähr was ich machen muss nur das wie ist das große Problem.
Ich habe 4 versch. Farben und 8 verschiedene Kartenwerte die ich miteinander verbinden muss.
Das Problem ist ja relativ einfach, weil es von jeder Farbe auch jeden Wert gibt. Du fängst also mit der ersten Farbe an und kombinierst der Reihe nach alle Werte. Danach kommt die nächste Farbe. In der nicht-rekursiven Variante sind das ganz einfach zwei ineinander geschachtelte Schleifen.
 

MoxxiManagarm

Top Contributor
Ich habe dir mal ein kleines Beispiel zusammengeschustert. Es ist mit Absicht ein bissl anders als deine Aufgabe, du sollst es ja verstehen und dann adaptiert bei dir anwenden. Ich hoffe das Prinzip wird klar.

Bei diesem Beispiel tanzt jede Frau (Enum 1) mit jedem Mann (Enum 2).

Java:
public class Tanzpartner {
    private enum Frauen {
        Lucy,
        Lena,
        Mia,
        Nele,
        Frida
    }

    private enum Männer {
        Simon,
        Elias,
        Marcel,
        Leon
    }

    public void lassTanzen(int n) {
        if (n >= Frauen.values().length * Männer.values().length) {
            return;
        }

        Frauen frau = Frauen.values()[n % Frauen.values().length];
        Männer mann = Männer.values()[n / Frauen.values().length];

        System.out.printf("Es tanzt: %s und & %s%n", frau.name(), mann.name());

        lassTanzen(n + 1);
    }

    public static void main(String... args) {
        new Tanzpartner().lassTanzen(0);
    }
}

Ausgabe:

Code:
Es tanzt: Lucy und & Simon
Es tanzt: Lena und & Simon
Es tanzt: Mia und & Simon
Es tanzt: Nele und & Simon
Es tanzt: Frida und & Simon
Es tanzt: Lucy und & Elias
Es tanzt: Lena und & Elias
Es tanzt: Mia und & Elias
Es tanzt: Nele und & Elias
Es tanzt: Frida und & Elias
Es tanzt: Lucy und & Marcel
Es tanzt: Lena und & Marcel
Es tanzt: Mia und & Marcel
Es tanzt: Nele und & Marcel
Es tanzt: Frida und & Marcel
Es tanzt: Lucy und & Leon
Es tanzt: Lena und & Leon
Es tanzt: Mia und & Leon
Es tanzt: Nele und & Leon
Es tanzt: Frida und & Leon
 

Ähnliche Java Themen

Neue Themen


Oben