Adventskalender 8. Dezember 2023 - Ncurses-Spiel Lightsout

Smalltalk
Antworten
Benutzeravatar
Meillo
Moderator
Beiträge: 8818
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Adventskalender 8. Dezember 2023 - Ncurses-Spiel Lightsout

Beitrag von Meillo » 08.12.2023 07:03:03

Eigentlich wollte ich heute etwas ueber `split' erzaehlen ... von vergangenen Zeiten, als man Daten noch mit Disketten transportiert hat, usw. Dann ist mir aber whispers Gaming-Tuerchen dazwischen gekommen, genauer gesagt dasebastians Post, der das Spiel Debianlightsoff erwaehnt.

Ich habe mir daraufhin das Spiel auf seiner Website angeschaut. Es ist ganz simpel. Die Regeln koennten kaum einfacher sein:
https://help.gnome.org/users/lightsoff/stable/rules.html.en hat geschrieben: 1. The game begins with a pattern of lights on the 5x5 grid.

2. Select a tile to toggle its state and its non-diagonal neighbors state.

3. Once you have successfully turned off all the lights, you complete that level and move on to the next.
(Hier auch auf Deutsch)

Da habe ich Lust bekommen, mal wieder was mit Ncurses zu programmieren, weil dieses Spiel so geeignet dafuer erschien ... eine Terminal-Version von Lightsoff. :-)


Also habe ich mich hingesetzt und ein paar Stunden programmiert. Dabei konnte ich auf Code zurueckgreifen, den ich damals, motiviert durch heinz' Dungeon-Crawler-Thread, geschrieben hatte.

Am gleichen Abend hatte ich noch eine rudimentaer laufende Version fertig. In den Tagen danach habe ich die dann vor allem optisch poliert.

Nun ist das lediglich 222 Zeilen C-Code umfassende Spielchen fertig. :-D

Bild

(Da Lights Off nach einem Song benannt zu sein scheint ;-) , habe ich meinen Klon, auch nach einem Song benannt: Lights Out von UFO. Der muss beim Spielen natuerlich in Dauerschleife gehoert werden. 8) )


Ich liefere euch das Spiel in Source-Form aus. Ihr muesst also selber kompilieren. ;-)

Da ich kein aktuelles Debian habe und auch nicht schnell mal eine VM aufsetzen kann, schreibe ich euch die Anleitung nach bester Vermutung. Bitte korrigiert mich falls noetig!

Ihr muesst den Quellcode des Spiels runterladen. Das ist nur eine Datei: http://tmp.marmaro.de/dfde/lightsout.c
(Alternativ NoPaste-Eintrag42037, dort muss allerdings die Dateiendung `.txt' entfernt werden.)

Dann muesst ihr auf eurem Computer ein Buildsystem mit Ncurses einrichten. Dafuer sollte es ausreichen, die folgenden zwei Pakete zu installieren: Debiangcc Debianlibncurses-dev

Anschliessend koennt ihr das Programm mit diesem Befehl im Verzeichnis mit der Code-Datei bauen:

Code: Alles auswählen

cc lightsout.c -o lightsout -lncurses
Gestartet werden kann es danach mit:

Code: Alles auswählen

