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
Servus Mark Brandis, vielen Dank ... hab ich nochnicht gefunden. Sag deiner lieben Tante Goooogle einen lieben Gruß =) achwas vielen Dank
>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.
... und hier meine Implementierung für einen Mega8, allerdings mit 8x8, sollte sich aber problemlos anpassen lassen... Grüße Uwe
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.
> 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
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.
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
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.
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.