Poker Spiel ruückfrage

PrograJan

Mitglied
Hey
ich habe das Problem bei meinem Projekt das die jeweiligen Runden im Spiel nicht auf der Console angezeigt werden. Wie kann ich das am besten lösen?



package poker;

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

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

public Spieler(Deck eingabeDeck){
spielerKarten = new ArrayList<Karte>();
for (int i=0;i<2;i++) {
Karte karte = eingabeDeck.getKarteFromDeck(eingabeDeck.getSizeOf()-1);
spielerKarten.add(karte);
eingabeDeck.removeKarteFromDeck(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 {
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);
}
}
}

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));
}
}
}
public void removeKarteFromDeck(int i) {
kartenDeck.remove(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());

// Spieleranzahl vom Benutzer eingeben lassen
Scanner scanner = new Scanner(System.in);
System.out.print("Geben Sie die Anzahl der Spieler ein (zwischen 2 und 10): ");
int spielerAnzahl = scanner.nextInt();
scanner.nextLine(); // Um den Zeilenumbruch nach der Zahl zu verbrauchen

if (spielerAnzahl < 2 || spielerAnzahl > 10) {
System.out.println("Ungültige Spieleranzahl. Das Spiel erfordert zwischen 2 und 10 Spieler.");
return;
}

Spielfeld spielfeld = new Spielfeld();
spielfeld.createSpieler(spielerAnzahl);

// Austeilrunden durchlaufen
for (int runde = 1; runde <= 4; runde++) {
System.out.println("Austeilrunde " + runde + ":");

// Jeder Spieler bekommt eine Karte in dieser Runde
for (Spieler spieler : spielfeld.spielerAufSpielfeld) {
Karte karte = meinDeck.getKarteFromDeck(meinDeck.getSizeOf() - 1);
spieler.setSpielerKarten(karte);
meinDeck.removeKarteFromDeck(meinDeck.getSizeOf() - 1);
System.out.println(spieler.getName() + " erhält eine Karte: " + karte);
}
}


Spieler meinSpieler = new Spieler(meinDeck);
meinSpieler.setName(JOptionPane.showInputDialog("Name: "));
meinSpieler.setSpielerKarten(meinDeck.getKarteFromDeck(1));
meinSpieler.setSpielerKarten(meinDeck.getKarteFromDeck(2));
System.out.println(meinSpieler.getName() + " : " + meinSpieler.getSpielerKarten());

}
}
 
Erst einmal ein genereller Hinweis:
Code bitte immer in Code-Tags posten. Das geht am einfachsten über den Knopf </> links oberhalb des Eingabebereiches.

ich habe das Problem bei meinem Projekt das die jeweiligen Runden im Spiel nicht auf der Console angezeigt werden.
Hier ist immer wichtig, dass man genau beschreibt, was Du siehst bzw. was Du vermisst. Nach einem ersten Überfliegen des Codes vermute ich, dass Du die Ausgabe von System.out.println("Austeilrunde " + runde + ":"); siehst, aber dass Du nichts siehst von der folgenden for Schleife.

Wenn Du so Probleme hast, dann solltest Du Dir das einfach etwas näher ansehen. Was da helfen kann ist der Debugger - evtl. willst Du Dir den einmal ansehen und schauen, ob Du damit klar kommst? Ist nicht wirklich kompliziert in den modernen Entwicklungsumgebungen.

Aber auch ohne Debugger könntest Du Ausgaben hinzufügen. Was ist in spielfeld.spielerAufSpielfeld?

Das Problem ist bei deinem Code, dass diese Liste leer ist. Es sind keine Spieler drin. Das Problem ist die Methode, die die Spieler anlegen soll:
Java:
public void createSpieler(int x) {
    for (int i=0;i<x;i++) {
        Spieler spieler = new Spieler(meinDeck);
    }
}

Was macht diese Methode? Sie erzeugt Spieler. Aber sonst? Wie meinst Du, kommt der erzeugte Spieler in die Liste spielerAufSpielfeld?
 
Moderator-Hinweis: Bitte die nachfolgenden Posts zu dem Code beachten!

Was sollte man hier als Alternative wählen? Vielleicht kannst du das einmal ausführen.
z.B. mit der Implementation des System.in
Java:
public class Test {
  public static void main (String args[]) throws Exception {
    int n = (Integer)read("Age (int):");
    String s = (String)read("Name (String):");
    double d = (Double)read("Salary (e.g. 30000.0):");
    System.out.println("Age: "+n+"\nName: "+s+"\nSalary: "+ d);
    System.out.printf("\nAge: %d\nName: %s\nSalary: %.2f", n, s, d);   
  }
  // accept only Integer, Double and String
  private static Object read(String txt) throws Exception {
    byte[] line = new byte[80];
    System.out.print(txt+" ");
    int n = System.in.read(line);
    int nl = System.lineSeparator().length();
    if (n == nl) return null;
    String s = new String(line, 0, n-nl);
    try {
      return Integer.parseInt(s);
    } catch (NumberFormatException ex) { }
    try {
      return Double.parseDouble(s);
    } catch (NumberFormatException ex) { }
    return s;
  }
}
und es sieht so aus:
1716125365015.png

