Hallo,
klingt wie immer umständlich was ich werkle aber ist es nicht.
Es geht um das Baccaratspiel, bei dem nach diversen Regeln bis zu 6 Karten (3 für den Spieler, 3 für die Bank) gezogen werden.
Am Ende gewinnt wer mit seinen 2-3 Karten den größeren Wert hat.
(Wobei zu beachten sit dass hier modulo 10 gilt, also alle Kartenwerte zusammenzählen und mod 10 rechnen ergibt die Kartensumme.
Arbeite auch von Anfang an mit Kartenwerten 0-9 daher)
Jedenfalls, in einem ersten Schritt, wollte ich einfahc mal alle legitimen Endergebnisse eines Spiels in eienr Liste haben.
Also sowas wie (1 2 3, 4 5 6) wobei die ersten 3 Karten zum Spieler gehören, die letzten 3 Karten zur Bank.
je nachdem kann es sein dass bei Spieler oder Bank keine 3. karte gezogen wird. in dem Fall schreibe ich in die betreffende Stelle ne -1.
bspw. (2 4 -1, 8 7 4) heißt:
Spieler hat die 2 Karten 2 und 4 (Kartensumme=6, Spieler hat keine 3. Karte)
und Bank hat die Karten 8 7 und 4 (Kartensumme=(8+7+4)%10=9, Bank hat also eine 3. karte gezogen).
Um mir das Leben relativ leicht zu machen, habe ich mittels 6 for Schleifen einfahc mal ALLE möglichen Varianten für 6 Karten durchgegangen und in einer Liste gespeichert.
Dann gehe ich Alles in der Liste durch und schmeisse Alles raus, was keine "gültige" Endsituaiton gemäß Regeln ist.
Die dann verbleibende lsite müsste dann logischerweise alle möglichen gültigen Endsituationen enthalten.
Diese Liste speichere ich dann, Eintrag für Eintrag, in einer eingangs leeren .txt Datei.
So bisher mein Vorgehen.
Habe es durhclaufen lassen und in der Reslutierenden .txt Datei sind kuriose Sachen drin.
Mnche Kombination wie bspw (0 0 0,0 0 0) steht dort 7 mal drin statt einmal (keine Ahnung wie sowas passiert!).
Und andere Kombinationen die drinstehen, sind gemäß regeln unzulässig und hätten im "Remove" Schritte eigentlich shcon rausgechmissen worden sein müssen.
(Habe die eingebauten Regeln geguckt, die müssten stimmen!
Bspw ist in der Endliste ( 9 9 -1 , 9 9 9 ) drin was gegen die Allererste Regel in meiner Prüfmethode
((((a1 + a2) % 10 >= 8) || ((b1 + b2) % 10 >= 8)) && ((a3 >= 0) || (b3 >= 0)))
verstößt)
Kurzum, ich blicke nicht wo ich offensichtlich einen brachialen Denkfehler oder Prgrammierfehler drin habe bei dem Ganzen....
Oder habe ich den Iterator Teil nicht richtig gemacht?
Hier jedenfalls der Code der Hauptklasse "Test":
Die "EndGame" Objekte sind im Prinzip nur Objekten einer Klasse, in der ich ein int[2][3] mit einigen Methoden wie toString() und print() drin speichere.
Edit: Vielleicht wichtig zu erwähnen:
Wenn ich mittels new EndGame(int[2][3]) ein neues EndGame erzeuge, dann habe ich das gehardcoded dass da eine deep copy erzeugt wird.
Also an irgendwelchen ungewollten Referenzen, die ich nicht beachtet habe, sollte es eigentlich nicht liegen können. Hoffe ich :-/)
klingt wie immer umständlich was ich werkle aber ist es nicht.
Es geht um das Baccaratspiel, bei dem nach diversen Regeln bis zu 6 Karten (3 für den Spieler, 3 für die Bank) gezogen werden.
Am Ende gewinnt wer mit seinen 2-3 Karten den größeren Wert hat.
(Wobei zu beachten sit dass hier modulo 10 gilt, also alle Kartenwerte zusammenzählen und mod 10 rechnen ergibt die Kartensumme.
Arbeite auch von Anfang an mit Kartenwerten 0-9 daher)
Jedenfalls, in einem ersten Schritt, wollte ich einfahc mal alle legitimen Endergebnisse eines Spiels in eienr Liste haben.
Also sowas wie (1 2 3, 4 5 6) wobei die ersten 3 Karten zum Spieler gehören, die letzten 3 Karten zur Bank.
je nachdem kann es sein dass bei Spieler oder Bank keine 3. karte gezogen wird. in dem Fall schreibe ich in die betreffende Stelle ne -1.
bspw. (2 4 -1, 8 7 4) heißt:
Spieler hat die 2 Karten 2 und 4 (Kartensumme=6, Spieler hat keine 3. Karte)
und Bank hat die Karten 8 7 und 4 (Kartensumme=(8+7+4)%10=9, Bank hat also eine 3. karte gezogen).
Um mir das Leben relativ leicht zu machen, habe ich mittels 6 for Schleifen einfahc mal ALLE möglichen Varianten für 6 Karten durchgegangen und in einer Liste gespeichert.
Dann gehe ich Alles in der Liste durch und schmeisse Alles raus, was keine "gültige" Endsituaiton gemäß Regeln ist.
Die dann verbleibende lsite müsste dann logischerweise alle möglichen gültigen Endsituationen enthalten.
Diese Liste speichere ich dann, Eintrag für Eintrag, in einer eingangs leeren .txt Datei.
So bisher mein Vorgehen.
Habe es durhclaufen lassen und in der Reslutierenden .txt Datei sind kuriose Sachen drin.
Mnche Kombination wie bspw (0 0 0,0 0 0) steht dort 7 mal drin statt einmal (keine Ahnung wie sowas passiert!).
Und andere Kombinationen die drinstehen, sind gemäß regeln unzulässig und hätten im "Remove" Schritte eigentlich shcon rausgechmissen worden sein müssen.
(Habe die eingebauten Regeln geguckt, die müssten stimmen!
Bspw ist in der Endliste ( 9 9 -1 , 9 9 9 ) drin was gegen die Allererste Regel in meiner Prüfmethode
((((a1 + a2) % 10 >= 8) || ((b1 + b2) % 10 >= 8)) && ((a3 >= 0) || (b3 >= 0)))
verstößt)
Kurzum, ich blicke nicht wo ich offensichtlich einen brachialen Denkfehler oder Prgrammierfehler drin habe bei dem Ganzen....
Oder habe ich den Iterator Teil nicht richtig gemacht?
Hier jedenfalls der Code der Hauptklasse "Test":
Java:
import java.util.ArrayList;
import java.util.Iterator;
public class Test {
int[][] endplayfield = new int[2][3];
ArrayList<EndGame> EndList = new ArrayList<EndGame>();
txtManager txtendGames = new txtManager("EndGames");
public Test() {
built();
System.out.println("We got a total of " + EndList.size() + " EndGames before Trimming!");
removeFakes();
System.out.println("We got a total of " + EndList.size() + " EndGames after Trimming!");
saveToFile();
System.out.println("Saved all legit EndGames to File!");
}
public static void main(String[] args) {
new Test();
}
public void saveToFile() {
for (EndGame e : EndList) {
txtendGames.writeApp((e.toString() + System.lineSeparator()));
}
}
public void built() {
for (int a1 = 0; a1 <= 9; a1++) {
endplayfield[0][0] = a1;
for (int a2 = 0; a2 <= 9; a2++) {
endplayfield[0][1] = a2;
for (int a3 = -1; a3 <= 9; a3++) {
endplayfield[0][2] = a3;
for (int b1 = 0; b1 <= 9; b1++) {
endplayfield[1][0] = b1;
for (int b2 = 0; b2 <= 9; b2++) {
endplayfield[1][1] = b2;
for (int b3 = -1; b3 <= 9; b3++) {
endplayfield[1][2] = b3;
EndList.add(new EndGame(endplayfield));
}
}
}
}
}
}
EndList.trimToSize();
}
public void removeFakes() {
// System.out.println("ArrayList Before : " + EndList);
System.out.println("Now removing Fakes...");
Iterator<EndGame> itr = EndList.iterator();
int count = 0;
System.out.println("Going into while");
while (itr.hasNext()) {
EndGame e = itr.next();
if (!(isLegit(e))) {
System.out.print("Removing: ");
e.print();
count++;
System.out.println("Removed " + count + " EndGames so far!");
System.out.println();
itr.remove();
}
}
EndList.trimToSize();
// System.out.println("Out of while...");
// System.out.println("ArrayList After : " + EndList);
}
public boolean isLegit(EndGame e) {
int a1 = e.get(0, 0);
int a2 = e.get(0, 1);
int a3 = e.get(0, 2);
int b1 = e.get(1, 0);
int b2 = e.get(1, 1);
int b3 = e.get(1, 2);
// Natürlicher Sieg testen
if ((((a1 + a2) % 10 >= 8) || ((b1 + b2) % 10 >= 8)) && ((a3 >= 0) || (b3 >= 0))) {
System.out.println("Nat Sieg aber Karte gezogen");
return false;
}
// Spieler
// muss ziehen aber zieht nicht
if (((a1 + a2) % 10 <= 5) && (a3 < 0)) {
System.out.println("Spieler muss ziehen aber zieht nicht");
return false;
}
// muss halten aber zieht karte
if (((a1 + a2) % 10 == 6 || (a1 + a2) % 10 == 7) && (a3 >= 0)) {
System.out.println("Spieler muss halten aber zieht karte");
return false;
}
// Spieler zieht 3. Karte
if (a3 >= 0) {
if (((b1 + b2) % 10 <= 2) && (b3 < 0)) {
System.out.println("(b1 + b2) % 10 <= 2) && (b3 < 0)");
return false;
}
if ((b1 + b2) % 10 == 3) {
if ((a3 != 8) && (b3 < 0)) {
System.out.println("(b1 + b2) % 10 == 3) (a3 != 8) && (b3 < 0)");
return false;
}
if ((a3 == 8) && (b3 >= 0)) {
System.out.println("(b1 + b2) % 10 == 3) (a3 == 8) && (b3 >= 0)");
return false;
}
}
if ((b1 + b2) % 10 == 4) {
if ((a3 >= 2 && a3 <= 7) && (b3 < 0)) {
System.out.println("(b1 + b2) % 10 == 4(a3 >= 2 && a3 <= 7) && (b3 < 0)");
return false;
}
if (!(a3 >= 2 && a3 <= 7) && (b3 >= 0)) {
System.out.println("(b1 + b2) % 10 == 4 !(a3 >= 2 && a3 <= 7) && (b3 >= 0)");
return false;
}
}
if ((b1 + b2) % 10 == 5) {
if ((a3 >= 4 && a3 <= 7) && (b3 < 0)) {
System.out.println("(b1 + b2) % 10 == 5) (a3 >= 4 && a3 <= 7) && (b3 < 0)");
return false;
}
if (!(a3 >= 4 && a3 <= 7) && (b3 >= 0)) {
System.out.println("(b1 + b2) % 10 == 5) !(a3 >= 4 && a3 <= 7) && (b3 >= 0)");
return false;
}
}
if ((b1 + b2) % 10 == 6) {
if ((a3 == 6 || a3 == 7) && (b3 < 0)) {
System.out.println("(b1 + b2) % 10 == 6) (a3 == 6 || a3 == 7) && (b3 < 0)");
return false;
}
if (!(a3 == 6 || a3 == 7) && (b3 >= 0)) {
System.out.println("(b1 + b2) % 10 == 6) !(a3 == 6 || a3 == 7) && (b3 >= 0)");
return false;
}
}
if ((b1 + b2) % 10 == 7) {
if (b3 >= 0) {
System.out.println("(b1 + b2) % 10 == 7) (b3 >= 0)");
return false;
}
}
} else {
// Spieler zieht keine 3. Karte
// ...................................
// ....................................
// ::::::::::::::::::::::::::::::::::::
// ::::::::::::::::::::::::::::::::::::
// :::::::::::::::::::::::::::::::::::
if ((b1 + b2) % 10 <= 5 && b3 < 0) {
System.out.println("a3<0 (b1 + b2) % 10 <= 5 && b3 < 0");
return false;
}
if ((b1 + b2) % 10 >= 6 && b3 >= 0) {
System.out.println("a3<0 (b1 + b2) % 10 >= 6 && b3 >= 0");
return false;
}
}
return true;
}
}
Die "EndGame" Objekte sind im Prinzip nur Objekten einer Klasse, in der ich ein int[2][3] mit einigen Methoden wie toString() und print() drin speichere.
Edit: Vielleicht wichtig zu erwähnen:
Wenn ich mittels new EndGame(int[2][3]) ein neues EndGame erzeuge, dann habe ich das gehardcoded dass da eine deep copy erzeugt wird.
Also an irgendwelchen ungewollten Referenzen, die ich nicht beachtet habe, sollte es eigentlich nicht liegen können. Hoffe ich :-/)