./lightsout
(Mit `-l' kann direkt in einem hoeheren Level begonnen werden.)


Die Schwierigkeit der Level ist zufallsbasiert, daher koennen hoehere Level auch manchmal leicht sein. Jedenfalls braucht man maximal so viele Schaltvorgaenge wie die Levelnummer.

Ich bin gespannt, bis zu welchem Level ihr kommt. ;-)


Insgesamt bin ich immer wieder erstaunt, wie einfach es ist, mit Ncurses ``grafische'' Oberflaechen zu bauen, selbst in C. Vielleicht kann ich euch mit dieser Begeisterung ein bisschen anstecken.

Gerne beantworte ich eure Fragen zum Code und erklaere ihn, wo noetig.
Zuletzt geändert von Meillo am 08.12.2023 10:49:43, insgesamt 1-mal geändert.
Grund: Compilebefehle korrigiert
Use ed once in a while!

Benutzeravatar
whisper
Beiträge: 3193
Registriert: 23.09.2002 14:32:21
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

Re: Adventskalender 8. Dezember 2023 - Ncurses-Spiel Lightsout

Beitrag von whisper » 08.12.2023 09:16:27

Cooles Ding!
Ich hoffe ich finde die Zeit, das mal näher anzuschauen. :THX:

inne
Beiträge: 3281
Registriert: 29.06.2013 17:32:10
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Adventskalender 8. Dezember 2023 - Ncurses-Spiel Lightsout

Beitrag von inne » 08.12.2023 09:52:49

Meillo hat geschrieben: ↑ zum Beitrag ↑
08.12.2023 07:03:03

Code: Alles auswählen

cc -lncurses lightsout.c -o lightsout
Hallo,

unter meinem System (Ein Franken Debian) geht es nur so:

Code: Alles auswählen

gcc lightsout.c -lncurses
Also das Librarieflag nach dem Sourcefile. Es liegt wohl am GCC, ich musste den Fehler im WWW suchen:
https://stackoverflow.com/questions/17072294/undefined-reference-to-when-using-g-and-ncurses-for-compiling hat geschrieben: Your libraries option (-lncurses) should be placed after all .o files, not before. Otherwise linking may (and seemingly in this case does) fail.

Code: Alles auswählen

$ gcc -lncurses lightsout.c
/usr/bin/ld: /tmp/ccCfxJ9W.o: warning: relocation against `COLS' in read-only section `.text'
/usr/bin/ld: /tmp/ccCfxJ9W.o: in function `showmap':
lightsout.c:(.text+0x332): undefined reference to `wmove'
/usr/bin/ld: lightsout.c:(.text+0x34b): undefined reference to `waddch'
/usr/bin/ld: lightsout.c:(.text+0x394): undefined reference to `wmove'
/usr/bin/ld: lightsout.c:(.text+0x3ad): undefined reference to `waddch'
/usr/bin/ld: /tmp/ccCfxJ9W.o: in function `draw':
lightsout.c:(.text+0x41c): undefined reference to `mvwprintw'
/usr/bin/ld: lightsout.c:(.text+0x437): undefined reference to `stdscr'
/usr/bin/ld: lightsout.c:(.text+0x43f): undefined reference to `wrefresh'
/usr/bin/ld: lightsout.c:(.text+0x44e): undefined reference to `wrefresh'
/usr/bin/ld: lightsout.c:(.text+0x45d): undefined reference to `wrefresh'
/usr/bin/ld: lightsout.c:(.text+0x46c): undefined reference to `wrefresh'
/usr/bin/ld: /tmp/ccCfxJ9W.o: in function `main':
lightsout.c:(.text+0x53d): undefined reference to `initscr'
/usr/bin/ld: lightsout.c:(.text+0x542): undefined reference to `noecho'
/usr/bin/ld: lightsout.c:(.text+0x547): undefined reference to `cbreak'
/usr/bin/ld: lightsout.c:(.text+0x54e): undefined reference to `stdscr'
/usr/bin/ld: lightsout.c:(.text+0x55b): undefined reference to `keypad'
/usr/bin/ld: lightsout.c:(.text+0x565): undefined reference to `curs_set'
/usr/bin/ld: lightsout.c:(.text+0x56b): undefined reference to `COLS'
/usr/bin/ld: lightsout.c:(.text+0x581): undefined reference to `newwin'
/usr/bin/ld: lightsout.c:(.text+0x5ce): undefined reference to `mvwprintw'
/usr/bin/ld: lightsout.c:(.text+0x5e7): undefined reference to `newwin'
/usr/bin/ld: lightsout.c:(.text+0x622): undefined reference to `wborder'
/usr/bin/ld: lightsout.c:(.text+0x63f): undefined reference to `newwin'
/usr/bin/ld: lightsout.c:(.text+0x66e): undefined reference to `mvwprintw'
/usr/bin/ld: lightsout.c:(.text+0x6a2): undefined reference to `wborder'
/usr/bin/ld: lightsout.c:(.text+0x837): undefined reference to `stdscr'
/usr/bin/ld: lightsout.c:(.text+0x83f): undefined reference to `wgetch'
/usr/bin/ld: lightsout.c:(.text+0x857): undefined reference to `endwin'
/usr/bin/ld: warning: creating DT_TEXTREL in a PIE
collect2: error: ld returned 1 exit status
Dann läuft es aber!

Code: Alles auswählen

./a.out

Benutzeravatar
Meillo
Moderator
Beiträge: 8818
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Adventskalender 8. Dezember 2023 - Ncurses-Spiel Lightsout

Beitrag von Meillo » 08.12.2023 10:57:37

inne hat geschrieben: ↑ zum Beitrag ↑
08.12.2023 09:52:49
Meillo hat geschrieben: ↑ zum Beitrag ↑
08.12.2023 07:03:03

Code: Alles auswählen

cc -lncurses lightsout.c -o lightsout
Hallo,

unter meinem System (Ein Franken Debian) geht es nur so:

Code: Alles auswählen

gcc lightsout.c -lncurses
Also das Librarieflag nach dem Sourcefile. Es liegt wohl am GCC, ich musste den Fehler im WWW suchen:
https://stackoverflow.com/questions/17072294/undefined-reference-to-when-using-g-and-ncurses-for-compiling hat geschrieben: Your libraries option (-lncurses) should be placed after all .o files, not before. Otherwise linking may (and seemingly in this case does) fail.
Danke fuer den Hinweis. Damit hast du Recht.

Ich habe das Kompilieren nicht mit einem gcc getestete, sondern nur mit clang unter FreeBSD und da ging's -- eigentlich zu meiner Ueberraschung -- auch mit der Lib vorne. Ich hab mir dann bloss nichts weiter dabei gedacht ... auch weil make die Lib ebenfalls vorne hinschreibt:

Code: Alles auswählen

:-/ make LDFLAGS=-lncurses lightsout
cc -O2 -pipe -lncurses lightsout.c  -o lightsout
Ich verstehe nicht, warum make das tut, weil make ja nicht Teil von clang ist, sondern Regeln haben sollte, die fuer gcc gleichermassen funktionieren. :roll:

Es ist aber schon richtiger, die Lib hinten anzugeben, darum habe ich das oben im Text korrigiert.

Kannst du bitte mal die Ausgabe des make-Aufrufs (ohne Makefile) auf deinem Debian posten.
Use ed once in a while!

inne
Beiträge: 3281
Registriert: 29.06.2013 17:32:10
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Adventskalender 8. Dezember 2023 - Ncurses-Spiel Lightsout

Beitrag von inne » 08.12.2023 11:07:59

Meillo hat geschrieben: ↑ zum Beitrag ↑
08.12.2023 10:57:37
Kannst du bitte mal die Ausgabe des make-Aufrufs (ohne Makefile) auf deinem Debian posten.

Code: Alles auswählen

$ make LDFLAGS=-lncurses lightsout
cc   -lncurses  lightsout.c   -o lightsout
Hier macht es das auch falsch, folglich es kompiliert nicht.

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: Adventskalender 8. Dezember 2023 - Ncurses-Spiel Lightsout

Beitrag von JTH » 08.12.2023 11:11:30

Wenn ihr die zu linkende Bibliothek korrekt in die LDLIBS, statt LDFLAGS schreibt, läuft das auch:

Code: Alles auswählen

$ LDLIBS=-lncurses make lightsout
cc     lightsout.c  -lncurses -o lightsout
make weiß schon, wo es was hinzuschreiben hat ;)
Manchmal bekannt als Just (another) Terminal Hacker.

