Denkanstoß - Array von Objekten mit Ints

J

jDennis79

Gast
Hallo Forum. Ich glaube, ich brauche gerade mal einen kleinen Denkanstoß.

Szenario: Ich habe eine Spielerklasse. Die Klasse verwaltet unter anderem ein Array mit drei Würfelobjekten. Jedes Würfelobjekt verwaltet seine Augenzahlen in einer int-Variablen und gibt seine aktuelle Augenzahl über einen Getter zurück.

In der Spielerklasse gibt es nun eine Methode calculateResult(), innerhalb derer je nach Kombination der drei Augenzahlen ein Ergebnis ermittelt wird.

Java:
public class Player {
    // Code
    private Die[] setOfDice;
    // Code
}

Java:
public class Die {
    // Code
    private int pipsOfDie;
    // Code
}

Meine erste Idee war jetzt eine verschachtelte If-Abfrage:

Java:
if (setOfDice[0].getPipsOfDie() == 1) {
    if (setOfDice[1].getPipsOfDie() == 1) {
        if (setOfDice[2].getPipsOfDie() == 1) {
            // Code
        } else ... usw.

Aufgrund der Menge an möglichen Kombinationen wird das natürlich ziemlich mächtig und unübersichtlich.

Meine zweite Idee war, alle Augenzahlen in eine ArrayList oder eine andere Collection einzulesen und mit irgendeiner Methode der entsprechenden Collection zu arbeiten.

Java:
ArrayList<Integer> combination = new ArrayList<Integer>();
    for (int i = 0; i < setOfDice.length; i++) {
        combination.add(setOfDice[i].getPipsOfDie());
}

Ich habe aber in keiner Klasse, die ich in der API gefunden habe, eine geeignete Methode gefunden. Die contains()-Methoden zum Beispiel ermitteln ja nur, ob eine Augenzahl überhaupt vorkommt, aber nicht, wie oft.

Mir fehlt gerade die zündende Idee, wie ich das vereinfachen könnte. Hat jemand Vorschläge oder einen Denkanstoß?
 
Zuletzt bearbeitet von einem Moderator:
J

jDennis79

Gast
Ich hatte gerade noch eine Idee.

Ich könnte die ArrayList aufsteigend sortieren, die drei Augenzahlen zu einem String verketten und diesen dann mit den möglichen Ergebnissen vergleichen. Das hätte zwei Vorteile:

1. Es würde die Menge der Kombinationen deutlich reduzieren, weil ich zum Beispiel nur noch "156" überprüfen muss, aber nicht mehr "165", "516", "561" usw.

2. Es würde mir die Verschachtelung ersparen, weil ich nicht mehr die einzelnen Augenzahlen gegeneinander prüfen muss, sondern nur noch die gesamte Dreier-Kombination.

Für noch bessere Vorschläge bin ich natürlich trotzdem offen.
 

Sonecc

Gesperrter Benutzer
Wenn du statt der Code Tags die Java Tags verwendest (siehe die große Rote schrift) dann kann dein Code etwas leichter gelesen werden....
 

Upriser

Mitglied
Damit ich dich richtig verstanden habe. Du hast 1 Spieler mit drei Würfeln. Wenn der Spieler nun würfelt willst du die Anzahl Augen berechnen?
 

Marco13

Top Contributor
Das mit dem Sortieren und dem String klingt... erstmal... komisch, KÖNNTE(!) aber eine in diesem ganz speziellen Fall geeigenete Lösung sein. Die entscheidende Frage ist, auf basis welcher "Kriterien" was passieren soll. Also Beispiel: Wenn NUR die Summe der Augenzahlen relevant wäre, wäre das mit dem Sortieren natürlich blöd - wenn aber alle Entscheidungen auf Basis dieses "Musters" wie "156" getroffen werden können, wäre es vielleicht OK. Beschreib' diese Kriterien vielleicht nochmal genauer.
 
J

jDennis79

Gast
@ Sonnec - sorry, da steht es schon so schön abgesetzt und fett da, und ich übersehe es trotzdem...

@ Upriser - nein, es kommt auf die Kombinationen an, nicht auf die Summen.

@ Marco:

In dem Spiel gibt es verschiedene Level von Wertigkeiten.

- Der höchste Wurf ist 1, 1, 1.

Danach kommen Würfe, die aus zwei 1-en und einer dritten Zahl bestehen, die dritte Zahl bestimmt die Rangfolge.

- 1, 1, 6 ist demnach der zweithöchste Wurf
- 1, 1, 5 der dritthöchste
- 1, 1, 4 der vierthöchste usw.

Als nächstes kommen die Dreierpaschs, absteigend nach Rangfolge also

- 6, 6, 6
- 5, 5, 5
- usw.

Direkt darunter liegen die Straßen, also

- 1, 2, 3
- 2, 3, 4
- usw.

Als letztes in der Hierarchie kommen die "normalen" Zahlwürfe, die als dreistellige Zahlen gelesen werden, also absteigend:

- 6, 6, 5
- 6, 6, 4
- (...)
- 5, 5, 4
- 5, 5, 3
- usw.

Es kommt also auf die Kombination an. Die String-Lösung ist bisher die beste, die mir eingefallen ist. :noe:
 
Zuletzt bearbeitet von einem Moderator:
J

jDennis79

Gast
Funktionieren tut es, übersichtlich(er) als mit Verschachtelungen ist es auch - aber es sind immer noch über 50 If-Abfragen. Glücklich bin ich damit nicht. Vielleicht fällt ja noch jemandem eine gute Lösung ein.
 

ARadauer

Top Contributor
aber es sind immer noch über 50 If-Abfragen

Du kannst mit kategorien arbeiten.
1. Kat: 111
2. Kat: alle mit zwei einser
3. Kat: Pasch
4. Kat: Straßen
5. Kat: sonsttige.

dann hat du 5 logiken anahnd du die Kategoire ermitellst und innerhalb der Katergorie kannst du dann nochmal die jeweilige Wertigkeit bestimmen..
 
J

jDennis79

Gast
Ich habe bisher noch nichts von Kategorien gelesen - aber das klingt zumindest schonmal wie etwas, das ich gesucht habe. :) Wie gut, dass die Insel hier noch liegt...
 

ARadauer

Top Contributor
Kategorien ... naja das ist jetzt nichts was es schon gibt... da brauchst du die insel gar nicht bemühen...
schreib dir deine methode die dir anhand des setOfDice den Typ/Kategorie zurück gibt und anhand dieser Kategorie ruft du immer eine andere Methode auf die dir die Würfle bewertet...
 

Marco13

Top Contributor
Dazu wirst du in der Insel nichts finden, das ist nur so ein abstrakter Begriff....

Hab' mal die Mittagspause genutzt...
Java:
import java.util.*;

class DiceCheck
{
    public static void main(String args[])
    {
        System.out.println(check(1,1,1));

        System.out.println(check(1,1,2));
        System.out.println(check(1,3,1));
        System.out.println(check(4,1,1));

        System.out.println(check(2,2,2));
        System.out.println(check(4,4,4));

        System.out.println(check(2,3,4));
        System.out.println(check(4,5,6));

        System.out.println(check(1,5,6));
        System.out.println(check(6,5,2));
    }

    private static String check(int ... values)
    {
        List<Integer> list = new ArrayList<Integer>();
        for (int i=0; i<values.length; i++)
        {
            list.add(values[i]);
        }
        return "For "+list+": "+check(list);
    }


    private static int count(List<Integer> list, Integer element)
    {
        int counter = 0;
        for (Integer value : list) if (value.equals(element)) counter++;
        return counter;
    }


    private static int sequence(List<Integer> list, int delta)
    {
        Collections.sort(list);
        for (int i=0; i<list.size()-1; i++)
        {
            Integer v0 = list.get(i);
            Integer v1 = list.get(i+1);
            if (v1 != v0+delta) return 0;
        }
        return list.get(0);
    }

    private static int straight(List<Integer> list)
    {
        return sequence(list, 1);
    }

    private static int value(List<Integer> list)
    {
        Collections.sort(list);
        int value = 0;
        int n = 1;
        for (int i=list.size()-1; i>=0; i--)
        {
            Integer v = list.get(i);
            value += v * n;
            n *= 10;
        }
        return value;
    }

    private static Integer nOfAKind(List<Integer> list)
    {
        return sequence(list, 0);
    }

    private static String check(List<Integer> list)
    {
        int ones = count(list, 1);
        if (ones == 3) return "Three times one";
        if (ones == 2)
        {
            Integer max = Collections.max(list);
            return "Two ones and "+max;
        }
        int minStraight = straight(list);
        if (minStraight != 0) return "Straight starting at "+minStraight;

        int nOf = nOfAKind(list);
        if (nOf != 0) return "Three of "+nOf;

        return "Nothing "+value(list);
    }
}
 
J

jDennis79

Gast
@ Marco: Vielen Dank erstmal!

Auf den ersten Blick sieht deine Lösung jetzt nicht viel kompakter aus als meine, nur viel eleganter natürlich. Ich werde sie mir aber nachher nochmal in Ruhe ansehen und überlegen, ob sie sinnvoller ist. Unter welcher Lizenz steht deine Lösung? :D

Meine sieht jetzt so aus:

Java:
public String calculateResult() {
		String result = "";
		ArrayList<Integer> pipsArray = new ArrayList<Integer>();
		String combination = "";
		for (int i = 0; i < setOfDice.length; i++) {
			pipsArray.add(setOfDice[i].getPipsOfDie());
		}
		Collections.sort(pipsArray);
		for (int i = (setOfDice.length - 1); i >= 0; i--) {
			combination = combination + (pipsArray.get(i));
		}
		if ("111".equals(combination)) {
			result = "shockout";
		} else if ("611".equals(combination)) {
			result = "6shock";
		} else if ("511".equals(combination)) {
			result = "5shock";
		} else if ("411".equals(combination)) {
			result = "4shock";
		} else if ("311".equals(combination)) {
			result = "3shock";
		} else if ("211".equals(combination)) {
			result = "2shock";
		} else if ("666".equals(combination)) {
			result = "6general";
		} else if ("555".equals(combination)) {
			result = "5general";
		} else if ("444".equals(combination)) {
			result = "4general";
		} else if ("333".equals(combination)) {
			result = "3general";
		} else if ("222".equals(combination)) {
			result = "2general";
		} else if ("654".equals(combination)) {
			result = "6straight";
		} else if ("543".equals(combination)) {
			result = "5straight";
		} else if ("432".equals(combination)) {
			result = "4straight";
		} else if ("321".equals(combination)) {
			for (int i = 0; i < setOfDice.length; i++) {
				if (setOfDice[i].isLocked()) {
					result = combination;
				} else {
					result = "3straight";
				}
			}	
		} else {
			result = combination;
		}  
		return result;
	}

Die Idee war, dass ich die normalen Zahlwürfe ja direkt als Ergebnis zurückliefern kann, weil der Aufrufer sowieso die Wertigkeiten aller Spielerergebnisse noch gegeneinander prüfen muss.
 

Marco13

Top Contributor
Die Lizenz für die Lösung ist die WTFPL.

Tatsächlich sind die if-Abfragen in diesem Fall kompakter, einfacher und übersichtlicher - ich hätte im Voraus nicht gedacht, dass es so wenig Fälle sind... da hätte man mal nachdenken müssen (du hattest was von 50 gesagt ???:L ). Zumindest eine "akademische" Rechtfertigung habe ich: Wenn man das ganze jetzt auf 4 Würfel erweitern müßte... ... ... ... ... ;)
 
