TicTacToe gewinnstellungen

seji

Mitglied
Hallo zusammen,

ich hab ein problem und ich wieß absolut nicht weiter. Also ich muss von der schule aus ein projekt in Java machen. Und zwar muss TicTacToe als Servlet das dann nachher auf einem tomcat server läuft.

Man spielt gegen den computer und nicht gegen eine andere person. Die Gewinnstellungen sollen in einer DB stehen, womit dann geprüft werden soll ob man gewonnen hat. Soweit hört sich das für die mesten hier recht einfach an :) In meiner datenbank stehen insgesamt 16 gewinnstellungen (jeweils 8 für X und O).

Wenn man also XXX(feld1,feld2,feld3) setzt wird auch gemeldet das man gewonnen hat. nur wenn man z.B erst feld1,feld2,feld4 und dann erst feld 3 setzt geht nicht mehr weil es ja nun insgesamt 4X sind und so eine gewinnstellung steht naürlich nicht in der DB.

So nun meine frage: Wie kann ich das prüfen OHNE das ich alle ca. über 1000 möglichen gewinnstellung manuell in die DB schreibe?

Ich wäre eucht dankbar wenn hier jemand ne idee hat.

Den Code könnt ihr euch hier anschauen(sind 2 Klassen):
- "Frontend" --> http://rafb.net/p/pPB7oY72.html
- Methoden --> http://rafb.net/p/Fvl3GG72.html

Die DB sieht so aus:

pckqlv.jpg

spielervl0n.jpg


Ich hoffe ich habs verständlich erklärt. Vielen Dank schonmal für die mühe.

Gruß Seji
 
Hmm sieht sehr umständlich aus..

1. Möglichkeit : extremes Kürzen der DB. Alle Möglichkeiten werden im Binärprinzip eingetragen. Die Binärreihe wird von oben links nach unten rechts aufgeschlüsselt, so dass eine gewonnene Reihe "oben Waagerecht" so kodiert wäre :

111000000

Da es gar nicht so viele Möglichkeiten gibt ( 8 wenn ich richtig zähle), ist die Arbeit schnell getan.

Beispiele:
Gewonnen Diagonal steigend : 001010100
Gewonnen Senkrecht Mitte : 010010010


2. Möglichkeit ( aus der aktuellen c't ) : Man gibt jedem Feld einen besonderen Wert, so dass sich ein magisches Quadrat ergibt, wo die Addition der Gewonnen-Felder 15 ergibt. Nun wird nach jedem Zug gezählt, ob der Spieler mit den gesetzten Punkten eine Punktzahl von genau 15 erreichen kann. Wenn dies der Fall ist, hat er gewonnen. Wenn also 4 Züge gemacht sind, müssen 3 der 4 Züge 15 ergeben.

2 9 4
7 5 3
6 1 8

Summa: Die erste Möglichkeit sollte die richtige sein, und diese Liste gilt für beide Seiten, wenn die gesetzten Punkte in Binärumwandlung einem Eintrag entsprechen, hat derjenige gewonnen.

mfg chmee
 
Hallo,
danke für deine antwort. Zur ersten Lösungsmöglichkeit. Ich verste den unterschied zu meiner jetztigen "lösung" nicht. Ist dann doch genau das selbe problem. Wenn jetzt jemand

1 (feld1) 1 (feld2) 1 (feld3) 1 (feld4) 0 (feld5) 0 (feld6) 0 (feld7) 0 (feld8) 0 (feld9) setzt?

also erst feld1 dann feld2 dann feld4 und dann erst feld3 hast man doch das selbe problem. der zweite lösungsansatz hört sich sehr interesant an.
darüber denke ich mal mal nach. Danke nochmal für deine flotte antwort.

Gruß Seji

PS: wenn jemand noch andere idee hat, immer her damit^^
 
Zuletzt bearbeitet:
Wenn ich das jetzt recht zusammenkaue, ist Möglichkeit 1 eine einfache boole'sche (logische) AND-Operation !

-> Gesetzte Felder AND DB-Eintrag = DB-Eintrag -> Dann gewonnen !
-> 11110000 AND 111000000 = 111000000 !

Link:
http://de.wikipedia.org/wiki/Boolesche_Algebra
http://www.datasource.de/programmierung/tab02_wahrheitstabellen.html

mfg chmee

p.s.: Wenn die Aufgabe "mit DB" lautet, wird Dir Möglichkeit 2 nix bringen, aber Du wirst damit Sonderpunkte beim Lehrer abgreifen könne, indem man das Spielprinzip mit dem magischen Quadrat erklärt :)
 
Lies Dir bitte die Logischen Operationen durch, die gibt es in jeder Sprache, da sie Basis der Mikroprozessortechnik sind.

Logische Operationen vergleichen 2 Zustände und geben anhand des Operators eine Aussage, ob die Operation Wahr oder Falsch ist. Die UND-Verknüpfung ist Wahr, wenn beide zu vergleichenden Zustände auch wahr sind ( 1 UND 1 = 1 ). Diese Operation kann man auch auf mehrere Bitstellen anwenden, und als Ergebnis bleiben die Bitstellen übrig, die in beiden Operanden als Wahr gekennzeichnet sind.

binäre Beispiele :

1 UND 0 = 0
0 UND 0 = 0
10 UND 10 = 10
10 UND 11 = 10
11 UND 11 = 11
10101 UND 11100 = 10100

mfg chmee
 
Hi,

ich habe selbst mal ein TTT für eine n * m Matrix, welche zur Laufzeit änderbar war,
geschrieben.

Meine Lösung erlaubte zusätzlich zu konfigurieren, ob 3, 4, 5 oder n aufeinanderfolgende Felder Gewinnstellungen bieten sollten.

Gelöst habe ich es, indem die Felder Objekte waren, welche ihre Umgebung
geprüft haben. War z.B. nach einem Zug ein Feld diagonal unterhalb gesetzt worden,
wurden die darauf angrenzenden Felder geprüft (diagonal in diesem Fall, seitlich, ober und unterhalb in anderen Fällen).

Etwas anspruchsvoller wird es dann, wenn man das auf die Laufzeit hin optimieren möchte, sprich: Es sollte festgelegt werden, ab wo geprüft wird (also nur die betroffen Felder reagieren bzw. prüfen).

Am einfachsten prüft man von dem gerade gesetzten Feld aus.

Grüße, Tim
 
Zuletzt bearbeitet:
Zurück