ArrayList: summe aller Spielkarten

Javinner

Top Contributor
Hallo an alle,

Problembeschreibung: es sollen alle Werte der Spielkarten summiert werden.
Es kommen dabei total krumme Werte raus und ich weiß nicht warum.
Ich habe mich in die ArrayList eingelesen und gegoogelt, jedoch scheint es, ich habe die
Addition der ArrayList richtig umgesetzt, das Ergebnis untermauert es leider nicht.
Was mache ich hier falsch? Bin ziemlich verwirrt!
LG
Java:
package siebzehnvierzwei;

/**
*
* @author Javinner
*/
public class SiebzehnVierZwei
{

    public static void main(String[] args)
    {
        Spieler spieler = new Spieler();
        SpielCasino spielCasino = new SpielCasino();

        System.out.println("Aktuelle Hand" + spieler.getHand());
        System.out.println();
        spielCasino.spiel_17_4(spieler);
        System.out.println("Aktuelle Hand" + spieler.getHand());

    }

}
Java:
package siebzehnvierzwei;

import java.util.ArrayList;
/**
*
* @author Javinner
*/
public class Spieler
{

    /**
     * ArrayList {@code spielKartes} speichert alle gezogenen Karten des
     * Spielers;
     */
    private final ArrayList<SpielKarte> spielKartes = new ArrayList<>();

    /**
     * {@code hand} Summe Wert aller Karten;
     */
    private int hand;

    /**
     * {@code guthaben} aktuelles Guthaben des Spielers;
     */
    private double guthaben;

    /**
     * fuegt die naechste Spielkarte der ArrayList {@code spielKartes} zu;
     */
    void addToHand(SpielKarte sk)
    {
        spielKartes.add(sk);
    }

    /**
     * liefert die Hand des Spielers;
     *
     * @return {@code hand} die Hand des Spielers
     */
    int getHand()
    {
        getSummeSpielKarten();
        return hand;
    }

    /**
     * Abfrage aktuelles {@code guthaben} Spieler;
     *
     * @return {@code guthaben} aktuell
     */
    double getGuthaben()
    {
        return this.guthaben;
    }

    /**
     * addiert den {@code gewinn} zum aktuellen {@code guthaben}
     */
    void addGuthaben(double gewinn)
    {
        this.guthaben += gewinn;
    }

    /**
     * subtrahiert den {@code verlust} vom aktuellen {@code guthaben}
     */
    void subGuthaben(double verlust)
    {
        this.guthaben -= verlust;
    }

    /**
     * durchlaeuft die ArrayList {@code spielKartes} und addiert
     * den {@code wert} aller Spielkarten zu {@code hand}
     */
    private void getSummeSpielKarten()
    {
        for (SpielKarte sk : spielKartes) {
            hand += sk.getWert();
        }
    }
}
Java:
package siebzehnvierzwei;

import java.util.Random;
/**
*
* @author Javinner
*/
class SpielKarte
{

    /**
     * {@code wert} jeder Karte zwischen {@code zahlenWertKlein}
     * und {@code zahlenWertGross}
     */
    private final int wert;
  
    /**
     * untere Grenze des Spiels 17 von 4
     */
    private final int zahlenWertKlein = 2;
  
    /**
     * obere Grenze des Spiels 17 von 4
     */
    private final int zahlenWertGross = 11;

    /**
     * initialisiert eine neue Spielkarte mit
     * {@code zufallswert}
     */
    public SpielKarte()
    {
        this.wert = zufallsWert();
    }

    /**
     * liefert den Zufallswert einer Zahl in Grenzen des
     * Spiels 17 von 4;
     *
     * @return {@code zufallswert}
     */
    private int zufallsWert()
    {
        Random ran = new Random();
        int zahl = ran.nextInt((zahlenWertGross - zahlenWertKlein));
        System.out.println(zahl);
        return zahl + zahlenWertKlein;
    }
  
