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
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:
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:>>>
>> Ä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):
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:>>>>>>