www.mikrocontroller.net

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


Autor: Lehrmann Michael (ubimbo)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mark Brandis (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Lehrmann Michael (ubimbo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Servus Mark Brandis,

vielen Dank ... hab ich nochnicht gefunden.

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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Uwe Berger (boerge) Benutzerseite
Datum:

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

Grüße Uwe

Autor: Uwe Berger (boerge) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... ähm, der Link fehlt :-)

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

Grüße Uwe

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gast (Gast) (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Vlad Tepesch (vlad_tepesch)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Uwe Berger (boerge) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:

const uint8_t vx[8] = {-1, -1, -1,  0, 0,  1, 1, 1};
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

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht 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:
>
>
>
> const uint8_t vx[8] = {-1, -1, -1,  0, 0,  1, 1, 1};
> const uint8_t vy[8] = {-1,  0,  1, -1, 1, -1, 0, 1};
> 
>
> Ä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

Autor: Uwe Berger (boerge) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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):
int8_t nx, ny;
...
nx=(int8_t)x+vx[i];
ny=(int8_t)y+vy[i];

Grüße Uwe

Autor: Uwe Berger (boerge) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
>>
>>
>>
>> const uint8_t vx[8] = {-1, -1, -1,  0, 0,  1, 1, 1};
>> const uint8_t vy[8] = {-1,  0,  1, -1, 1, -1, 0, 1};
>> 
>>
>> Ähnlich wird es auch in einigen Schachprogrammen gemacht...
> halte ich in diesem Fall für platz- und rechenzeitverschwendung
>
warum?

Grüße Uwe

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.