Game of Life in C für µC

OP #1467033
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
Gast #1467235
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
#1467321
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.
Persönliche Seite #1467563
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
#1467719
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
Persönliche Seite #1467743
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
Persönliche Seite #1467745
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren