# Einfaches Kartenspiel (Spieler Klasse)



## losi97 (28. Apr 2017)

Hallo zusammen,
ich fange gerade mit Java an und komme von c++.
Für die Uni soll ich ein Programm schreiben, mit dem man Poker spielen kann. (Kenne mich leider auch null aus mit Poker ;D)
Aufgabe:
Kartendeck besteht aus den üblichen 52 Karten...
Verteilen der Karten:

Runde: Jeder Spieler erhält zwei verdeckte Karten.
Runde: Es werden drei Karten offen auf den Tisch gelegt (Flop)
Runde: Es wird eine weitere Karte offen auf den Tisch gelegt (Turn)
Runde: Es folgt die letzte offene Karte (River)
Am Ende werden von den Spielern ihre Karten aufgedeckt
Nach jeder Runde wird gesetzt. (Auf das genaue Setzen soll hier nicht eingegangen werden.) Verteilen Sie nach obigen Regeln die Karten. Die Anzahl der Spieler soll am Anfang abgefragt werden und variabel sein. Geben Sie die Karten so auf dem Bildschirm aus, wie sie nach obigen Regeln aufgedeckt werden. 

So.. ich hab auch schon etwas gemacht. Ich habe eine Klasse: Karte geschrieben und eine Klasse: Deck. Jetzt brauch ich noch eine Klasse für die Spieler und eine für das Spielfeld.

Meine erste Frage: Ist mein Klassenkonzept Sinnvoll oder würdet ihr es anders machen?
zweite Frage: Die Klassen Deck und Karte funktionieren Problemlos. Die Klasse Spieler hat aber mindestens ein Fehler, wo ich dem Spieler Karten zuweisen möchte. Ich finde den Fehler leider nicht.

Für Hilfe wäre ich wirklich sehr Dankbar 

Code:

```
import javax.swing.*;
import java.util.*;

class Spieler {
    private String name;
    private ArrayList<Karte> spielerKarten;

    public void setName(String eingabeName) {
        this.name = eingabeName;
    }
    public String getName() {
        return this.name;
    }
    public void setSpielerKarten(Karte eingabeKarte) {
        spielerKarten.add(eingabeKarte);
    }
    public ArrayList<Karte> getSpielerKarten() {
        return this.spielerKarten;
    }
}

class Karte {
    private String farbe;
    private String wert;

    public Karte(String f,String w){
        this.farbe = f;
        this.wert = w;
    }

    public String getFarbe(){
        return this.farbe;
    }

    public String getWert() {
        return this.wert;
    }

    public String toString() {
        return "[" + this.wert + " : " + this.farbe + "]";
    }
}

class Deck {
    private ArrayList<Karte> kartenDeck;
    private String[] farben ={"Kreuz","Pik","Herz","Karo"};
    private String[] werte ={"Ass","Koenig","Dame","Bube","10","9","8","7","6","5","4","3","2"};

    public Deck() {
        kartenDeck = new ArrayList<Karte>();

        for(int i=0;i<farben.length;i++) {
            for(int j=0;j<werte.length;j++) {
                kartenDeck.add(new Karte(werte[j],farben[i]));
            }
        }
    }
    public void zeigeKartenDeck() {
        for(int i=0;i<kartenDeck.size();i++) {
            System.out.println(kartenDeck.get(i));
        }
    }
    public Karte getKarteFromDeck(int i) {
        return kartenDeck.get(i);
    }

    public void mischen() {
        Collections.shuffle(kartenDeck);
    }
    public int getSizeOf() { return kartenDeck.size(); }

}

public class Main {

    public static void main(String[] args) {

        Deck meinDeck = new Deck();

        meinDeck.mischen();
        meinDeck.zeigeKartenDeck();
        System.out.println("Anzahl der Karten im Deck: " + meinDeck.getSizeOf());
        
        Spieler meinSpieler = new Spieler();
        meinSpieler.setName(JOptionPane.showInputDialog("Name: "));
        meinSpieler.setSpielerKarten(meinDeck.getKarteFromDeck(1));
        meinSpieler.setSpielerKarten(meinDeck.getKarteFromDeck(2));
        System.out.println(meinSpieler.getName() + " : " + meinSpieler.getSpielerKarten());

    }
}
```


----------



## JStein52 (28. Apr 2017)

losi97 hat gesagt.:


> Die Klasse Spieler hat aber mindestens ein Fehler, wo ich dem Spieler Karten zuweisen möchte.


Und wieso vermutest du das ? Was passiert ?


----------



## losi97 (28. Apr 2017)

Den Namen kann ich noch eingaben aber die Konsolen Ausgabe endet mit:
Exception in thread "main" java.lang.NullPointerException
    at com.company.Spieler.setSpielerKarten(Main.java:16)
    at com.company.Main.main(Main.java:87)

Process finished with exit code 1


----------



## fhoffmann (28. Apr 2017)

spielerKarten ist nicht initalisiert (so wie du es im Konstruktor von Deck machst)


----------



## JStein52 (28. Apr 2017)

losi97 hat gesagt.:


> at com.company.Spieler.setSpielerKarten(Main.java:16)


Und welche Zeile ist das ?


----------



## losi97 (28. Apr 2017)

Danke hat geklappt. Java ist diesbezüglich wohl etwas strenger als c++ .


----------



## JStein52 (28. Apr 2017)

losi97 hat gesagt.:


> ist diesbezüglich wohl etwas strenger als c++


Um nicht zu sagen gnadenlos. Wobei du ja auch in C++ Objekte erst anlegen musst bevor du sie verwenden kannst.


----------



## losi97 (28. Apr 2017)

OK ich habe noch ein Problem.
Mein Plan ist es eine Klasse Spielfeld zu erstellen, die die Spieler beinhaltet und die aufgedeckten Karten.
Der Konstrukte soll beim Aufruf ein neues Deck wie oben gezeigt erstellen. Dieses ist dann das Spieldeck.
Jetzt das Problem: Wenn ich ein Spieler dem Spielfeld hinzufügen will erstelle ich ein Spieler Objekt und dessen Konstruktor weißt diesem Spieler zwei karten aus dem Deck zu (und löscht diese dann auch). Dafür muss ich ein Deck übergeben.
Kann man überhaupt Objekte innerhalb eines Konstrukteurs erstellen?
Code: Problematische Stelle: Spieler meinSpieler = new Spieler(meinDeck); (meinDeck wird nicht erkannt)

```
class Spieler {
    private String name;
    private ArrayList<Karte> spielerKarten;

    public Spieler(Deck eingabeDeck){
        spielerKarten = new ArrayList<Karte>();
        for (int i=0;i<2;i++) {
            spielerKarten.add(eingabeDeck.getKarteFromDeck(eingabeDeck.getSizeOf()-1));
            eingabeDeck.getKartenDeck().remove(eingabeDeck.getSizeOf()-1);
        }
    }
    public void setName(String eingabeName) {
        this.name = eingabeName;
    }
    public String getName() {
        return this.name;
    }
    public void setSpielerKarten(Karte eingabeKarte) {
        spielerKarten.add(eingabeKarte);
    }
    public ArrayList<Karte> getSpielerKarten() {
        return this.spielerKarten;
    }
}
class Spielfeld {
    private ArrayList<Spieler> spielerAufSpielfeld;
    private ArrayList<Karte> kartenAufSpielfeld;
    private int runde;

    public Spielfeld(){
        spielerAufSpielfeld = new ArrayList<Spieler>();
        kartenAufSpielfeld = new ArrayList<Karte>();
        Deck meinDeck = new Deck();
    }
    public void createSpieler(int x) {
        for (int i=0;i<x;i++) {
            Spieler meinSpieler = new Spieler(meinDeck);
        }
    }
}
```


----------



## JStein52 (28. Apr 2017)

meinDeck existiert ja auch nur lokal im Konstruktor. Du musst dann schon eine Instanzvariable draus machen.


----------



## losi97 (28. Apr 2017)

Ich bin mir nicht sicher was du meinst.
Meinst du das so?

```
class Spielfeld {
    private ArrayList<Spieler> spielerAufSpielfeld;
    private ArrayList<Karte> kartenAufSpielfeld;
    private Deck meinDeck;
    private int runde;

    public Spielfeld(){
        spielerAufSpielfeld = new ArrayList<Spieler>();
        kartenAufSpielfeld = new ArrayList<Karte>();
        meinDeck = new Deck();
    }
    public void createSpieler(int x) {
        for (int i=0;i<x;i++) {
            Spieler spieler = new Spieler(meinDeck);
        }
    }
}
```


----------



## JStein52 (28. Apr 2017)

genau


----------



## losi97 (28. Apr 2017)

Würdest du sagen, dass meine Idee sinnvoll ist, sprich würden Erfahrene Programmierer das ähnlich machen? Ich frag nur, weil ich mir kein Blödsinn angewöhnen will.


----------



## losi97 (28. Apr 2017)

Also ich mein nicht das ganze Programm sondern nur das man ein Objekt einer anderen Klasse im Konstruktor erstellt.


----------



## JStein52 (28. Apr 2017)

Das ist schon in Ordnung so wie du es gemacht hast


----------



## Frani.w (20. Apr 2021)

losi97 hat gesagt.:


> Hallo zusammen,
> ich fange gerade mit Java an und komme von c++.
> Für die Uni soll ich ein Programm schreiben, mit dem man Poker spielen kann. (Kenne mich leider auch null aus mit Poker ;D)
> Aufgabe:
> ...


Guten Tag, Hier ist ein Newbie der auch Probleme hat damit Poker zu programmieren. Deswegen meine Frage, ob du mir das komplette Programm schicken könntest und ich es mir dann ansehen könnte? Vielen Dank!!


----------