J

jDennis79

Gast
@Marco - ja, über 50 wären es, wenn ich jeden "normalen" Zahlwurf einzeln auch noch prüfen würde. Aber dann habe ich, wie gesagt, ja überlegt, dass der Aufrufer sowieso die Ergebnisse aller Spieler gegeneinander prüfen muss, und ich dann die Zahlwürfe auch einfach im letzten else-Zweig "as is" zurückgeben kann.

Aber wie du schon sagst - falls man den Mechanismus erweitern müsste, wäre deine Lösung einfacher auszubauen - da bin ich ja dann mittendrin im Thema OOP. :) Deshalb nochmal Danke für den Hinweis!

P.S.: WTFPL... :lol: Kannte ich noch gar nicht. Grandios! :lol:
 

Thief

Bekanntes Mitglied
Die Hauptfrage die sich mir gerade stellt ist, was du nach dem Vergleich tun willst.

Ich weiß jetzt leider nicht wieviele Werte du unterscheidest, aber vielleicht geht ja folgendes:

Die gewürfelten Zahlen sortierst du, wie du oben gesagt hast, nach ihrer Augenzahl. So dass sie
immer aufsteigend von links nach rechts angeordnet werden (Bsp.: 114, 123, 145). Somit hast
du eine definierte Menge an Kombinationen.

