Fehlerhafte Berechnung beim erneuten Durchlaufen der Schleife

Bugs Bunny

Neues Mitglied
Hallo zusammen,
ich bin gerade dabei ein Programm zuschreiben mit dem der Gewinn einer Pokerpartie berechnet werden soll. Im folgenden Teil habe ich eine while Schleife eingebaut, die Prüfen soll, ob sich die Spieler beim Zählen der Chips verzählt haben. Dabei tritt folgendes Problem auf: wenn die Anzahl der Chips stimmt ist alles ok, stimmt sie jedoch nicht wird das falsche Ergebnis auch beim nächsten durchlauf der Schleife ausgegeben, unabhängig davon ob das Ergebnis diesmal richtig ist.

Java:
int chipsTotal = 2000;

boolean valid = false;

while(valid == false){

    //Abfrage Anzahl Chips Gewinner

    for (int i = 0; i < anzWin; i++) {

        System.out.println("Wie viel hat " + name.get(i) + " gewonnen?");

        Scanner input2 = new Scanner(System.in);

        int winSum = input2.nextInt();

        gewinn.add(winSum);

    }

    /*nach meinem Verständnis sollte folgende Anweisung bei jedem Durchlauf die Berechnung
    auf 0 setzen*/
    int gewinnTotal = 0;


    for (int i = 0; i < anzWin; i++) {

        gewinnTotal += gewinn.get(i);

    }

    System.out.println(gewinnTotal);

    if (gewinnTotal != chipsTotal) {

        valid = false;

        System.out.println("Ihr muesst euch verzaehlt haben. Bitte erneut eingeben.");

    }

    else{

       valid = true;

    }
 
Was ist denn Deine Variable gewinn?

Du fügst zu gewinn ja immer mit .add etwas hinzu, aber du löscht nie etwas. Evtl. fehlt vor der Schleife etwas wie gewinn.clear() um, da alle Einträge zu löschen?
 
Um die Namen der Spieler und ihre Gewinne festzuhalten habe ich ArryLists verwendet. gewinn ist eine dieser ArrayLists. Vorausgegangen im Code habe ich eine Abfrage der Namen eingebaut um diesen ihre Gewinne zuordnen zu können. Die Eingaben aus Gewinn brauche ich für spätere Berechnungen.
 
Aber du fügst nur hinzu! Also angenommen beim ersten Durchlauf gibst du ein (gewinn ist leer):
1333
333
333
Das wird dann in der schleife addiert: 1999 - und das ist nicht 2000. Also geht es in der äußeren While Scheife noch eine Runde:
Jetzt gibst Du wieder 3 Werte ein - diese kommen aber hinzu ... Also du gibst ein: 1333, 334, 333 (Summe wäre 2000), aber nun hast Du in gewinn:
1333
333
333
1333
334
333
==> Summe ist 3999 - also wieder nicht 2000.
 
Oh, ich sehe gerade: Du summierst ja nicht über das ganze Array ... Du summierst immer nur die ersten 3 Werte ... gewinn enthält also (mit Index):
0: 1333
1: 333
2: 333
3: 133
4: 334
5: 333
Summiert wird nun 0-2, also Summe ist 1999 und damit wird es nie auf 2000 kommen, egal was Du weiter eingibst.
 
Mal ein paar allgemeine Hinweise:

a) Pack Daten, die zusammen gehören, auch wirklich zusammen. Also Name und gewonnene Chips gehören zusammen und zwar gehören diese zum Spieler. Also mach eine Klasse Spieler mit den Instanzvariablen name und geonneneChips oder so.

b) Beim Durchlaufen von Listen oder Arrays solltest Du die Grenzen des Arrays verwenden. Also nicht, was in irgend einer Variable gespeichert wurde, als Grenze verwenden. Also statt:
Java:
    for (int i = 0; i < anzWin; i++) {
        gewinnTotal += gewinn.get(i);
    }
lieber ein
Code:
    for (int i = 0; i < gewinn.size(); i++) {
        gewinnTotal += gewinn.get(i);
    }
oder noch besser: Eine foreach Schleife verwenden um mit allen Elementen etwas zu machen oder eben Streams nutzen.

Beides zusammen würde dann auch solche Probleme verhindern. Dann würdest Du halt in der Schleife über alle Spieler immer im Spieler den Wert für gewonneneChips ändern. Damit kann es nicht zu dieser magischen "Vermehrung" von Werten kommen. und man hat auch deutlich mehr, in sich relativ abgeschlossene Dinge, die man gut testen kann.
 

Neue Themen


Zurück
Oben