Moderator-Hinweis: Bitte die nachfolgenden Posts zu dem Code beachten!
 
Zuletzt bearbeitet von einem Moderator:
Java:
public class Test {
  ...
  private static Object read(String txt) throws Exception {
    ...
    try {
      return Integer.parseInt(s);
    } catch (NumberFormatException ex) { }
    try {
      return Double.parseDouble(s);
    } catch (NumberFormatException ex) { }
    return s;
  }
}
Ernsthaft?
 
Ich bin gerade nicht am PC. Meine Antwort ist daher recht kurz.

- also, mir ist schon klar, dass man das auch ohne Scanner machen kann oder dass man sich andere Bibliotheken bedienen kann und das mit etwas anderem als dem Scanner zu implementieren.

Das vorweggenommen finde ich deine Implementierung gerade mal nicht so gut. Zum einen ist das nicht die exakte Funktion von nextInt() Da du immer die komplette Zeile verarbeitest und nicht nur nich nur das nächste Token. Und das ist gerade der Vorteil, wenn man den Scanner verwendet.
Deine Implementierung nutzt exceptions von dem Programm Fluss zu steuern. Das ist meiner Meinung nach eine falsche Nutzung von Exceptions.

was passiert, wenn der User gar kein String eingibt? Deine Funktion gibt null zurück. Dann bekommt man einen harten Fehler, glaube ich.

Insgesamt denke ich, dass es keine gute Alternative ist.

Um hier, den Rückschluss zu meiner ursprünglichen Frage wieder herzustellen: es gibt überhaupt keinen guten Grund, in so einer Anwendung nicht den Scanner zu verwenden. Der Hinweis in dem Beitrag oben ist einfach sinnlos und falsch. Und anstatt das hier vernünftig zu reflektieren und vielleicht etwas dabei zu lernen, hat man sich dazu entschieden, hier irgendwelche blöden Fleming Post zu schreiben.
 
Ich bin gerade nicht am PC. Meine Antwort ist daher recht kurz.

- also, mir ist schon klar, dass man das auch ohne Scanner machen kann oder dass man sich andere Bibliotheken bedienen kann und das mit etwas anderem als dem Scanner zu implementieren.

Das vorweggenommen finde ich deine Implementierung gerade mal nicht so gut. Zum einen ist das nicht die exakte Funktion von nextInt() Da du immer die komplette Zeile verarbeitest und nicht nur nich nur das nächste Token. Und das ist gerade der Vorteil, wenn man den Scanner verwendet.
Deine Implementierung nutzt exceptions von dem Programm Fluss zu steuern. Das ist meiner Meinung nach eine falsche Nutzung von Exceptions.

was passiert, wenn der User gar kein String eingibt? Deine Funktion gibt null zurück. Dann bekommt man einen harten Fehler, glaube ich.

Insgesamt denke ich, dass es keine gute Alternative ist.

Um hier, den Rückschluss zu meiner ursprünglichen Frage wieder herzustellen: es gibt überhaupt keinen guten Grund, in so einer Anwendung nicht den Scanner zu verwenden. Der Hinweis in dem Beitrag oben ist einfach sinnlos und falsch. Und anstatt das hier vernünftig zu reflektieren und vielleicht etwas dabei zu lernen, hat man sich dazu entschieden, hier irgendwelche blöden Fleming Post zu schreiben.
Ich würde sogar noch weiter gehen. die Methode 'read' ist einfach nur schlecht und fehlerhaft. Das sollte man einem Anfänger keinesfalls als Empfehlung mitgeben. Es wäre am Besten der Beitrag würde gelöscht.
 
Ich denke ein ausgezeichnetes Beispiel dafür, dass man nicht einfach blind dem vertrauen sollte, was in irgendeinem Forum steht. Sondern selbst versucht zu reflektieren, ob das richtig oder falsch ist.
Zumal sind noch schlechte Beispiele ausgezeichnet, um gerade in Form einer Code Review zu zeigen, wie es eigentlich besser läuft. Wenn man immer die perfekten Ergebnisse hat, dann fragt man sich warum überhaupt eine Code gurchführen 🤩
 
Ich denke, da muss man nicht viel diskutieren. Die Alternative ist einfach schlecht und fehlerhaft. Schon dass hier so frei Casts verwendet werden - Typsicherheit hat schon seine Gründe 🙂

Man kann gerne auf Streams setzen, wobei ich bei Texten dann eher auf einen Reader setzen würde, der sich dann um das Encoding kümmert und so. Aber das ist nebensächlich. Man würde es ausbauen um dann am Ende etwas zu haben wie den Scanner. Evtl. mit etwas anderen Features.

Daher wäre erst einmal die Frage: Was ist schlecht oder falsch am Scanner? Was will man genau haben bzw. was braucht man? Dann kann man gerne etwas anderes nutzen bzw. bauen.

Es wäre am Besten der Beitrag würde gelöscht.
Nein, ich denke, das wäre nicht wirklich zielführend, aber einen Hinweis als Moderator werde ich da wohl noch setzen.
 

Neue Themen


Zurück
Oben