Forum: Mikrocontroller und Digitale Elektronik Game of Life in C für µC


von Lehrmann M. (ubimbo)


Lesenswert?

Hallo,

ich möchte ein kleines Projekt realisieren: Es geht um das "Game of 
Life":

http://de.wikipedia.org/wiki/Conways_Spiel_des_Lebens

Ich habe hierzu 16 x 16 LED-Matrixbausteine über deren Ansteuerung ich 
mir hier keine Gedanken machen möchte bzw. muss.

Meine Frage gilt eher einem Algorithmus zur "Berechnung" bzw. dessen 
Programmierung in C.

Ich weiss nicht ob sich das jemand schon durchgelesen hat in Wikipedia 
aber man kann grob sagen, dass man jeweis ein 3 x 3 Matrix betrachtet um 
den neuen Zustand der (in der Mitte gelegenen) Zielzelle zu bestimmen. 
Dann addiert man die Werte (1 oder 0) der umliegenden Zellen und 
entscheidet dann je nach Ergebnis ob die Zielzelle die Wertigkeit 1 oder 
0 erhält.

Was ich mich nun frage ist, wie ich das mit Index (hab leider damit noch 
nie was damit gemacht) oder Ähnlichem löse, denn ich will ja die Abfrage 
nicht für jedes Matrix das von Hand programmieren sondern es sollja mit 
Variabeln oder Indexen gehen. Ich weiss nur noch nicht wie ich das in C 
(für PIC) realisieren soll.

Am liebsten wäre mir, das wie eine Art Funktion zu machen welcher ich 
ich die Zielzelle nenne (im Format (x,y)) und welche mir den neuen Wert 
dieser zurückgibt...

Die Funktion errechnet sich die Koordinaten (wie weiss ich aber wie soll 
ich das realisieren mit Variablen, etc..) der umliegenden Zellen, die 
Werte werden addiert, ausgewertet und der neue Zustand wird ausgegeben.

Es geht mir darum wie der Ablauf dafür in C aussieht und wie man das 
genau macht ... Hat vll. jemand einen Beispielcode ?

Die Kurve von C zu C für PIC schaff ich dann noch ...

Vielen Dank

von Mark B. (markbrandis)


Lesenswert?


von Lehrmann M. (ubimbo)


Lesenswert?

Servus Mark Brandis,

vielen Dank ... hab ich nochnicht gefunden.

Sag deiner lieben Tante Goooogle einen lieben Gruß =) achwas vielen Dank

von holger (Gast)


Lesenswert?

>Tante Gugel sagt z.B.:
>http://www.rohitab.com/discuss/index.php?showtopic=33623

Au weia, das braucht aber massig RAM;)
Auf ATMega644 mit 4kB RAM geht nur ein Feld mit 15x15 Pixeln.

von Uwe B. (boerge) Benutzerseite


Lesenswert?

... und hier meine Implementierung für einen Mega8, allerdings mit 8x8, 
sollte sich aber problemlos anpassen lassen...

Grüße Uwe

von Uwe B. (boerge) Benutzerseite


Lesenswert?

... ähm, der Link fehlt :-)

http://bralug.de/wiki/8x8-LED-Matrix#Game_of_life

Grüße Uwe

von Vlad T. (vlad_tepesch)


Lesenswert?

wieso braucht man da viel ram?

eine zelle kann entweder leben, oder tot sein, also 1bit pro zelle.

wenn man das ding am einfachsten coded, sinds 2*16*16 bit.
den 2. Puffer kan man sicher wegoptimieren, so dass man mit 2 
zusätlichen zeilen auskommt.

von Gast (Gast) (Gast)


Lesenswert?

> wieso braucht man da viel ram?

..alles eine Frage der geschickten Umsetzung.. :-)

> eine zelle kann entweder leben, oder tot sein, also 1bit pro zelle.

Jaschon, aber ein einzelnes Bit kann man auch hervorragend in einen int 
verpacken, so wie einer der Vorposter das gemacht hat ..oder war das der 
Code, den Tante Gugl ausgespuckt hat? Egal. Also wenn man möglichst viel 
Speicher verschleudern will, dann packt man das eine Bit in einen Int. 
Dazu noch ein Pointer-Array, das auf die acht Nachbarn zeigt..

jaja, Bill hatte schon recht als er gesagt hat, dass niemals jemand mehr 
als 640kiB Ram brauchen würde.. nur hat er damals die Dekadenz bequemer 
Programmierer nicht bedacht..

SCNR

von Vlad T. (vlad_tepesch)



Lesenswert?

lol

back to topic:

hab mal in meinem Archiv geschaut:
hatte auch mal eine 16x16 matrix selbst gebaut.
anbei der Code für ein paar simple animationen (inclusive game of life)

das einzige, was man wissen muss, ist, dass es eine 1bit ansteuerung ist 
und das Makro LED_MAT_REQ_BUF_BYTE_SIZE die benötigte Puffergröße 
zurückgibt, für 16x16 halt 32byte.

die ersten 3 funktionen sind eher testfunktionen, als wirklich tolle 
animationen.

die matrix-ansteuer-Routinen poste ich mal mit,  die low-level-routinen 
sind natürlich aber  hardwareabhängig.

von Uwe B. (boerge) Benutzerseite


Lesenswert?

MoinMoin,

deine Procedure GameOfLive_getNeigbors() ist aber relativ fest auf 16x16 
festgelegt...

Ich hatte bei meinem Code relativ lange überlegt, wie man genau diese 
Geschichte eleganter machen kann und bin auf die Geschichte mit den 
"relativen Zug-Vektoren" aus Sicht des betrachteten Feldes verfallen:

1
const uint8_t vx[8] = {-1, -1, -1,  0, 0,  1, 1, 1};
2
const uint8_t vy[8] = {-1,  0,  1, -1, 1, -1, 0, 1};

Ähnlich wird es auch in einigen Schachprogrammen gemacht...

Aber sonst auch eine ganz nette Implementierung!

Grüße Uwe

von Simon K. (simon) Benutzerseite


Lesenswert?

Du lädst ja signed Werte in ein unsigned Array ;)
Habe das übrigens so mal bei einer Tetris Implementierung gemacht. Jeder 
Stein hatte dann ein Ursprungspixel und alle weiteren Pixel wurden 
relativ dazu gespeichert.

von Vlad T. (vlad_tepesch)


Lesenswert?

Uwe Berger schrieb:
> MoinMoin,
>
> deine Procedure GameOfLive_getNeigbors() ist aber relativ fest auf 16x16
> festgelegt...
sämmtliche animations-routinen sind das


>
> Ich hatte bei meinem Code relativ lange überlegt, wie man genau diese
> Geschichte eleganter machen kann und bin auf die Geschichte mit den
> "relativen Zug-Vektoren" aus Sicht des betrachteten Feldes verfallen:
>
>
>
1
> const uint8_t vx[8] = {-1, -1, -1,  0, 0,  1, 1, 1};
2
> const uint8_t vy[8] = {-1,  0,  1, -1, 1, -1, 0, 1};
3
>
>
> Ähnlich wird es auch in einigen Schachprogrammen gemacht...
halte ich in diesem Fall für platz- und rechenzeitverschwendung
>
> Aber sonst auch eine ganz nette Implementierung!
>
> Grüße Uwe

von Uwe B. (boerge) Benutzerseite


Lesenswert?

Simon K. schrieb:
> Du lädst ja signed Werte in ein unsigned Array ;)
>
stimmt, ist mir noch gar nicht aufgefallen. uint8_t nimmt man irgendwie 
im Schlaf, ohne darüber nachzudenken...

Funktioniert aber trotzdem. Wenn ich mir meinen Code anschaue, wird da 
wohl dann doch (zufällig) richtig gecasted (blödes Wort):
1
int8_t nx, ny;
2
...
3
nx=(int8_t)x+vx[i];
4
ny=(int8_t)y+vy[i];

Grüße Uwe

von Uwe B. (boerge) Benutzerseite


Lesenswert?

Vlad Tepesch schrieb:
> Uwe Berger schrieb:
>> MoinMoin,
>>
>> deine Procedure GameOfLive_getNeigbors() ist aber relativ fest auf 16x16
>> festgelegt...
> sämmtliche animations-routinen sind das
>
ja, habe ich gesehen, habe die nur beispielhaft rausgegriffen...

>
>>
>> Ich hatte bei meinem Code relativ lange überlegt, wie man genau diese
>> Geschichte eleganter machen kann und bin auf die Geschichte mit den
>> "relativen Zug-Vektoren" aus Sicht des betrachteten Feldes verfallen:
>>
>>
>>
1
>> const uint8_t vx[8] = {-1, -1, -1,  0, 0,  1, 1, 1};
2
>> const uint8_t vy[8] = {-1,  0,  1, -1, 1, -1, 0, 1};
3
>>
>>
>> Ähnlich wird es auch in einigen Schachprogrammen gemacht...
> halte ich in diesem Fall für platz- und rechenzeitverschwendung
>
warum?

Grüße Uwe

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.