    /**
     * liefert den {@code wert} der jeweiligen Spielkarte
     *
     * @return {@code wert}
     */
    int getWert()
    {
        return this.wert;
    }

}
Java:
static final int MAX_SPIEL_17_4 = 21;
  
    void spiel_17_4(Spieler spieler)
    {
        String input;
        do{
            druckeFrageNochEineKarte();
           input = scanner.nextLine();
           if(input.trim().equalsIgnoreCase("Ja"))
           {
               spieler.addToHand(new SpielKarte());
           }
        }while(!input.trim().equalsIgnoreCase("Nein")&& spieler.getHand() <= MAX_SPIEL_17_4);
    }
Java:
Aktuelle Hand: 0

Wollen Sie eine Karte?
Abbruch jederzeit mit "Nein"
ja
7
Wollen Sie eine Karte?
Abbruch jederzeit mit "Nein"
ja
3
Wollen Sie eine Karte?
Abbruch jederzeit mit "Nein"
nein
Aktuelle Hand: 27
 
Zuletzt bearbeitet:
Ich glaube, hier liegt der Hund begraben..
Java:
while(!input.trim().equalsIgnoreCase("Nein")&& spieler.getHand() <= MAX_SPIEL_17_4);

edit: genau das war es
 
Ich glaube, hier liegt der Hund begraben..
Java:
while(!input.trim().equalsIgnoreCase("Nein")&& spieler.getHand() <= MAX_SPIEL_17_4);

edit: genau das war es
Zu früh gefreut..
Das funktioniert leider nicht..
Java:
void spiel_17_4(Spieler spieler)
    {
        String input;
        do{
            spieler.deleteHand();//Hand gleich Null
            druckeFrageNochEineKarte();
           input = scanner.nextLine();
           if(input.trim().equalsIgnoreCase("Ja"))
           {
               spieler.addToHand(new SpielKarte());
           }
        }while(!input.trim().equalsIgnoreCase("Nein")&& spieler.getHand() <= MAX_SPIEL_17_4);
    }
Weiß jemand ein Rat?
 
Da war ich wohl zu langsam mit posten.
Habe ich gemacht, hilft jedoch leider nicht. Außerdem bekomme ich die Zufallszahlen, welche außerhalb des erlaubten Bereiches liegen. Mir qualmt der Kopf..

Java:
Aktuelle Hand: 0

Wollen Sie eine Karte?
Abbruch jederzeit mit "Nein"
ja
0
Wollen Sie eine Karte?
Abbruch jederzeit mit "Nein"
ja
7
Wollen Sie eine Karte?
Abbruch jederzeit mit "Nein"
ja
2
Wollen Sie eine Karte?
Abbruch jederzeit mit "Nein"
nein
Aktuelle Hand: 15
Java:
package siebzehnvierzwei;

import java.util.ArrayList;

/**
*
* @author Javinner
*/
public class Spieler
{

    /**
     * ArrayList {@code spielKartes} speichert alle gezogenen Karten des
     * Spielers;
     */
    private final ArrayList<SpielKarte> spielKartes = new ArrayList<>();

    /**
     * {@code hand} Summe Wert aller Karten;
     */
    private int hand;

    /**
     * {@code guthaben} aktuelles Guthaben des Spielers;
     */
    private double guthaben;

    /**
     * fuegt die naechste Spielkarte der ArrayList {@code spielKartes} zu;
     */
    void addToHand(SpielKarte sk)
    {
        spielKartes.add(sk);
    }

    /**
     * liefert die Hand des Spielers;
     *
     * @return {@code hand} die Hand des Spielers
     */
    int getHand()
    {
        getSummeSpielKarten();
        return hand;
    }

    /**
     * setzt die {@code hand} auf den Wert Null
     */
    void deleteHand()
    {
        this.hand = 0;
    }

    /**
     * Abfrage aktuelles {@code guthaben} Spieler;
     *
     * @return {@code guthaben} aktuell
     */
    double getGuthaben()
    {
        return this.guthaben;
    }