Den einzelnen Ergebnissen weißt du in einer HashMap einen Wert zu. Bsp.:
111 ist das Höchste, also erhält es den Wert 1000;
116 ist das zweit Höhcste, erhält den Wert 999;
-->
Java:
HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put (String.valueOf(111), 1000); 
map.put (String.valueOf(116), 999);

Eventuell musst du Integer in der Map speichern (new Integer(1000))

Würfeln nun 3 leute, kannst du ihre drei Ergebnisse wiefolgt vergleichen:
Java:
int score1 = map.get(String.valueOf(111)).intValue();
int score2 = map.get(String.valueOf(116)).intValue();
....

Soll nur der Titel des Ergebnisses ausgegeben werden (Straße, 6Pasch)... kann man
auch diesen dort speichern. Wird beides gebraucht kann man sich eine Übersetzerklasse
erstellen, die zum Punktestand die entsprechende Übersetzung zurück liefert.
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Ich meinte ohne Dinge wie List, Map, String.valueOf und so... (Das ganze nur im Zusammenhang mit dem Vorurteil, Java sei langsam...)
 

Thief

Bekanntes Mitglied
Die Vorteile der Objektorientierten Programmierung ist nunmal, dass man sowas machen kann.
Java ist auch nichtmehr wirklich langsam im Vergleich zur Anfangszeit.

