Discussion:
Semi-[OT] "Life" fuer sehr kleine Anzeigen
(zu alt für eine Antwort)
Gregor Szaktilla
2014-03-06 15:44:59 UTC
Permalink
Raw Message
Hallo zusammen!

Für eine kleine Spielerei suche ich C-Code (deshalb nur Semi-OT :-), der
eine „Lebens-Simulation“ erzeugt. Mit „klein“ meine ich: 5x7 Pixel mit 4
Graustufen.

TIA für alle Tipps und Hinweise!

Gregor
Stefan Ram
2014-03-07 00:38:57 UTC
Permalink
Raw Message
eine "Lebens-Simulation" erzeugt.
Was ist eine »Lebens-Simulation«?
5x7 Pixel mit 4 Graustufen
#include <stdio.h>
int main(){ printf( " .o#o\n.. #o\n#.o#o\no.o o\n..ooo\nooo o\n### \n" ); }
Gregor Szaktilla
2014-03-07 01:27:36 UTC
Permalink
Raw Message
Post by Stefan Ram
Was ist eine »Lebens-Simulation«?
http://de.wikipedia.org/wiki/Conways_Spiel_des_Lebens

Das meine ich.

Gruß

Gregor
Stefan Ram
2014-03-07 01:50:10 UTC
Permalink
Raw Message
Post by Gregor Szaktilla
Post by Stefan Ram
Was ist eine »Lebens-Simulation«?
http://de.wikipedia.org/wiki/Conways_Spiel_des_Lebens
Das meine ich.
In dem Original des Spiels gibt es aber keine Graustufen,
soweit ich weiß, sondern nur zwei Möglichkeiten pro Zelle:
Eine Zelle ist entweder »lebendig« oder »tot«.

Ein Spielfeld mit 5x7 Bildpunkten wäre recht klein. Man
könnte dort viele interessante Phänomene (wie
Glider-Kanonen) nicht sehen. Ersetzt man vier Zellen durch
eine Zelle mit vier Graustufen, kann man dann auch wieder
einige interessante Details nicht sehen.

Die Implementation der Regeln des Game Of Life ist recht
einfach, da man die Regeln eins-zu-eins in
C-Programm-Bestandteile für zwei zweidimensionalen Reihungen
(für eine Generation und die nachfolgende Generation)
übersetzen kann.

Man muß sich nur überlegen, wie man die Zellen am Rande des
Spielfelds behandeln will, da sich dort die Regeln nicht
direkt anwenden lassen, weil dort nicht jede Zelle acht
Nachbarn hat. Hierfür gibt es verschiedene
Lösungsmöglichkeiten, etwa die Identifikation eines Randes
mit dem ihm gegenüberliegenden Rand.
Achim Peters
2014-03-07 01:52:34 UTC
Permalink
Raw Message
Post by Gregor Szaktilla
Für eine kleine Spielerei suche ich C-Code (deshalb nur Semi-OT :-), der
eine „Lebens-Simulation“ erzeugt. Mit „klein“ meine ich: 5x7 Pixel mit 4
Graustufen.
Das hängt ja wohl vom Terminal ab, ob das einzelne Pixel und auch noch
in 4 Graustufen überhaupt unterstützt, und falls ja, wie man das
anspricht. IMHO FULL-OT. ;-)

Für das Spiel an sich sollten sich näherungsweise unendlich viele
Beispielprogramme finden lassen.

Bye
Achim
Gregor Szaktilla
2014-03-07 02:40:13 UTC
Permalink
Raw Message
Post by Achim Peters
Post by Gregor Szaktilla
Für eine kleine Spielerei suche ich C-Code (deshalb nur Semi-OT :-), der
eine „Lebens-Simulation“ erzeugt. Mit „klein“ meine ich: 5x7 Pixel mit 4
Graustufen.
Das hängt ja wohl vom Terminal ab, ob das einzelne Pixel und auch noch
in 4 Graustufen überhaupt unterstützt, und falls ja, wie man das
anspricht. IMHO FULL-OT. ;-)
Das 'Terminal' besteht aus einem LED-Display mit 5x7 LEDs, das von einem
ATmega168 (1 kB RAM) angesteuert wird. Auf dem µC soll zusätzlich das
„Life“ laufen.
Post by Achim Peters
Für das Spiel an sich sollten sich näherungsweise unendlich viele
Beispielprogramme finden lassen.
Weil ich nicht alle Millionen Varianten darauf testen möchte, wie
sparsam sie mit knappem RAM umgehen oder ob sie auf einem Spielfeld von
lediglich 5x7 Pixeln überhaupt laufen können, frage ich hier. Vielleicht
kennt ja jemand eine sehr sparsame Implementation (in C, deshalb IMO
schlimmstenfalls semi-OT).

Gruß

Gregor
Stefan Ram
2014-03-07 02:50:21 UTC
Permalink
Raw Message
Post by Gregor Szaktilla
lediglich 5x7 Pixeln überhaupt laufen können, frage ich hier. Vielleicht
kennt ja jemand eine sehr sparsame Implementation (in C, deshalb IMO
Jeder C-Programmierer kann so etwas in einer Zeit schreiben,
die mit achtzigprozentiger Wahrscheinlichkeit unter einer
Stunde liegt. Es ist nur so trivial, daß es keine
Herausforderung darstellt, und deswegen echte Arbeit wäre.
Gregor Szaktilla
2014-03-07 03:38:19 UTC
Permalink
Raw Message
Post by Stefan Ram
Jeder C-Programmierer kann so etwas in einer Zeit schreiben,
die mit achtzigprozentiger Wahrscheinlichkeit unter einer
Stunde liegt. Es ist nur so trivial, daß es keine
Herausforderung darstellt, und deswegen echte Arbeit wäre.
Dann werde ich das bestimmt in ein paar (wenigen) Stunden hinbekommen.

Gruß

Gregor
Stefan Ram
2014-03-07 03:59:09 UTC
Permalink
Raw Message
Post by Gregor Szaktilla
Post by Stefan Ram
Jeder C-Programmierer kann so etwas in einer Zeit schreiben,
die mit achtzigprozentiger Wahrscheinlichkeit unter einer
Stunde liegt. Es ist nur so trivial, daß es keine
Herausforderung darstellt, und deswegen echte Arbeit wäre.
Dann werde ich das bestimmt in ein paar (wenigen) Stunden hinbekommen.
So etwas zu schaffen wie Hashlife ist natürlich keineswegs
trivial. Mit der Golly-Implementation von Hashlife wurde
laut Wikipedia in weniger als 30 Sekunden von einem sehr
komplizierten Game-Of-Life-Muster in einem Feld, das
deutlich größer als 5×7 ist, die
6366548773467669985195496000. Generation berechnet

Ich wollte nur ausdrücken, daß eine wörtliche Umsetzung der
Regeln nicht so interessant ist, sondern eher als
Übungsaufgabe in einem Programmierkurs für Anfänger geeignet
ist. Aber Bill Gospers Verfahren zur Beschleunigung der
Berechnung ist natürlich bewundernswert. Jedoch paßt dies
wohl nicht ganz zu einer so kleinen LED-Anzeige. Da möchte
man die Berechnung ja eher verlangsamen, damit man mit dem
Auge noch etwas erkennen kann.
Achim Peters
2014-03-07 03:32:53 UTC
Permalink
Raw Message
Post by Stefan Ram
Post by Gregor Szaktilla
lediglich 5x7 Pixeln überhaupt laufen können, frage ich hier. Vielleicht
kennt ja jemand eine sehr sparsame Implementation (in C, deshalb IMO
Jeder C-Programmierer kann so etwas in einer Zeit schreiben,
die mit achtzigprozentiger Wahrscheinlichkeit unter einer
Stunde liegt. Es ist nur so trivial, daß es keine
Herausforderung darstellt, und deswegen echte Arbeit wäre.
@Gregor: Die "Herausforderung" ist daher die entsprechende Ansteuerung
des "LED-Displays mit 5x7 LEDs", das Du auch im dritten Anlauf nicht
näher beschreiben willst.

BTW: Seit wann haben LEDs "Graustufen"? Das macht es ja noch viel
herausfordender! Und noch viel Off-Topicer!eins!elf!

Bye
Achim
Gregor Szaktilla
2014-03-07 04:25:58 UTC
Permalink
Raw Message
Post by Achim Peters
@Gregor: Die "Herausforderung" ist daher die entsprechende Ansteuerung
des "LED-Displays mit 5x7 LEDs", das Du auch im dritten Anlauf nicht
näher beschreiben willst.
Wieso „dritter Anlauf“? Habe ich was verpasst?

Gruß

Gregor
Achim Peters
2014-03-07 11:40:16 UTC
Permalink
Raw Message
Post by Gregor Szaktilla
Post by Achim Peters
@Gregor: Die "Herausforderung" ist daher die entsprechende Ansteuerung
des "LED-Displays mit 5x7 LEDs", das Du auch im dritten Anlauf nicht
näher beschreiben willst.
Wieso „dritter Anlauf“? Habe ich was verpasst?
Bis dato hatte es drei Posts von Dir in diesem Thread gegeben.

Bye
Achim
Gregor Szaktilla
2014-03-07 13:28:44 UTC
Permalink
Raw Message
Post by Achim Peters
Post by Gregor Szaktilla
Post by Achim Peters
@Gregor: Die "Herausforderung" ist daher die entsprechende Ansteuerung
des "LED-Displays mit 5x7 LEDs", das Du auch im dritten Anlauf nicht
näher beschreiben willst.
Wieso „dritter Anlauf“? Habe ich was verpasst?
Bis dato hatte es drei Posts von Dir in diesem Thread gegeben.
Das mag sein, aber bislang hat niemand nach der Ansteuerung der LEDs
gefragt. Ich weiß gerade auch nicht, was das mit meiner Frage nach
einer möglichst sparsamen Version von „Conways Spiel des Lebens“ zu tun hat.

Gruß

Gregor
Stefan Ram
2014-03-07 18:23:21 UTC
Permalink
Raw Message
Post by Gregor Szaktilla
Das mag sein, aber bislang hat niemand nach der Ansteuerung der LEDs
gefragt. Ich weiß gerade auch nicht, was das mit meiner Frage nach
einer möglichst sparsamen Version von "Conways Spiel des Lebens" zu tun hat.
Geht es darum Rechenzeit oder Speicherplatz zu sparen?

Bei nur 5×7 Zellen sollte eigentlich weder das eine noch das
andere ein Problem sein.
Gregor Szaktilla
2014-03-09 10:29:44 UTC
Permalink
Raw Message
Post by Stefan Ram
Post by Gregor Szaktilla
Das mag sein, aber bislang hat niemand nach der Ansteuerung der LEDs
gefragt. Ich weiß gerade auch nicht, was das mit meiner Frage nach
einer möglichst sparsamen Version von "Conways Spiel des Lebens" zu tun hat.
Geht es darum Rechenzeit oder Speicherplatz zu sparen?
Mir geht es hauptsächlich um Speicherplatz, weil ich das „Display“ mit
einem ATmega168 umgesetzt habe und das Life-Ding zusätzlich auf dem µC
laufen soll. Das Life-Ding sieht aber auf den ersten Blick so einfach
aus, dass ich es wohl einfach selbst implementieren werde.

Gruß

Gregor

Stefan Reuther
2014-03-07 18:16:18 UTC
Permalink
Raw Message
Post by Gregor Szaktilla
Post by Achim Peters
Post by Gregor Szaktilla
Post by Achim Peters
@Gregor: Die "Herausforderung" ist daher die entsprechende Ansteuerung
des "LED-Displays mit 5x7 LEDs", das Du auch im dritten Anlauf nicht
näher beschreiben willst.
Wieso „dritter Anlauf“? Habe ich was verpasst?
Bis dato hatte es drei Posts von Dir in diesem Thread gegeben.
Das mag sein, aber bislang hat niemand nach der Ansteuerung der LEDs
gefragt. Ich weiß gerade auch nicht, was das mit meiner Frage nach
einer möglichst sparsamen Version von „Conways Spiel des Lebens“ zu tun hat.
Nix.

Aber in deiner Aufgabenstellung ist "Conways Spiel des Lebens" der
allereinfachste Teil. Such lieber, wo du eine Display-Ansteuerung mopsen
kannst, die wird kniffliger.

Wenn du drauf bestehst, folgendes hab ich in 10 Minuten zusammengehackt:
----8<--------8<--------8<--------8<----
#define WIDTH 7
#define HEIGHT 5

#define NOW 1
#define NEXT 2
typedef char Board[HEIGHT][WIDTH];

static int get(Board* b, int x, int y)
{
return x >= 0 && x < WIDTH && y >= 0 && y < HEIGHT
&& ((*b)[y][x] & NOW) != 0;
}

void iterate(Board* b)
{
int x, y;
for (y = 0; y < HEIGHT; ++y) {
for (x = 0; x < WIDTH; ++x) {
int dx, dy, count = 0;
for (dy = -1; dy <= +1; ++dy) {
for (dx = -1; dx <= +1; ++dx) {
count += get(b, x+dx, y+dy);
}
}
if (get(b, x, y)
? count==3 || count==4 /* Zelle bleibt leben */
: count==3 /* Zelle wird geboren */)
{
(*b)[y][x] |= NEXT;
}
}
}
}

void advance(Board* b)
{
int x, y;
for (y = 0; y < HEIGHT; ++y) {
for (x = 0; x < WIDTH; ++x) {
(*b)[y][x] >>= 1;
}
}
}
----8<--------8<--------8<--------8<----

Compiliert bei mir inklusive Anzeige- und main-funktion...
----8<--------8<--------8<--------8<----
void draw(Board* b)
{
int x, y;
for (y = 0; y < HEIGHT; ++y) {
for (x = 0; x < WIDTH; ++x) {
putchar(" XxX"[(*b)[y][x]]);
}
putchar('\n');
}
putchar('\n');
}

int main()
{
int i;
Board b = {};
b[1][1] = 1; b[2][2] = 1; b[2][3] = 1; b[1][3] = 1; b[0][3] = 1;
for (i = 0; i < 10; ++i) {
draw(&b);
iterate(&b);
draw(&b);
advance(&b);
}
return 0;
}
----8<--------8<--------8<--------8<----
...zu 464 Byte i386-Code.


Stefan
Gregor Szaktilla
2014-03-09 10:26:52 UTC
Permalink
Raw Message
Post by Stefan Reuther
Post by Gregor Szaktilla
Post by Achim Peters
Post by Gregor Szaktilla
Post by Achim Peters
@Gregor: Die "Herausforderung" ist daher die entsprechende Ansteuerung
des "LED-Displays mit 5x7 LEDs", das Du auch im dritten Anlauf nicht
näher beschreiben willst.
Wieso „dritter Anlauf“? Habe ich was verpasst?
Bis dato hatte es drei Posts von Dir in diesem Thread gegeben.
Das mag sein, aber bislang hat niemand nach der Ansteuerung der LEDs
gefragt. Ich weiß gerade auch nicht, was das mit meiner Frage nach
einer möglichst sparsamen Version von „Conways Spiel des Lebens“ zu tun hat.
Nix.
Aber in deiner Aufgabenstellung ist "Conways Spiel des Lebens" der
allereinfachste Teil. Such lieber, wo du eine Display-Ansteuerung mopsen
kannst, die wird kniffliger.
Das mit dem Display ist erledigt, und auf der Suche nach einigermaßen
sinnvollen Einsatzzwecken (ich habe das nur gebastelt, um zu testen, ob
ich ein paar Dinge kapiert habe) fiel mir eben dieses Life-Ding ein.

Nachdem ich aber den Artikel in der Wikipedia gefunden und quergelesen
habe, werde ich das wohl selbst implementieren. Ich wusste nicht mehr,
dass die Regeln dermaßen einfach sind und für die Suche im Netz hatte
ich wohl nicht die richtigen Suchworte.
Danke, werde ich garantiert noch genauer angucken und nachvollziehen.

Gruß

Gregor
Loading...