Tagebuch: Yeb - ein kleines Puzzlegame

Okay, dann will ich auch mal ein kleines Tagebuch anfangen. Ich arbeite schon länger an einem etwas komplexerem Kartenspiel, und habe erst einmal zum einfachen Testen einen JavaFX-Client verwendet. Eigentlich hätte ich gern ein Spiel, das gut aussieht und im Browser läuft. Allerdings wird noch einiges Wasser den Strengbach runterfließen, eh davon etwas zu sehen sein wird.

Wie es der Zufall will, ist mir die Idee zu einem Puzzle-Spiel gekommen, das wesentlich einfacher zu schreiben ist, und als Single-Player-Spiel der ideale Testballon ist, um einmal libGDX auszuprobieren. Wenn alles so läuft, wie ich es mir denke, habe ich am Ende ein kleines Open-Source Browser-Spiel, und die Erfahrung, ob libGDX eine echte Alternative für mein größeres Projekt ist.

Das vom “LibGDX Project Setup Tool” generierte Projekt läuft nach ein bisschen Hakelei unter IntelliJ IDEA sowohl als Desktop-App wie auch im Browser (Android und iOS sind “Non-Goals”).

Nächste Schritte:

  • GitHub Projekt erstellen
  • Menü- und Game-Screen anlegen
  • Im Game-Screen etwas animieren und auf Input reagieren
  • Speichermöglichkeiten untersuchen

Worum es bei Yeb geht, wird noch nicht verraten, aber der Name kommt von “yarn” + “web”, und mit dem Y hat es auch seine Bewandnis…

Hmm … noch hab ich keine Ahnung was du dir ausgedacht hast. Bin aber mal gespannt :slight_smile:.

Ein paar Ideen von mir:

  • LocalStorage vom Browser verwenden
  • Viele Spiele verwenden hierfür etwas, was ausschaut wie ein base64-encodierter json-string. Den als Datei downloadend/speichern. Laden ist dann einfach über Dateiupload/Textinput
  • Etwas aufwändiger aber: Du schreibst dir einen Server und erlaubst Benutzerregistrierung.

Das ist zumindest das, was ich von Browsergames her kenne. Gängige Lösungen die funktionieren. Und für die Desktop-anwendung nimmst du halt nicht den localStorage sondern speicherst es einfach direkt auf die Festplatte. Die anderen 2 Punkte wären unabhängig von der Plattform.

1 „Gefällt mir“

Ich bin zwar noch ganz am Anfang, aber hier ist das GitHub-Projekt:

Ich kann Linien und Kreise malen, als nächstes muss ich mir anschauen, wie man “ordentlich” auf Input reagiert. Danach kommt der lustige Teil mit viel Rechnerei, dann sieht man auch, worum es geht…

Jetzt bin ich so weit, dass ich schon mal die ersten Screenshots zeigen kann. Gegeben sind die blauen Punkte, zwischen denen man Linien zeichnen kann. Diese sind immer unterteilt, und auch die grünen Teilungspunkte können verbunden werden. Hier eine einfache Verbindung der beiden linken Punkte (nicht an dem Rot stören, so markiere ich erst mal Punkte, bis ich das Drag-and-Drop implementiert habe):

Wenn man nun die Punkte in Form eines H verbindet, passiert ganz automatisch das:

Und das ist auch die Grundidee des Puzzles: Finde das kürzeste Verbindungsnetz zwischen allen blauen Punkten. Die Mathematik dahinter: https://de.wikipedia.org/wiki/Steinerbaumproblem

Da das Spiel ja auch im Browser laufen soll und du Github verwendest, würde ich dir das hier empfehlen:

Damit kannst du einfach dein Spiel auf github hosten ohne wirklichen Aufwand und wir könnten sehr einfach die neueste Version testen :slight_smile:

Dafür braucht es noch ein kleines bisschen, aktuell ist es nicht wirklich spielbar.

Tja, da hatte ich mir ein schönes Ei gelegt. Meine GWT-Tage (oder besser gesagt Vaadin-Tage) liegen schon etwas zurück, deshalb war mir nicht in den Sinn gekommen, dass GWT Java-Sourcen (und nicht Byte-Code) braucht. Also nix mit Kotlin.

Für mein Kartenspiel wäre das nicht so schlimm, da dort die Logik zum großen Teil serverseitig liegt, und da kann ja weiter Kotlin benutzt werden.

Bei der Übersetzung von Yeb zurück nach Java habe ich gleich vavr.io verwendet, was auch GWT-fähig sein sollte (es gibt ein vavr-gwt-Modul), konnte es aber noch nicht zum Laufen bringen. Werde noch mal rumbasteln, notfalls muss ich nach Hilfe rufen…

Der Desktop-Launcher funktioniert, aber wie gesagt ist das Spiel noch nicht richtig spielbar. Die Klicks sind irgendwie Glückssache, da muss ich noch mal ran. Und dann brauchte ich noch mindestens ein Undo und ein Reset, und außerdem eine Gewinnauswertung.

Alles schick so weit, mit Antialiasing und Buttons sieht es schon recht nett aus.

Es fehlen noch ein paar Knöpfe (Undo, Reset, Back to Menu), und GWT läuft immer noch nicht, aber wenn das gefixt ist könnte ich es auf GitHub Pages stellen.

