Entwickler-Ecke

Open Source Projekte - Spiel 2048


Mathematiker - Do 27.03.14 23:29
Titel: Spiel 2048
Hallo,
nachdem user profile iconNersgatt unter http://www.entwickler-ecke.de/viewtopic.php?t=112876 das Spiel 2048 vorgestellt hat, mein Delphi 5 auch wieder "zu mir lieb" ist, d.h. fehlerfrei funktioniert, habe ich es gleich einmal versucht.

a2048

Im Anhang befindet sich der erste Versuch, das Spiel 2048 in Delphi umzusetzen.
Es ist noch stark verbesserungswürdig (Farben, Animation der Teile), dennoch hoffe ich, dass der Algorithmus zumindest richtig ist.
Viel Spaß beim Testen, Spielen. Schön wäre es, gebe es Verbesserungsvorschläge.

Beste Grüße
Mathematiker

Edit 1: kleinere Änderungen und Erklärung des Spiels.
Edit 2: jetzt mit Punktestand. Fehler bei "Neues Spiel" behoben, ebenso der von user profile iconHorst_H gefundene Fehler.
Edit 3: mit Originalversion und "meiner" Version zur Auswahl.
Edit 4: wahlweise auch mit Anzeige von Buchstaben statt Zahlen.
Edit 5: und nun auch mit unterschiedlich großen Spielfeldern.
Edit 6: auch nicht unmittelbar nebeneinander liegende Steine werden "vereinigt"; zweite, überflüssige Version entfernt.
Edit 7: eine noch sehr einfache Routine (Selbsttest) versucht eine Lösung zu ermitteln.
Edit 8: neue Version des Selbsttests (löst auch 5x5 "fast" immer).
Edit 9: Selbsttest mit 4 Züge Vorausberechnung (löst auch 4x4, aber ganz selten :cry: )
Edit 10: Algorithmus verbessert, so dass 4x4 häufiger, jedoch noch nicht immer, gelöst wird.
Edit 11: 5 Züge Vorausberechnung und die Lösung von 4x4 wird langsam häufiger.
Edit 12: Breite und Höhe des Spielfeldes können getrennt verändert werden.


Nersgatt - Fr 28.03.14 08:37

Hehe, hab ich mir doch gedacht, dass Du darauf anspringst... :D
Aber dass Du so schnell etwas vorweisen kannst, das hätte ich nicht gedacht... :zustimm:


Delete - Fr 28.03.14 08:55

user profile iconNersgatt hat folgendes geschrieben Zum zitierten Posting springen:
Hehe, hab ich mir doch gedacht, dass Du darauf anspringst... :D


Ich auch.


user profile iconNersgatt hat folgendes geschrieben Zum zitierten Posting springen:

Aber dass Du so schnell etwas vorweisen kannst, das hätte ich nicht gedacht... :zustimm:


Doch! Der Mathematiker kann das!


Horst_H - Fr 28.03.14 09:09

Hallo,

Schock, schwere Not!
Ich habe einfach stupide hintereinander hoch, rechts,runter,links gedrückt.
Jetzt hängt das Programm, weil nichts mehr geht. Das müßte das Programm doch erkennen.
Ein Zufallsbefund?

Gruß Horst


Nersgatt - Fr 28.03.14 09:18

Ich glaube, so ganz passt der Algo noch nicht, wenn man das verhalten des Originals zugrunde liegt.

Wenn bei Dir die Felder mitten im Spielfeld nebeneinander liegen und man schiebt sie an den Rand, dann vereinen sie sich nicht. Im Original vereinen sie sich dann aber.
Mal zur Verdeutlichung, auf das Wesentliche reduziert:

Ausgangsituation (x = leeres Feld):


Quelltext
1:
2:
3:
4:
x x x x
x 2 2 x
x x x x
x x x x


Tastendruck Pfeil nach rechts. Dannach sieht Dein Spielfeld so aus:

Quelltext
1:
2:
3:
4:
x x x x
x x 2 2
x x x x
x x x x

(und natürlich irgendwo ein neues Feld)

Erwarten würde ich, dass das Spielfeld aber so aussieht:

Quelltext
1:
2:
3:
4:
x x x x
x x x 4
x x x x
x x x x

(und natürlich irgendwo ein neues Feld)


Mathematiker - Fr 28.03.14 10:08

Hallo,
Danke erst einmal für die schnellen Reaktionen.
user profile iconHorst_H hat folgendes geschrieben Zum zitierten Posting springen:
Jetzt hängt das Programm, weil nichts mehr geht. Das müßte das Programm doch erkennen.
Ein Zufallsbefund?

Ja, das Programm müsste es erkennen. :autsch:
Und nun habe ich einen schlecht reproduzierbaren Fehler. Das mag ich "besonders". Also werde ich suchen.
Bisher erkennt das Programm das Spielende entweder bei Erreichen von 2048 oder aber wenn kein Feld mehr frei ist und benachbarte Felder horizontal oder vertikal alle verschieden sind. Wahrscheinlich habe ich etwas übersehen.

user profile iconNersgatt hat folgendes geschrieben Zum zitierten Posting springen:
Ich glaube, so ganz passt der Algo noch nicht, wenn man das verhalten des Originals zugrunde liegt.
Wenn bei Dir die Felder mitten im Spielfeld nebeneinander liegen und man schiebt sie an den Rand, dann vereinen sie sich nicht. Im Original vereinen sie sich dann aber.

Danke für den Hinweis. Genau, wie Du es beschreibst, hatte ich es ganz am Anfang, habe es aber geändert :nixweiss: , da ich glaubte, folgender Fall wäre dann irgendwie komisch.
Bei
8 2 2 4
und "nach rechts" müsste dann also bei einem Schritt
x x x 16
entstehen. Die 2 2 wird 4, 4 und 4 wird 8 und mit der zweiten 8 also die 16. Ist das im Original so? Ich weiß es nicht.
Leider gibt es scheinbar keine ausführliche Erklärung im "Original". Das Erzeugen von neuen Feldern ist auch so ein Problem: Wann und welche?
Im Moment "konstruiere" ich in 10% der Fälle ein Feld "4", sonst ein Feld "2". Ob das richtig ist, ...?

Auf jeden Fall werde ich heute Nachmittag einiges ändern.
Einen blöden Fehler habe ich ja auch noch: Bei Aufruf eines neuen Spiels wird das Spielfeld nicht sofort neu gezeichnet.
Das kommt davon, wenn man unbedingt schnell sein will. :hair:

Beste Grüße
Mathematiker


Nersgatt - Fr 28.03.14 10:18

user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:
da ich glaubte, folgender Fall wäre dann irgendwie komisch.
Bei
8 2 2 4
und "nach rechts" müsste dann also bei einem Schritt
x x x 16
entstehen.

Im Original setzt sich bei so einem Zug diese Vereinung NICHT fort.
aus 8 2 2 4 würde dann x 8 4 4
Es wir also immer nur einmal pro Zug vereint.

In der Anlage mal solch ein Beispiel. Nach dem ersten Bild wurde -> gedrückt.

Edit: vielleicht auch interessant: Aus 2 2 2 2 wird bei -> x x 4 4


Horst_H - Fr 28.03.14 10:31

Hallo,

Zitat:
Im Moment "konstruiere" ich in 10% der Fälle ein Feld "4"

Rein von der Logik her, würde ich vermuten, das eine 4 erscheint, weil keine 2 mehr auf dem Spielfeld ist.
Da habe ich aber nicht drauf geachtet.

Gruß Horst


Mathematiker - Fr 28.03.14 10:38

Hallo,
user profile iconNersgatt hat folgendes geschrieben Zum zitierten Posting springen:
Im Original setzt sich bei so einem Zug diese Vereinung NICHT fort.
aus 8 2 2 4 würde dann x 8 4 4

Alles klar. Damit muss ich "meinen" Algorithmus neu überdenken.
Ich vermute, ohne ein zweites Feld komme ich nicht mehr aus. Das wird aber (ich denke) heute noch.
Vielleicht mache ich ja zwei wählbare Varianten: die richtige, d.h. das Original, und "meine".

@Horst_H
Ich habe in der Version 2 den von Dir gefundenen Fehler korrigiert.
Ich hatte nicht berücksichtigt, dass man nur dann eine neue Zahl setzen kann, wenn auch wenigstens ein Feld leer ist. Damit blieb das Programm hängen, wenn es kein leeres Feld mehr finden konnte.

Beste Grüße
Mathematiker

Nachtrag: Es ging schneller, als ich dachte. In der Revision 3 sind jetzt die Originalversion und "meine", verfälschte Version auswählbar.
Nachtrag 2: Bei "Herumspielen" zeigt sich, dass die Originalvariante wesentlich besser ist. Man erreicht deutlich höhere Punktzahlen.


Sinspin - Fr 28.03.14 12:26

Habe ichs mir doch gedacht das du da drauf anspingst. Auf dich ist Verlass! Jetzt kann ich das Spielchen auch ohne Browser spielen.


Mathematiker - Fr 28.03.14 20:46

Hallo,
so nun habe ich erst einmal ein paar "wichtige" Erweiterungen durchgeführt.
In der Revision 5 kann man wahlweise auch Buchstaben an Stelle der Zahlen anzeigen lassen. Außerdem ist nun auch die Spielfeldgröße von 3x3 bis 8x8 einstellbar.
8x8 ist wahrscheinlich nur etwas für Leute, die gaaaaaaaaaaaaaaanz viel Zeit haben. :wink:

Beste Grüße
Mathematiker


Horst_H - Fr 28.03.14 22:23

Hallo,

das 8x8 Feld ist im Gegenteil besonders schnell mit sinnlosem "Reihumgeklicke" zu schaffen.
Aus einem 4x4 = 16 Feld ist es doch enorm viel schwieriger 2^11 zu erreichen, denn man braucht ja auch den Platz für deren Vorgänger und diese noch im passendem Nachbarschaftsverhältnis.
Ein 8x8 Feld hat praktisch 64-16=48 Plätze mehr.

Ich habe mal versucht eine Automatik/Heuristik einzubauen.
Die ist ganz simpel.Ich probiere nur jede Richtung einmal aus und wähle die, die nach Auswertung die meisten freien Stellen hat.Ich komme damit aber nicht einmal auf die 2048 :-(
Die Punktezahl steigt ja mit jedem Zug nur um die neu hinzukommende 2 bzw. 4.
Innerhalb einer Bewegung bleibt sie ja konstant ( Ich habe mich gewundert, warum die Punkte ständig neu berechnet werden.Eine unbedeutende Kleinigkeit )

Gruß Horst


Mathematiker - Sa 29.03.14 10:05

Ich "hasse" dieses Spiel.
Ich habe fast die ganze Nacht sinnlos auf den Tasten 'rumgedrückt und nur ein(!) Mal eine 1024 erreicht.
user profile iconHorst_H hat folgendes geschrieben Zum zitierten Posting springen:
Ich habe mal versucht eine Automatik/Heuristik einzubauen.
Die ist ganz simpel.Ich probiere nur jede Richtung einmal aus und wähle die, die nach Auswertung die meisten freien Stellen hat.Ich komme damit aber nicht einmal auf die 2048 :-(

Aus Frust habe ich es auch versucht, mit der gleichen Strategie. Und wie zu erwarten, wird es nichts. Ich bekam nicht mal eine 1024.

Was ist das bloß für ein "böses" Spiel? :evil: Kostet Zeit und frustriert!

Beste Grüße
ein müder Mathematiker


Horst_H - Sa 29.03.14 11:01

Hallo,

ich habe es nur unter Lazarus zu laufen ( umgemodelte Version 3 )und da ist es recht lahm mit etwa 250 Spielen ( bis ende= true) pro Sekunde.
Einfach richtung := random(4); ist erheblich schneller, aber kommt nicht so schnell in höhere Regionen.
Man könnte ja, wie bei Schachmatt, einfach mal alle möglichen 3 Züger durch deklinieren und dann schauen welcher Zug den Zweig mit den meisten freien Stellen hat.
Das macht aber nur im "Endspiel" Sinn, wenn noch 3 oder 4 frei sind.Sonst rechnet man sich ja einen Wolf.
Pro leerem Feld hat man 2 Werte und 4 Richtungen sind bei 4 freien Stellen 32 Möglichkeiten. Bei 3 Zügen, wenn grob geraten die Anzahl der freien Felder konstant bleibt 32*32*32 = 32768 mal Auswertung aufrufen ist nicht der Bringer.
Ich glaube das Mototrrad muß am Montag zum TÜV und braucht frische Luft,

Gruß Horst


Sinspin - Sa 29.03.14 11:02

Das ist wie ein einarmiger Bandit. Freue dich, das dir nur Zeit gestohlen wird. Wenn dir die Option geboten würde gegen ein paar Cent weiter zu kommen, würdest du es probieren?


Mathematiker - Sa 29.03.14 23:05

Hallo,
user profile iconSinspin hat folgendes geschrieben Zum zitierten Posting springen:
Wenn dir die Option geboten würde gegen ein paar Cent weiter zu kommen, würdest du es probieren?

Nein, auf keinen Fall. Für Spiele und S.. bezahlt man doch nicht. :wink:
Das letzte Spiel, das ich bezahlt habe, war "Lemminge" im letzten Jahrtausend!
Ich habe heute noch 10 Minuten erfolglos probiert und nun gebe ich auf. Hat jemand noch eine andere Spielidee, die ich lösen kann. :bawling:

Beste Grüße
Mathematiker


Delphi-Laie - So 30.03.14 15:48

Hallo Mathematiker, fein, daß es bezügliches Deines Programmierenthusiasmus' eine Art Frühlingserwachen gibt.

Ich war knapp 2 Tage nicht "auf Linie", stelle aber fest, daß meine Anregungen (die mit den Buchstaben statt Zahlen war nur für die Mathematikhasser gedacht) vollautomatisch schon umgesetzt wurden.

Dafür und überhaupt für die Umsetzung dieser Spieliedee (die auf der Internetseite leider nicht in jedem Browser läuft) einfach mein herzliches Dankeschön!


Delphi-Laie - So 30.03.14 15:54

user profile iconNersgatt hat folgendes geschrieben Zum zitierten Posting springen:
Aber dass Du so schnell etwas vorweisen kannst, das hätte ich nicht gedacht... :zustimm:


Das wundert mich nicht mehr. Nachdem zwischen einer meiner Ideen und seiner Umsetzung nur eine Nacht verging, macht mich unser Programmiergenie nicht mehr sprachlos. ;-)


Sinspin - So 30.03.14 21:00

Deine "Orginalversion" verhält sich nicht genau wie das Orginal. Dort werden keine neuen Teile generiert wenn sich nach dem drücken einer Taste die Position keines Teiles ändert. Des weiteren werden zwei Teile die bei einem Zug aufeinander treffen vereint, falls sie beim Start des Zuges noch nicht vereint waren.
Der erste Unterschied macht deine Umsetzung in gewisser Weise leichter spielbar, da man sich den Sammelplatz nicht zumüllt um durch das verschieben der Teile ein neues zu bekommen, wovon dann meißt mindestens eins unpassend auftaucht.

€ Schreibfehler behoben :autsch:


Mathematiker - So 30.03.14 21:56

Hallo,
user profile iconSinspin hat folgendes geschrieben Zum zitierten Posting springen:
Deine "Orginalversion" verhält sich nicht genau wie das Orginal. Dort werden keine neuen Teile generiert wenn kein nach den drücken einer Taste sich die Position keines Teiles ändert. Des weiteren werden zwei Teile die bei einem Zug aufeinander treffen vereint, falls sie beim Start des Zuges noch nicht vereint waren.

Danke für die Hinweise.
Ich gestehe, dass ich das Original nur ganz kurz gespielt habe. Damit habe ich das von Dir Genannte übersehen. :autsch:
Ich werde sehen, was ich im Programm ändern kann.
Gerade der 2.Punkt dürfte das Spielen auch einfacher machen, da, zumindest am Anfang, weniger Teile neu generiert werden.

Beste Grüße
Mathematiker


Mathematiker - Mo 31.03.14 13:16

Hallo,
in der Revision 6 habe ich wichtige Änderungen durchgeführt.
Erstens habe ich die überflüssige, zweite Version entfernt; und weiterhin ...
user profile iconSinspin hat folgendes geschrieben Zum zitierten Posting springen:
Des weiteren werden zwei Teile die bei einem Zug aufeinander treffen vereint, falls sie beim Start des Zuges noch nicht vereint waren.

Das funktioniert nun auch.

user profile iconSinspin hat folgendes geschrieben Zum zitierten Posting springen:
Dort werden keine neuen Teile generiert wenn kein nach den drücken einer Taste sich die Position keines Teiles ändert.

Habe ich erst einmal nicht geändert, da ich meine Variante besser finde.

Beste Grüße
Mathematiker


Sinspin - Mo 31.03.14 14:39

user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:

user profile iconSinspin hat folgendes geschrieben Zum zitierten Posting springen:
Dort werden keine neuen Teile generiert wenn kein nach den drücken einer Taste sich die Position keines Teiles ändert.

Habe ich erst einmal nicht geändert, da ich meine Variante besser finde.

In der Version die Du als "Orginal" bezeichnest musst Du das aber schon ändern ;-) sonst ist es ja nicht das Orginal.

Wie hast Du das mit den vielen Fehlern :autsch: drinne überhaupt verstehen können?

Moderiert von user profile iconTh69: Quote korrigiert


Horst_H - Mo 31.03.14 14:50

Hallo,

ich habe mal links1Click automatisiert und zufällige Richtung nehmen lassen.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure Tf2048.links1Click(Sender: TObject);
begin
  repeat
    richtung:=random(4);
    auswertung(sender);
  until ende or geschafft;
end;

Ab 6x6 Feldern kommt er auf zügig auf 2048 :-) ( 2552 Punkte bis dahin )

Die Punkteanzeige würde ich durch Zugzahl ersetzen, weil es fast das gleiche ist.
Denn im Schnitt sind es pro Zug ( 0.9*2+0.1*4= ) 2.2 Punkte, die hinzukommen.
Ich weiß nicht, wie im Original, die Punkte berechnet werden, und will mir jetzt auch nicht die .js Datei ansehen, aber da erscheinen andere Zahlen.
Vielleicht sollte man hohe erreichte Potenzen belohnen.Momentan sind zwei 8er soviel wie ein 16er.
Nähme man 3^Zweierpotenz würde sich das Bild verschieben. 2* 3^3 = 54< 3^4 = 81.
Natürlich ginge auch das leichtere 4^Zweierpotenz.
Man könnte auch aus das 2* verzichten und einfach nur um 1 erhöhen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
                    feld[j,i]:=2*feld[j,i];
//dann eben
                    inc(feld[j,i]);

damit wäre auch:
 case feld[i+1,j+1of
          2 : ziel.brush.color:=$00ffd0d0;
          4 : ziel.brush.color:=$00ffa0a0;
..

       2048 : ziel.brush.color:=$00a0ffff
nur noch
 case feld[i+1,j+1of
          1 : ziel.brush.color:=$00ffd0d0;
          2 : ziel.brush.color:=$00ffa0a0;
          3 : ziel.brush.color:=$00ff8080;
..
         11 : ziel.brush.color:=$00a0ffff
Oder
ziel.brush.color := Colorliste[feld[i+1,j+1]];
// Man könnte auch die kleinen Ausgabequadrate vorher erstellen, da jeder wert auch seine spezifische Farbe hat.
AusgabeBmp := AusgabeBmpliste[feld[i+1,j+1]];

Man merkt Lazarus mach die Grafikausgabe bei mir etwas langsam ;-)

Gruß Horst


Mathematiker - Mo 31.03.14 16:53

Hallo,
user profile iconSinspin hat folgendes geschrieben Zum zitierten Posting springen:
In der Version die Du als "Orginal" bezeichnest musst Du das aber schon ändern ;-) sonst ist es ja nicht das Orginal.

Richtig. Deshalb steht da auch nichts mehr von "Original" im Formular. Es ist einfach "Spiel 2048". :wink:
user profile iconSinspin hat folgendes geschrieben Zum zitierten Posting springen:
Wie hast Du das mit den vielen Fehlern :autsch: drinne überhaupt verstehen können?

So viele Fehler hatte ich doch gar nicht oder meinst Du den Quelltext des Originals.
Auch wenn Du es vielleicht nicht glaubst, habe ich ihn mir gar nicht angesehen. Ich versuche immer meine eigene Lösung zu finden. Deshalb hatte ich ja auch die Strategie des "Originals" nicht vollkommen richtig umgesetzt.

user profile iconHorst_H hat folgendes geschrieben Zum zitierten Posting springen:
ich habe mal links1Click automatisiert und zufällige Richtung nehmen lassen.
... Ab 6x6 Feldern kommt er auf zügig auf 2048 :-) ( 2552 Punkte bis dahin )

Ist sehr interessant, versuche ich auch gleich einmal.
user profile iconHorst_H hat folgendes geschrieben Zum zitierten Posting springen:
Vielleicht sollte man hohe erreichte Potenzen belohnen.

Ist auch sehr überdenkenswert.
Ebenso habe ich schon überlegt, ob man bei 5x5-Feld schon 4096, beim 6x6-Feld 9192 usw... als Ziel setzt. Dann müssten die neu generierten Teile aber auch höhere Wert haben.

Beste Grüße
Mathematiker


Sinspin - Mo 31.03.14 19:26

@user profile iconMathematiker : Nene, ich meinte meinen verworrenen Satz. Passiert mir öfter in letzter Zeit, wohl weil ich kaum noch zum deutsch reden komme.
@user profile iconHorst_H : Die Punktevergabe im Orginal scheint eigentlich ganz simpel (habe den Quelltext nicht angesehen). Es wird einfach der Betrag des Teils das man mit einem anderen zusammenschiebt aufsummiert. Also zum Beispiel bei der Zugfolge : Teil+Teil (Summe der Punkte) 2+2 (4); 2+2 (8 ); 4+4 (16); 2+2 (20); 2+2 (24); 4+4 (32); 8+8 (50);

€: wiedermal Tippfehler behoben.


Mathematiker - Mo 31.03.14 22:25

Hallo,
auf Grund der Ideen von user profile iconHorst_H habe ich versucht, in der Revision 7 eine noch sehr einfache Routine (Selbsttest) einzubauen, die automatisch nach einer Lösung sucht.

Die Idee ist im Moment noch sehr einfach. Das Programm führt immer den Zug aus, bei dem möglichst viele Steine zusammengeschoben werden können. Gibt es keine Möglichkeit, dann wird zufällig gezogen.
Ab einer Spielfeldgröße 6x6 wird nahezu immer eine Lösung gefunden, bei 5x5 nur selten, bei 4x4 nie.
Das Suchverfahren ist also schlecht.

Die Hauptschwierigkeit ist, dass man ja nicht vorhersagen kann, wo ein neuer Stein erzeugt wird und welcher (2 oder 4). Außerdem ist eine "Suchtiefe" (die man so gar nicht nennen dürfte) von 1 viel zu wenig.
Aber vielleicht fällt mir ja noch etwas ein.
Übrigens: Wenn Ihr den Selbsttest startet, so müsst Ihr warten, bis er fertig wird. Ich habe noch keine Abbruchmöglichkeit eingebaut. :cry:

Beste Grüße
Mathematiker


Mathematiker - Di 01.04.14 10:15

Hallo,
in der Revision 8 habe ich den Selbsttest, d.h. der Computer sucht selbst nach einer Lösung, deutlich verändert.
Dabei werden jeweils 3 Züge im voraus getestet und der scheinbar optimalste ausgewählt. Optimal ist dabei ein Zug, wenn möglichst viele Felder leer werden.
Gibt es einen solchen Zug nicht, wird zufällig gezogen.

Die Hauptschwierigkeit besteht darin, dass man die neu generierten Felder natürlich nicht vorhersagen kann. Da sehe ich im Moment auch keine Lösungsmöglichkeit.
Zumindest löst das Programm nun 5x5-Felder "fast" immer, d.h. die 2048 wird erreicht. "Fast" immer sage ich, da bei meinen Testläufen immer ein Ergebnis kam, ich es aber nicht garantieren kann.

Merkwürdig finde ich, dass ich bei dem Standardfeld 4x4 immer noch nicht in die Nähe der 2048 komme. Die beste Gesamtpunktzahl war bisher 1802.

Beste Grüße
Mathematiker

Nachtrag: Ich habe jetzt einmal 4 Züge Vorhersage (Revision 9) probiert. Durch den Zufall bei der Erzeugung neuer Steine wird die Streuung der erreichten Gesamtpunktzahlen deutlich größer. Nun bekomme ich bei einem 4x4-Feld auch wieder Werte von nur 500.
Nun gut. Der maximale Wert waren jetzt 2032 Gesamtpunkte. Ich denke aber, mit der Erhöhung der Zugtiefe wird es wohl nichts. Irgendwie brauche ich eine neue Idee.
Wenigstens einmal sollte ich doch die 2048 auf einem Stein erreichen. :motz:

Nachtrag 2: Geschafft! 4x4-Feld mit einem 2048-Stein, bei 4 Züge Vorausberechnung.

Nachtrag 3: In Revision 10 ist der Suchalgorithmus verbessert. Damit wird das 4x4-Feld etwas häufiger, allerdings noch lange nicht immer gelöst.


Horst_H - Di 01.04.14 13:40

Hallo,

jau, es hat geklappt!
Ich habe auf 5 Züge umgebaut ( Was für ein Geniestreich ;-) ).
2048 mit Punktestand 2148(jetzt sogar 2098 ) erreicht.
Je weniger, desto besser.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure Tf2048.Button2Click(Sender: TObject);
var arichtung:array[0..3,0..3,0..3,0..3,0..3of integer;
...
//Maximum kann man währenddessen prüfen, schon wieder 1 ns gespart
     maximum:=0;
     for i:=0 to 3 do
       for j:=0 to 3 do
         for m:=0 to 3 do
           for n:=0 to 3 do
             for o:=0 to 3 do
             begin
               arichtung[i,j,m,n,o]:=zaehlen(i,j,m,n,o);
               if arichtung[i,j,m,n,o]>maximum then
               begin
                 maximum:=arichtung[i,j,m,n,o];
                 neuerichtung:=i;
               end;
             end;

Noch eine kleine Anmerkung.Warum zweimal der Aufruf paintBox1paint in Auswertung.
Ich wollte testabbruch benutzen, um die Ausgabe dort zu unterdrücken und alle 64 Testzüge eine zu machen.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
//proc Auswertung. Ausgaben ans Ende gesetzt
    label2.caption:=inttostr(punkte);
    If testabbruch then
    begin
      paintbox1paint(sender);application.processmessages;
      sleep(10);
    end;

end;...

// in Button2Click
     if schritte AND 31 = 0 then
     begin
      paintbox1paint(sender);application.processmessages;
      sleep(10);
     end;

Häufig sind die 2048er immer noch nicht.Aber offensichtlich machbar.

Gruß Horst


Mathematiker - Di 01.04.14 13:58

Hallo,
user profile iconHorst_H hat folgendes geschrieben Zum zitierten Posting springen:
Ich habe auf 5 Züge umgebaut ( Was für ein Geniestreich ;-) ).
2048 mit Punktestand 2148(jetzt sogar 2098 ) erreicht.
Je weniger, desto besser.

Das ist wieder ein Schritt. Die Lösungsquote für 4x4 steigt langsam an. Ich hatte gerade eben sogar 2092 als Gesamtpunktzahl.
Ich denke, dass wir nicht mehr viel herausholen können. Der Zufallsanteil ist zu groß.

In die Revision 11 habe ich außerdem ein Markierungsfeld eingebaut mit dem man dafür sorgt, dass neu erzeugte Felder nur eine "2" und keine "4" tragen.
Nach meinem ersten Gefühl bringt das aber nichts.

user profile iconHorst_H hat folgendes geschrieben Zum zitierten Posting springen:
Noch eine kleine Anmerkung.Warum zweimal der Aufruf paintBox1paint in Auswertung.

Danke. Ich weiß auch nicht, warum ich das drin hatte. Mit nur einem paintboxpaint läuft auch die automatische Suche deutlich schneller.

Beste Grüße
Mathematiker

Nachtrag: Ich habe das Programm 100 mal nach der 4x4-Lösung suchen lassen. 31 mal wurde eine Lösung gefunden.


Horst_H - Di 01.04.14 14:06

Hallo,

Der Frust vom 29.3ten ist jetzt wohl überwunden ;-)
Zitat:
Aus Frust habe ich es auch versucht, mit der gleichen Strategie. Und wie zu erwarten, wird es nichts. Ich bekam nicht mal eine 1024.
Was ist das bloß für ein "böses" Spiel? Kostet Zeit und frustriert!


Gruß Horst


Mathematiker - Di 01.04.14 21:47

Hallo,
so jetzt folgt schon die 12.Revision.
Ich habe mich gefragt, warum das Spielfeld quadratisch sein muss. Also habe ich es geändert.
Breite und Höhe des Spielfeldes können jetzt getrennt verändert werden.

Während das Programm bei 4x4 nicht immer selbständig eine Lösung findet, sieht es bei 3x6 ziemlich gut aus. D.h., 16 Felder sind für den Suchalgorithmus nicht immer ausreichend. 18 genügen aber.

Beste Grüße
Mathematiker

PS: Jetzt ist erst einmal Schluss mit "2048". Ich träume ja schon fast davon.


Gummibär - Mi 02.04.14 07:42

Ganz nebenbei:
Weil hier immer von "Original" gesprochen wird: Auch 2048 scheint nur der Klon eines Klones zu sein.
Auf techcruch [http://techcrunch.com/2014/03/24/clones-clones-everywhere-1024-2048-and-other-copies-of-popular-paid-game-threes-fill-the-app-stores/] gibt es einen kleinen Artikel dazu.
Schon faszinierend, wie sowas manchmal läuft.

Gruß und danke für das Spielchen
Michael


FinnO - Do 10.04.14 20:57

Servicelink ;) Mathematik und Strategie hinter 2048.

https://www.youtube.com/watch?v=OO4tA5i7X9g&feature=youtu.be


Horst_H - Sa 19.04.14 15:56

Hallo,

viel Neues brachte das Video nicht, Dr. Who statt A..K ist ja nur eine andere Variante.
Auch sieht man bei dem Löser vom [ueser]mathematiker[/user], dass "in eine Ecke" gespielt wird.Aber das ergibt sich automatisch, wenn man zu einander senkrechte Bewegungen auf einander folgen lässt. ( v oder ^ gefolgt von > oder < oder umgekehrt.Wenn man immer rechts/ oben drückt ist auch wirklich alles rechts oben ;-)
Aber man sollte mal die 8192 probieren.
Selbst in der neuen c't 10/2014 S.182 steht schon was dazu drin.

Gruß Horst
P.S
Die Art und Weise, die Position des neuen Teiles durch Zufall zu bestimmen gefällt mir gar nicht, ist aber wahrscheinlich nur eine marginale Bremse, wenn 50% der Felder frei, denn die Verwaltung der freien Plätze ist wohl auch nicht ohne.