Natürlich kann man das auch mit Spagetticode programmieren und vielleicht ne 10. Sekunde herausschlagen, aber da stellt sich mir die Frage, was wartungsfreundlicher und leichter erweiterbar ist.

Außerdem erstellt man die Map ja nur einmal und hat dann immer darauf Zugriff.
 

Marco13

Top Contributor
Natürlich hat eine Map unschätzbare Vorteile, aber in diesem Fall ist es eher ein "Umweg", und so eine Map oder ein "bedenkenloses" String.valueOf haben ja nichts mit OOP zu tun. Es spielt in diesem Fall vielleicht keine Rolle, aber falls das doch schnell ausgewertet werden muss, hieße es von einigen vielleicht wieder "boah, Java is woll lahm". Niemand würde auf die Idee kommen, für die Sortierung eines dreielementigen Arrays Quicksort zu Implementieren, und auch nicht darauf, es nur zu verwenden selbst wenn es schon fertig implementiert ist. Aber so ein Arrays.sort(...) geht eben schneller von der Hand als eine handvoll if-Abfragen. Vielleicht ist das aber auch alles unwichtig.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Denkanstoß benötigt: Emails an bestimmte Emailadresse schicken Java Basics - Anfänger-Themen 6
W Erste Schritte Rechnen mit Schleifen? Denkanstoß gesucht Java Basics - Anfänger-Themen 15
B Denkanstoß - Hash ID für URL Java Basics - Anfänger-Themen 7
I Brauche Denkanstoß: Weitergabe von Kontaktinfos aus verschiedenen Kontaktformularen von Webseiten Java Basics - Anfänger-Themen 2
J vergleich von arrays (benötige Hilfe/Denkanstoß) Java Basics - Anfänger-Themen 16
M BildLauf - ArrayLists - Denkanstoß Java Basics - Anfänger-Themen 2
N Denkanstoß Zeilenumbruch Java Basics - Anfänger-Themen 9
K Arrays zusammen addieren - brauche Denkanstoß:) Java Basics - Anfänger-Themen 4
M Erste Schritte Anfänger braucht Denkanstoß für Schulprojekt Java Basics - Anfänger-Themen 21
M Denkanstoß für Umlaufzahl dringend benötigt! Java Basics - Anfänger-Themen 9
R Brauche Denkanstoß Java Basics - Anfänger-Themen 31
A Denkanstoß: Drehen eines Bildes (Matrix) Java Basics - Anfänger-Themen 5
T Array verkleinern Java Basics - Anfänger-Themen 2
J Array aus Numberfield Eingaben Java Basics - Anfänger-Themen 7
D Array List mit Objekten sortieren Java Basics - Anfänger-Themen 2
onlyxlia Anzahl Random Zahlen mit Scanner abfragen und in Array speichern Java Basics - Anfänger-Themen 10
Ü Java Array - Buchstaben als Zahlen ausgeben Java Basics - Anfänger-Themen 22
Ü Zweidimensionales Array in der ersten Zeile deklarieren Java Basics - Anfänger-Themen 13
Thomas Uppe 2D Array Reihenfolge vermischen Java Basics - Anfänger-Themen 4
T array auslesen Java Basics - Anfänger-Themen 2
Nitrogames Variablen Variable aus JOptionPane Abfrage in Array einfügen Java Basics - Anfänger-Themen 4
moini Auf Array aus Superklasse zugreifen? Java Basics - Anfänger-Themen 2
J ArrayList in 2D-Array konvertieren. Java Basics - Anfänger-Themen 48
M NullPointerException: Cannot read the array length because "this.Kinder" is null Java Basics - Anfänger-Themen 1
P Wieso kann ich als Index für einen Array einen Char angeben? Java Basics - Anfänger-Themen 3
Finn_lol Fehlermeldung bei Schleife mit Array Java Basics - Anfänger-Themen 4
Proxy Chars vor array übergabe toLowerUpcase Java Basics - Anfänger-Themen 14
iAmFaiinez Primzahlen Tester ohne Array Java Basics - Anfänger-Themen 4
S array 2 dimensional treppe Java Basics - Anfänger-Themen 3
S Array 2x2 Blöcke mit 0 und 1 Java Basics - Anfänger-Themen 10
C Array von Klassen Java Basics - Anfänger-Themen 2
julian0507 2Dim-Array Spaltensummen Java Basics - Anfänger-Themen 1
XWing Doppelte Zahlen im Array Java Basics - Anfänger-Themen 8
melisax Java 2D-Array Tabelle Java Basics - Anfänger-Themen 4
melisax Java Array Wert an bestimmtem Index angeben Java Basics - Anfänger-Themen 14
W Items löschen aus String Array vom Custom Base Adapter Java Basics - Anfänger-Themen 2
Proxy Stack erweitern mit neuem Array falls der alte voll ist!? Java Basics - Anfänger-Themen 5
E Array, nächste Zahl zur 5 ausgeben, wie? Java Basics - Anfänger-Themen 42
J Array.list vergleichen Java Basics - Anfänger-Themen 1
W Java-Code mit Array Java Basics - Anfänger-Themen 14
D Reflections & Generisches Array Java Basics - Anfänger-Themen 4
T Array Java Basics - Anfänger-Themen 2
T Array Java Basics - Anfänger-Themen 15
T Wörteranzahl im Array zählen Java Basics - Anfänger-Themen 9
Ostkreuz Zweidimensionaler Array Index Java Basics - Anfänger-Themen 2
S String Array Buchstaben um einen gewissen Wert verschieben Java Basics - Anfänger-Themen 4
R Images aus einem Array ausgeben Java Basics - Anfänger-Themen 3
R 2d Array individuell machen Java Basics - Anfänger-Themen 4
D 2D Char Array into String Java Basics - Anfänger-Themen 2
J Array Median bestimmen Java Basics - Anfänger-Themen 6
S Array Maximum bestimmen mit for und foreach Java Basics - Anfänger-Themen 7
S Prüfen ob ein zweidimensionales Array rechteckig ist Java Basics - Anfänger-Themen 4
N Array Java Basics - Anfänger-Themen 1
J Array Mittleren Wert bestimmen Java Basics - Anfänger-Themen 2
D OOP Array einem Objekt zuweisen Java Basics - Anfänger-Themen 2
O Zahlen aus einem char-array per char + Zeichen addieren Java Basics - Anfänger-Themen 2
S leeres Array statt Null Pointer Exception ausgeben Java Basics - Anfänger-Themen 20
S Inhalte aus Array vergleichen und Max ausgeben Java Basics - Anfänger-Themen 3
M 2d array ohne längen anlegen Java Basics - Anfänger-Themen 4
S Bestimmte werte aus einem Array löschen Java Basics - Anfänger-Themen 2
S Ausgeben wie oft ein Wert in einem Array vorkommt Java Basics - Anfänger-Themen 7
E Reihenfolge der Werte umdrehen (mittels statischem int-Array Java Basics - Anfänger-Themen 3
O 2 Dimensionales Array Java Basics - Anfänger-Themen 6
M Bubble Sort - Int[] Array sortieren Java Basics - Anfänger-Themen 2
javaBoon86 Array mehrere Dimensionen Java Basics - Anfänger-Themen 10
B Array nach Elementwerten sortieren? Java Basics - Anfänger-Themen 1
B Explizit Array definieren geht nicht? Java Basics - Anfänger-Themen 14
D Kleinste Zahl in Array finden die vorher noch errechnet werden müssen. Java Basics - Anfänger-Themen 4
L Gegebenes Array sortieren, indem zufällige Zahlenpaare aus Array ausgewählt werden Java Basics - Anfänger-Themen 14
Say 2-DIM Array Code lesen und verstehen Java Basics - Anfänger-Themen 5
N Array beim erstellen mit Werten füllen Java Basics - Anfänger-Themen 6
C Java Array Struktur, welche ist wann besser? Java Basics - Anfänger-Themen 12
Temsky34 Array IndexOf nicht verfügbar Java Basics - Anfänger-Themen 18
belana wie am besten 2D Array von String to Integer Java Basics - Anfänger-Themen 18
S Array mit Methode löschen Java Basics - Anfänger-Themen 2
J Java To String Methode, Array mit For-Schleife Java Basics - Anfänger-Themen 2
E Durch Muster in Array iterieren Java Basics - Anfänger-Themen 3
L Frage zum Array Java Basics - Anfänger-Themen 1
C 2D Array Ausgabe mit for-Schleife i,j Java Basics - Anfänger-Themen 4
D Methode: Array Reihenfolge tauschen Java Basics - Anfänger-Themen 3
julian0507 Array aus Methode in anderer Methode sichtbar machen Java Basics - Anfänger-Themen 10
P Array vom Typ Klasse Java Basics - Anfänger-Themen 18
Lion.King Array deklarieren und initialisieren Java Basics - Anfänger-Themen 5
P Array-Objekte-Aufruf Java Basics - Anfänger-Themen 22
A CSv.Datei einlesen und die werte in zweidemosional Int Array speichern Java Basics - Anfänger-Themen 9
M Methoden Zweidimensionaler Array mit Setter Methode ändern Java Basics - Anfänger-Themen 4
AkiJou Zeile in 2d Array löschen Java Basics - Anfänger-Themen 2
LilliCherry Array in einer Zeile ausgeben Java Basics - Anfänger-Themen 6
A Elemente in einem Array Java Basics - Anfänger-Themen 5
A Vorkommende Farben ermittel und als Array zurückgeben Java Basics - Anfänger-Themen 7
AhmadSlack Array Java Basics - Anfänger-Themen 7
Jambolo Kartenhand Array Java Basics - Anfänger-Themen 14
ravenz Schleife mit for über String Array „zahlen“und prüfen ob Wert „a“ oder „b“ oder „c“ entspricht (mittels || ) Java Basics - Anfänger-Themen 4
S Eine Variable in einem Array speichern Java Basics - Anfänger-Themen 5
T Methode, die prüft ob in einem Int-Array maximal 2 Zahlen enthalten sind, die größer als ihr Vorgänger sind Java Basics - Anfänger-Themen 5
T String Array Fehler beim Index Java Basics - Anfänger-Themen 3
krgewb byte-Array, das ein Bild repräsentiert Java Basics - Anfänger-Themen 1
1 Array rekursiv durchlaufen Java Basics - Anfänger-Themen 8
I Methoden Wieso wird mein Array "a" verändert und meine Variable "a" nicht? Java Basics - Anfänger-Themen 4
EykS 3D Druckdatei basierend auf 3D Array? Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben