- fchao-Sinus-Wechselrichter AliExpress         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 18

Thema: Conway's Game of Life auf einem ATmega32

  1. #1
    Erfahrener Benutzer Begeisterter Techniker Avatar von Torrentula
    Registriert seit
    10.10.2009
    Ort
    Procyon A
    Beiträge
    355

    Conway's Game of Life auf einem ATmega32

    Anzeige

    Powerstation Test
    Hallo ihr Programmier-Spezialisten!

    Ich möchte Conway's Game of Life auf einem ATmega32 zum laufen bekommen. Zuerst einmal: Was ist das?

    Conway's Game of Life ist eine Bevölkerungsimulation. Es gibt n-Zellen auf einem Feld das idealerweise unbegrenzt groß ist. Eine Zelle x hat immer 8 Nachbarn die sie umgeben. Eine Zelle kann sich nur in einem von zwei Stadien befinden: tot oder lebend. Welche Zellen im ersten Zyklus leben und welche nicht werden einfach festglegt.

    Das Spiel läuft weiterhin immer in Zyklen ab.

    Das Stadium in dem sich eine Zelle befindet wird durch das Befolgen von 4 Regeln bestimmt:

    1. Eine tote Zelle mit genau drei lebenden Nachbarn wird in der Folgegeneration (im nächsten Zyklus) neu geboren.

    2. Lebende Zellen mit weniger als zwei lebenden Nachbarn sterben in der Folgegeneration an Einsamkeit.

    3. Eine lebende Zelle mit zwei oder drei lebenden Nachbarn bleibt in der Folgegeneration lebend.

    4. Lebende Zellen mit mehr als drei lebenden Nachbarn sterben in der Folgegeneration an Überbevölkerung.

    So nun zu meinem Problem:

    Um das ganze ein wenig einzugrenzen möchte ich das "Spielfeld" 3*3 LEDs groß sein lassen. Damit nun aber die Bedingung erfüllt ist, dass jede Zelle 8 Nachbarn hat, kann man sich das auch wie eine 5*5 Matrix vorstellen. Die 9 LEDs befinden sich in der Mitte der 5*5 Matrix und die Felder (Zellen) außen herum befinden sich immer im Status "tot" (deshalb werden diese auch nicht mit LEDs dargestellt).

    Nun muss man natürlich für jede der 9 dargestellten Zellen alle 4 Regeln überprüfen. Ich habe mir das so gedacht, dass man die Zellen in einem Array darstellt und dann mit schleifen immer Zelle für Zelle durchlaufen lässt und dies dann am Ende mit den LEDs darstellt.

    Wie könnte das Programm aussehen, dass die Stadien der 9 dargestellten Zellen überprüft und die Stadien der Zellen dann eben entsprechend der Regeln auf den Status tot = 0 oder lebend = 1 setzt?

    Vielen Dank!

    Torrent
    MfG Torrentula

  2. #2
    Super-Moderator Lebende Robotik Legende Avatar von Manf
    Registriert seit
    30.01.2004
    Ort
    München
    Alter
    71
    Beiträge
    13.052
    Das Spiel lebt von unterschiedlichen Verteilungen und der Dynamik die sich daraus ergibt. Sieh Dir lieber vorher noch einmal Abläufe des Spiels an. Unter 80 x 50 ist es eigentlich kaum interessant eher so 320 x 240. Man kann die Fläche mit totem Rand oder als Toroid ausführen und von Zufallsverteilungen mit 0,5% - 5% lebender Zellen starten.

  3. #3
    Erfahrener Benutzer Begeisterter Techniker Avatar von Torrentula
    Registriert seit
    10.10.2009
    Ort
    Procyon A
    Beiträge
    355
    Ja in meinem Fall soll es eine Version mit totem Rand sein.

    Unter 80 x 50 ist es eigentlich kaum interessant
    Aber nur mal rein von dem Code her wie würde man so eine allgemeine Funktion schreiben?

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von BMS
    Registriert seit
    21.06.2006
    Ort
    TT,KA
    Alter
    33
    Beiträge
    1.192
    Hallo,
    hab das gerade in Blitzplus (das wird wohl kaum einer kennen^^) programmiert und es läuft für ein 100x75-Feld. (Könnte auch eine exe daraus erzeugen falls erwünscht)
    Code:
    Graphics 400,300,16,2;Grafikauflösung
    SeedRnd MilliSecs();Zufallszahlen
    
    Const width=99
    Const height=74
    Dim bit(width,height) ;Bitfeld
    Dim alt(width,height) ;Backup
    
    ; ein paar Teilchen aussäen
    For c=0 To 500
        bit(Rand(1,width-1),Rand(1,height-1))=1
    Next
    
    ;Schleife
    Repeat
    
        Cls
    
        Color 255,255,255
        ;Alle Positionen durchgehen
        For a=1 To width-1
            For b=1 To height-1
                ;in andere Matrix kopieren
                alt(a,b)=bit(a,b)
                ;Nachbarn checken
                anz=0
                anz=anz+alt(a-1,b-1)+alt(a,b-1)+alt(a+1,b-1)    
                anz=anz+alt(a-1,b  )+          +alt(a+1,b  )    
                anz=anz+alt(a-1,b+1)+alt(a,b+1)+alt(a+1,b+1)
                ;Wiedergeburt
                If anz=3 And bit(a,b)=0 Then bit(a,b)=1
                ;Einsamkeit
                If anz<2 And bit(a,b)=1 Then bit(a,b)=0
                ;bleibt am Leben
                If (anz=2 Or anz=3)And bit(a,b)=1 Then bit(a,b)=1
                ;Überbevölkerung
                If anz>3 Then bit(a,b)=0
            Next
        Next    
    
        ;Anzeige
        For a=0 To width
            For b=0 To height
                If bit(a,b)=1 Then Rect 4*a,4*b,4,4
            Next
        Next
        
        Color 255,0,0
        Text 0,0,"Beenden mit ESC"
        
        ;Wartezeit
        Delay 100
        
        Flip
        
    Until KeyHit(1) ;ESC
    
    End
    Grüße, Bernhard

  5. #5
    Erfahrener Benutzer Begeisterter Techniker Avatar von Torrentula
    Registriert seit
    10.10.2009
    Ort
    Procyon A
    Beiträge
    355
    Eigentlich meinte ich ein Programm in der Sprache C

  6. #6
    Erfahrener Benutzer Roboter Genie Avatar von BMS
    Registriert seit
    21.06.2006
    Ort
    TT,KA
    Alter
    33
    Beiträge
    1.192
    das lässt sich leicht portieren Es geht ja erst mal nur um die prinzipielle Vorgehensweise.
    Ein Bitfeld erzeugen, zufällige Punkte setzen, Backup vom Bitfeld erzeugen, im Backup für jeden Punkt die Anzahl der aktiven Nachbarn bestimmen und dann die Aktion wählen (ins urspr. Bitfeld eintragen), anzeigen.

  7. #7
    Erfahrener Benutzer Begeisterter Techniker Avatar von Torrentula
    Registriert seit
    10.10.2009
    Ort
    Procyon A
    Beiträge
    355
    Jo hast recht macht für mich einen Sinn dein Code. Ne exe von dem Spiel zu sehen wäre auch interessant

    Wie hast du in diesem Fall den toten Rand deklariert? In C würde ich das in einem Array vordefinieren z.B. Feld[0][0]=0;

    P.S.: erinnert mich irgendwie an Basic dieses Blitzplus

  8. #8
    Erfahrener Benutzer Roboter Genie Avatar von BMS
    Registriert seit
    21.06.2006
    Ort
    TT,KA
    Alter
    33
    Beiträge
    1.192
    Hallo,
    hab jetzt eine .exe aus dem Code erstellt und gepackt (siehe Anhang). Beenden mit ESC

    Zu dem toten Rand: Meine Matrix ist von Anfang an mit Nullen gefüllt. Ich lasse danach aber nicht alle Punkte durchgehen, sondern nur von 1 bis width-1 bzw. 1 bis height-1. Damit bleibt an jedem Rand 1 Position unbeachtet.
    Diese Punkte gelten schon als Nachbar, werden aber nie aktiv. Hat auch den Vorteil, dass ich keine ungültigen Lesezugriffe bekomme, wenn ich z.B. von einem Bit in Spalte 0 noch den linken Nachbar (das wäre -1) prüfen wollte, weil ich ja eh erst ab Spalte 1 einlese.

    Blitzplus ist ein Basic-Dialekt, die ursprüngliche Version hieß Blitzbasic und war für die Spieleprogrammierung gedacht. Die Weiterentwicklung von Blitzbasic war eben Blitzplus (mit GUI) und Blitz3D (3D halt). Das neueste heißt Blitzmax.

    Grüße, Bernhard
    Angehängte Dateien Angehängte Dateien

  9. #9
    Erfahrener Benutzer Begeisterter Techniker Avatar von Torrentula
    Registriert seit
    10.10.2009
    Ort
    Procyon A
    Beiträge
    355
    Sieht cool aus dein Programm!

    ok ich habe das jetzt mal versucht umzuschreiben soweit noch keine Probleme mit den Schleifen und allem. Nun aber:

    Was stellen die Leerzeichen hier dar:
    Code:
    anz=anz+alt(a-1,b  )+               +alt(a+1,b   )
    Geändert von Torrentula (13.04.2011 um 17:08 Uhr)
    MfG Torrentula

  10. #10
    Erfahrener Benutzer Roboter Genie Avatar von BMS
    Registriert seit
    21.06.2006
    Ort
    TT,KA
    Alter
    33
    Beiträge
    1.192
    Die Leerzeichen haben keine Bedeutung, dient nur der Übersichtlichkeit.
    Ein logisches AND in C geht mit && (ja, zwei mal!) , das brauchst du hier

    Der Vollständigkeit halber:
    Bitweises AND geht mit & (nur eins) , das brauchst du hier aber nicht

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Temperatur und DCF77 an einem ATMEGA32 ?
    Von infosystems im Forum AVR Hardwarethemen
    Antworten: 2
    Letzter Beitrag: 14.04.2011, 22:04
  2. Ersatz des atmega8 mit einem atmega32
    Von inka im Forum Asuro
    Antworten: 102
    Letzter Beitrag: 24.01.2008, 14:00
  3. Erste Schritte: Probleme mit einem ATmega32
    Von Bääääär im Forum Elektronik
    Antworten: 6
    Letzter Beitrag: 09.07.2007, 16:19
  4. Game Boy Kamera
    Von moud im Forum Sensoren / Sensorik
    Antworten: 6
    Letzter Beitrag: 20.04.2005, 18:52
  5. Game Boy Programmieren ?
    Von khazad im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 4
    Letzter Beitrag: 30.11.2004, 20:05

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad