Autor Beitrag
Mathematiker
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1447

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Do 27.03.14 23:29 
Hallo,
nachdem user profile iconNersgatt unter www.entwickler-ecke....ewtopic.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.
Einloggen, um Attachments anzusehen!


Zuletzt bearbeitet von Mathematiker am Di 01.04.14 21:43, insgesamt 14-mal bearbeitet

Für diesen Beitrag haben gedankt: Anika, Delphi-Laie, Gummibär, Hidden, kolibri95, LittleBen, Nersgatt
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: 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:

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1652
Erhaltene Danke: 243

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: 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

Für diesen Beitrag haben gedankt: Mathematiker
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: 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):

ausblenden 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:
ausblenden 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:
ausblenden 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)

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)

Für diesen Beitrag haben gedankt: Mathematiker
Mathematiker Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1447

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: 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
Einloggen, um Attachments anzusehen!
_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)

Für diesen Beitrag haben gedankt: Mathematiker
Horst_H
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1652
Erhaltene Danke: 243

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1447

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1321
Erhaltene Danke: 117

Win 10
RIO, CE, Lazarus
BeitragVerfasst: 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.

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
Mathematiker Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1447

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1652
Erhaltene Danke: 243

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: 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

Für diesen Beitrag haben gedankt: Mathematiker
Mathematiker Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1447

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1652
Erhaltene Danke: 243

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1321
Erhaltene Danke: 117

Win 10
RIO, CE, Lazarus
BeitragVerfasst: 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?

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
Mathematiker Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1447

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1321
Erhaltene Danke: 117

Win 10
RIO, CE, Lazarus
BeitragVerfasst: 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:

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?


Zuletzt bearbeitet von Sinspin am Mo 31.03.14 14:44, insgesamt 1-mal bearbeitet

Für diesen Beitrag haben gedankt: Mathematiker
Mathematiker Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1447

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: 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