Benutzeravatar
Meillo
Moderator
Beiträge: 8818
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Adventskalender 8. Dezember 2023 - Ncurses-Spiel Lightsout

Beitrag von Meillo » 08.12.2023 11:14:08

JTH hat geschrieben: ↑ zum Beitrag ↑
08.12.2023 11:11:30
Wenn ihr die zu linkende Bibliothek korrekt in die LDLIBS, statt LDFLAGS schreibt, läuft das auch:

Code: Alles auswählen

$ LDLIBS=-lncurses make lightsout
cc     lightsout.c  -lncurses -o lightsout
make weiß schon, wo es was hinzuschreiben hat ;)
:facepalm: :mrgreen:
Use ed once in a while!

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: Adventskalender 8. Dezember 2023 - Ncurses-Spiel Lightsout

Beitrag von JTH » 08.12.2023 11:25:12

Im Gegenzug hätte ich gerne ne Anleitung, wie man das Spiel löst … bevor ich hier in die Tischkante beiße :x Ich bleibe immer bei einem letzten Licht hängen.

Hmm, okay, mit anderem Level gewinn ich auch mal.
Manchmal bekannt als Just (another) Terminal Hacker.

Benutzeravatar
Meillo
Moderator
Beiträge: 8818
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Adventskalender 8. Dezember 2023 - Ncurses-Spiel Lightsout

Beitrag von Meillo » 08.12.2023 11:31:32

JTH hat geschrieben: ↑ zum Beitrag ↑
08.12.2023 11:25:12
Im Gegenzug hätte ich gerne ne Anleitung, wie man das Spiel löst … bevor ich hier in die Tischkante beiße :x Ich bleibe immer bei einem letzten Licht hängen.
:mrgreen:

... es ist halt wie so oft: wenn man erstmal weiss, wie es funktioniert, dann ist der Spass am Spiel weg, weil es nur noch zu einer mechanischen Abarbeitung wird. :roll:

Wie waere es stattdessen damit: Du programmierst/trainierst eine KI, die das Spiel zu loesen lernt und die dir danach erklaert, wie sie das macht. ;-)
Use ed once in a while!

Benutzeravatar
Meillo
Moderator
Beiträge: 8818
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Adventskalender 8. Dezember 2023 - Ncurses-Spiel Lightsout

Beitrag von Meillo » 08.12.2023 11:32:30

JTH hat geschrieben: ↑ zum Beitrag ↑
08.12.2023 11:25:12
Hmm, okay, mit anderem Level gewinn ich auch mal.
Wie meinst du das? Schaffst du das erste Level nicht, aber hoehere Level schon? :lol:
Use ed once in a while!

inne
Beiträge: 3281
Registriert: 29.06.2013 17:32:10
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Adventskalender 8. Dezember 2023 - Ncurses-Spiel Lightsout

Beitrag von inne » 08.12.2023 11:52:50

JTH hat geschrieben: ↑ zum Beitrag ↑
08.12.2023 11:25:12
:x Ich bleibe immer bei einem letzten Licht hängen.
Dito.
Es gibt aber tatsächlich eine Lösungsanleitung:
https://www.wikihow.com/Solve-Lights-Out-Game

Zumindest kommt es damit hin, leider ist die auf Englisch.

Zuerst oben und dann nach unten weiter... aber das letzte Licht bleibt an.

https://ibb.co/hm91mWF
https://i.ibb.co/9rg3rTH/Screenshot-fro ... -49-42.png
Zuletzt geändert von inne am 08.12.2023 12:01:44, insgesamt 1-mal geändert.

Benutzeravatar
TRex
Moderator
Beiträge: 8085
Registriert: 23.11.2006 12:23:54
Wohnort: KA

Re: Adventskalender 8. Dezember 2023 - Ncurses-Spiel Lightsout

Beitrag von TRex » 08.12.2023 12:00:50

inne hat geschrieben: ↑ zum Beitrag ↑
08.12.2023 11:52:50
(Mein Franken Debian ist eine Debian mit Ubuntu und Kali :facepalm: ATM)
🤮
Jesus saves. Buddha does incremental backups.
Windows ist doof, Linux funktioniert nichtDon't break debian!Wie man widerspricht

inne
Beiträge: 3281
Registriert: 29.06.2013 17:32:10
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Adventskalender 8. Dezember 2023 - Ncurses-Spiel Lightsout

Beitrag von inne » 08.12.2023 12:02:39

TRex hat geschrieben: ↑ zum Beitrag ↑
08.12.2023 12:00:50
inne hat geschrieben: ↑ zum Beitrag ↑
08.12.2023 11:52:50
(Mein Franken Debian ist eine Debian mit Ubuntu und Kali :facepalm: ATM)
🤮
Es muss nicht dir gefallen :P, es war zuerst nur ein Ubuntu, nun ist es dieser Misch-Mash. :roll: Heuer würde ich wieder Debian testing/Sid installieren.

Benutzeravatar
Meillo
Moderator
Beiträge: 8818
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Adventskalender 8. Dezember 2023 - Ncurses-Spiel Lightsout

Beitrag von Meillo » 08.12.2023 12:50:53

inne hat geschrieben: ↑ zum Beitrag ↑
08.12.2023 11:52:50
JTH hat geschrieben: ↑ zum Beitrag ↑
08.12.2023 11:25:12
:x Ich bleibe immer bei einem letzten Licht hängen.
Dito.
In dem Fall bist du irgendwo zuvor falsch abgebogen. Du musst also erst wieder neue Lichter anmachen und die in einer anderen Kombination ausmachen.
inne hat geschrieben: ↑ zum Beitrag ↑
08.12.2023 11:52:50
Es gibt aber tatsächlich eine Lösungsanleitung:
https://www.wikihow.com/Solve-Lights-Out-Game

Zumindest kommt es damit hin, leider ist die auf Englisch.
Man kann auch direkt auf der Website von Lights Off selbst schauen, dort gibt's die Loesungsanleitung sogar auf Deutsch. ;-)
https://help.gnome.org/users/lightsoff/ ... gy.html.de
Aber wie gesagt: dieses mechanische Abarbeiten laesst keinen Spielspass aufkommen.


Ich selbst komme meist bis etwa Level 8, dann ist's aus. Manche Muster kann ich schon zuverlaessig loesen, fuer andere (wie Treppen) habe ich die richtige Herangehensweise noch nicht gefunden ...
Use ed once in a while!

Benutzeravatar
paedubucher
Beiträge: 856
Registriert: 22.02.2009 16:19:02
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Schweiz
Kontaktdaten:

Re: Adventskalender 8. Dezember 2023 - Ncurses-Spiel Lightsout

Beitrag von paedubucher » 08.12.2023 13:08:27

Meillo hat geschrieben: ↑ zum Beitrag ↑
08.12.2023 11:32:30
JTH hat geschrieben: ↑ zum Beitrag ↑
08.12.2023 11:25:12
Hmm, okay, mit anderem Level gewinn ich auch mal.
Wie meinst du das? Schaffst du das erste Level nicht, aber hoehere Level schon? :lol:
Ich habe mir auch gerade 5 Minuten lang die Zähne am ersten Level ausgebissen. Nach einem Neustart hatte das Spiel dann plötzlich ganz eigenartig auf meinen ersten Versuch reagiert und überall Lichter angemacht. Ich habe weitergespielt und hatte den selben Effekt noch einmal. Plötzlich merkte ich: ich bin ja schon in Level 3! :mrgreen:
Habe nun, ach! Java
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.

Antworten