Natürlich wäre das dann immer noch absolut minimalistisch.

Jetzt kommt ja ein schönes Wochenende, da hast ja dann Zeit das zum laufen zu bekommen (inkl. GitHub Pages :stuck_out_tongue:).

Gut. Sollte ja klar sein, dass ein Spiel Zeit braucht :slight_smile: [hoffe ich mal ^^]

Nein. Yeb ist nicht tot :smiley:

Wegen der GWT-Probleme habe ich mich schweren Herzens entschlossen, vavr.io erst mal rauszunehmen. Das Spiel läuft jetzt mit Java collections (bäks!). Die mit vavr verbundenen Fehler sind weg, trotzdem funzt es noch nicht (Details im GWT-Hilfe-Thread).

Während ich mit GWT frickele, habe ich mal eine Windows-Version zusammengepackt: https://nofile.io/f/rsdM1jW3N9V/yeb.zip

War schon kurz davor nachzufragen, dann hab ich einfach mal auf Github geschaut und einen commit von vor 2 Tagen gesehen. Dachte mir schon fast, dass du noch immer wegen dem GWT am fluche bist ^^.

Schaut schon ganz witzig aus. Die ersten 2 oder 3 Level hab ich auch hinbekommen. Danach hab ich angefangen Spinnennetze zu bauen :smiley:.

Freu dich daran, so lange das geht. Zyklenerkennung steht schon auf der Liste :smiley:

Ich überlege, ob ich Hindernisse einbaue, die das Netz umgehen muss…

Ach ja: Falls jemand ein Level mit einer viel besseren Länge als vorgegeben löst, würde mich das natürlich interessieren. Ich habe noch keine Möglichkeit, die kürzeste Länge zu berechnen, das ist alles Trial-and-Error.

Dann nimms wieder runter! :smiley:

Interessante Idee. Was ich bisher durch mein Spiel gelernt hab: solche Elemente brauchst du! Wenn du es dir einfach machen willst, könntest du damit deine Level mit unterschiedlichem Schwierigkeitsgrad anbieten (was es einfacher machen dürfte die Level-Menge zu erhöhen ^^).

Oha. Klingt aufwendig. Hast du irgendwo einen Server laufen? Dann könntest du dir doch die highscores zuschicken lassen. Wäre vllt auch was für ein Sternesystem:
1 - Sterne: man ist so gut wie der Durchschnitt
2 - Sterne: man liegt im Bereich der besten Lösung

Schwierigkeitsgrade werden nicht so gut funktionieren. Meistens ist eine Lösung “offensichtlich”, aber das muss nicht die beste sein. Die wirklich beste ist dann nach meiner Erfahrung (Level 3+4) nur leicht besser als die offensichtliche, es wäre also kaum Platz für mehrere “sternewürdige” Lösungen.

Aber mal sehen, ob Hindernisse (ich dachte an Rechtecke und Kreise, die ja Kollisionserkennung haben) daran etwas ändern.

Ok, wenn die sich nicht sonderlich unterscheiden, dann macht es wenig Sinn (und sorgt eher für Frust als Motivation weiter zu machen). Allerdings würde ich mir das mitm Server überlegen. Da könntest du ja einfach einen Abzug vom Level hinschicken und deine “optimale” Lösung entsprechend anpassen.

Ein paar kleine Verbesserungen: https://nofile.io/f/Gyr39Ov3dUC/yeb.zip

Spinnennetze zu verhindern ist keine Verbesserung :frowning:

Zyklen ziehen sich oft so zusammen, dass man sie nicht sieht, und das kann verwirren. Außerdem beschränkt Zyklenfreiheit das die Anzahl Knoten und Kanten, was bei meinen unoptimierten Algorithmen auch besser so ist.

Aber yeb ist ja Open Source: https://github.com/DanielGronau/yeb
Einfach Level.hasCycle hart auf false setzen…

Und jetzt auch noch Hindernisse! Hier ein Beispiel, das eigentlich “gewonnen” wäre, wären da nicht diese hässlichen Kreise:

Rechtecke gehen auch…

Hallo ich erhalte immer wieder folgenden Fehler
(hab noch keine schritte gefunden, die den Fehler direkt reprodizieren.)

A fatal error has been detected by the Java Runtime Environment:

EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x17fd84f7, pid=2988, tid=0x00001bf8

JRE version: Java™ SE Runtime Environment (8.0_171-b11) (build 1.8.0_171-b11)
Java VM: Java HotSpot™ Client VM (25.171-b11 mixed mode, sharing windows-x86 )
Problematic frame:
C [ig7icd32.dll+0x6584f7]

Failed to write core dump. Minidumps are not enabled by default on client versions of Windows

An error report file with more information is saved as:
C:\Users\a538578\Desktop\yeb\hs_err_pid2988.log

If you would like to submit a bug report, please visit:
Crash Report
The crash happened outside the Java Virtual Machine in native code.
See problematic frame for where to report the bug.

AL lib: (EE) alc_cleanup: 1 device not closed

hs_err_pid7748.zip (21,7 KB)

das ist übrigens keine ZIP datei sondern eine log datei. Ich darf aber keine logs anhängen → daher umbenannt in .zip und nun gehts