    /**
     * addiert den {@code gewinn} zum aktuellen {@code guthaben}
     */
    void addGuthaben(double gewinn)
    {
        this.guthaben += gewinn;
    }

    /**
     * subtrahiert den {@code verlust} vom aktuellen {@code guthaben}
     */
    void subGuthaben(double verlust)
    {
        this.guthaben -= verlust;
    }

    /**
     * durchlaeuft die ArrayList {@code spielKartes} und addiert den
     * {@code wert} aller Spielkarten zu {@code hand}
     */
    private void getSummeSpielKarten()
    {
        for (SpielKarte sk : spielKartes) {
            hand += sk.getWert();
        }
    }
}
Java:
package siebzehnvierzwei;

import static java.lang.System.out;
import java.util.Arrays;
import java.util.Scanner;

public class SpielCasino
{

    /**
     *
     * @author Javinner
     */
    static final int MAX_SPIEL_17_4 = 21;

    Scanner scanner = new Scanner(System.in);

    private final String willkommenDreiFedern = "Herzlich willkommen in unserem Casino \"Drei Federn\"";
    private final String flinkesHaendchen = "Ich bin der Chef-Häuptling \"Flinkes Händchen\"";
    private final String versuchenSieGlueck = "Versuchen Sie Ihr Glück an unserem 17 und 4 Tisch";
    private final String moegeDasGlueckBueffel = "Möge Euch das Glück umschmeicheln wie der Geruch eines Büffels";
    private final String spielerEinsBeginnt = "Der erste Spieler ist an der Reihe";
    private final String spielerZweiBeginnt = "Der zweite Spieler ist an der Reihe";
    private final String nochEineKarte = "Wollen Sie eine Karte?";
    private final String abbruchMitNein = "Abbruch jederzeit mit \"Nein\"";
    private final String schlussDankesRede = "Danke, dass Sie bei \"Drei Federn\" gespielt haben";
    private final String moegeIhrLebenGesangDrossel = "Möge Ihr Leben vom Gesang der Drossel erfüllt sein";
    private final int formLaenge = 63;
    private final char kennung = '*';
    private char[] form;

    void eroeffnungsDialog()
    {
        form = new char[formLaenge];
        Arrays.fill(form, kennung);
        out.println(form);
        out.println(willkommenDreiFedern);
        out.println(flinkesHaendchen);
        out.println(versuchenSieGlueck);
        out.println(moegeDasGlueckBueffel);
        out.println(form);
    }

    private void druckeFrageNochEineKarte()
    {
        out.println(nochEineKarte);
        out.println(abbruchMitNein);
    }

    void druckeAufforderungErsterSpieler()
    {
        out.println(spielerEinsBeginnt);
    }

    void druckeAufforderungZweiterSpieler()
    {
        out.println(spielerZweiBeginnt);
    }

   
    void spiel_17_4(Spieler spieler)
    {
        String input;
        do {
            spieler.deleteHand();//Hand gleich Null
            druckeFrageNochEineKarte();
            input = scanner.nextLine();
            if (input.trim().equalsIgnoreCase("Ja")) {
                spieler.addToHand(new SpielKarte());
            }
        } while (!input.trim().equalsIgnoreCase("Nein") && spieler.getHand() <= MAX_SPIEL_17_4);
    }

}
 
Du addierst in der Methode zufallsWert() immer zahlenWertKlein zur Zufallszahl. Die Summe müsste also pro gezogener Karte um 2 zu groß sein.

EDIT: Besser gesagt: Du gibst den Wert aus, bevor du die Zwei addiert hast.
 
Du addierst in der Methode zufallsWert() immer zahlenWertKlein zur Zufallszahl. Die Summe müsste also pro gezogener Karte um 2 zu groß sein.

Quelle: https://docs.oracle.com/javase/8/docs/api/java/util/Random.html#nextInt-int-
Returns:
the next pseudorandom, uniformly distributed int value between zero (inclusive) and bound (exclusive) from this random number generator's sequence
Nein, so ist es nicht

Ich habe gerade ein kleines Testprogramm geschrieben und dieses arbeitet regelkonform.
Den Wert von Eins dazu zu addieren habe ich jedoch vergessen.
Hier, so wie es funktioniert.
Java:
package test;

import java.util.Random;

public class Test
{

    static int max = 11;
    static int min = 2;

    public static void main(String[] args)
    {

        int a = 20;
        while (a > 0) {
            int x = zufallsZahl();
            System.out.print(x + " ");
            a--;
        }
    }

    static int zufallsZahl()
    {
        Random ran = new Random();
        int i = ran.nextInt((max - min) + 1);
        return i + min;
    }
}

//Konsolenausgabe:
9 3 9 5 3 7 2 4 6 5 6 4 10 5 2 5 2 6 7 8
 
Das:
Java:
    private int zufallsWert()
    {
        Random ran = new Random();
        int zahl = ran.nextInt((zahlenWertGross - zahlenWertKlein));
        System.out.println(zahl);
        return zahl + zahlenWertKlein;
    }
ist eine Methode aus deinem Code. Du gibst zunächst zahl auf der Konsole aus und dann zahl+2 an den Aufrufer der Methode zurück.
 
Genau so ist es, denn der Wertebereich der Karten beim Spiel 17 von 4 zwischen den
Wert: 2 und Wert: 11 liegt. So ermittelt die Methode nextInt(int bound)
die Zufallszahl genau zwischen Wert: 2 und Wert: 11.
Damit die ermittelte Zufallszahl dann auch wirklich zwischen den erwähnten Grenzen liegt,
muss! die Zufallszahl + min.Wert geliefert werden.
Da dabei die Zahlen bis max.Wert generiert werden, muss zusätzlich eine Eins dazu addiert werden, so dass jede neue Zufallszahl felsenfest zwischen den eingegebenen Bereichen liegt.
 
Java:
System.out.println("Aktuelle Hand: " + spieler.getHand());
        System.out.println();
        //System.out.println(Zufallszahl);
        spielCasino.spiel_17_4(spieler);
        System.out.println("Aktuelle Hand: " + spieler.getHand());
Wenn das Programm startet, wird der Wert des Arrays berechnet.
Dann die besagte Infomeldung im Zufallszahlengenerator und anschließend
der Wert des Arrays am Ende.

In der Methode spiel_17_von_4 wird gleich zu Beginn der Wert der Variablen hand
auf Null gesetzt, dann kommt die Abfrage und wenn ja, dann am Ende der do{}while Schleife wird Array für die Bedingung nochmal gezählt und das solang, bis entweder ein Nein erfolgt oder Arraysumme den Wertebereich von 21 überschritten hat.
Java:
Aktuelle Hand: 0

Wollen Sie eine Karte?
Abbruch jederzeit mit "Nein"
ja
7
Wollen Sie eine Karte?
Abbruch jederzeit mit "Nein"
ja
9
Wollen Sie eine Karte?
Abbruch jederzeit mit "Nein"
nein
Aktuelle Hand: 20
So wie hier: 7 + 9 ist auf jeden Fall nicht 20..

Vielen Dank!
 
Ich denke, das sind nur deine Testausgaben. Wenn 7 ausgegeben wird, ist der Kartenwert 9 und wenn 9 ausgegeben wird, ist der Kartenwert 11:
Code:
(7+2) + (9+2) = 20
 
Da hast du absolut recht! Wenn man den Wald vor lauter Bäume nicht mehr sieht!
😀 Jetzt ergibt alles einen Sinn
Java:
/**
     * liefert den Zufallswert einer Zahl in Grenzen des
     * Spiels 17 von 4;
     *
     * @return {@code zufallswert}
     */
    private int zufallsWert()
    {
        Random ran = new Random();
        int zahl = ran.nextInt((zahlenWertGross - zahlenWertKlein)+1);
        System.out.println(zahl + zahlenWertKlein);
        return (zahl + zahlenWertKlein);
    }
 

Zurück
Oben