Processing

Tere1

Newbie
Registriert
Sep. 2015
Beiträge
4
Hallo Forum
Ich bin relativ neu im Programmierbereich und ich bin mit processing gestartet.
Jetzt jedoch zu meiner Frage:
Ich muss für ein Schulprojekt ein Programm entwerfen: Game of life falls das jemand kennt. Jedenfalls komme ich nicht mehr weiter ich bin beinahe fertig aber aus einem mir unerfindlichen Grund funktioniert es nicht. Deswegen wäre ich sehr froh wenn sich jemand der sich mit processing und game of life auskennt sich kurz die Zeit nehmen würde mein Programm anzuschauen.
Danke im voraus Tere1.
 
Zunächst: Herzlich Willkommen hier im Forum!

Am besten postest Du den Code hierher, dann findet sich bestimmt jemand ;)
 
Hallo und willkommen.

Ich habe hier selber das 'Game of life' implementiert. Mit Rechtsklick und Seitequelltext anzeigen, siehst du auch den Code. Falls du noch fragen hast, nicht zögern. Oder hast du allgemeine Verständnisprobleme?

Kurz zum Code:

  1. In das Canvas wird mit Hilfe von CreateJS gerendert.
  2. Das Raster ist in zwei Arrays hinterlegt.
  3. In einem array wird der 'alte' Zustand gespeichert.
  4. Dann werden neue Positionen für die Zellen berechnet und das alte Raster wird überschrieben.
  5. Welche 'Lebensform' du bekommst hängt davon ab wie das Initialraster im Code befüllt ist.

Ich bin mir aber nicht wirklich sicher was du mit Processing meinst?
 
int s = 10;
int groesseMuster = 10;
int y = 800;
int x = 1000;
int Zustand = 0;
float mousex;
float mousey;
int cols = y/10;
int rows = x/10;
int zustand = 0;
int rundherum = 0;

int zelle = 0;
void setup()
{
size(x, y);
Array1 = new boolean[cols][rows];
}


void drawMaschen()
{
for (int i = 0; i < width; i = i+groesseMuster) {
line(i, 0, i, height);
}



for (int i = 0; i < height; i = i+groesseMuster) {
line( 0, i, width, i);
}
}



boolean[][] Array1;

void draw() { // zeichnet die vierecke



for (int i = 0; i < cols; i++) {
for (int j = 0; j < rows; j++) {
if (Array1[j] == true) {

fill(0);
} else {
fill(255);
}
rect(j*s, i*s, s, s);
}
}
if (zustand == 1)
zustand();
if (zustand == 1)
zellen();
}

void mousePressed() {
int aktX = int(mouseX/s);
int aktY = int(mouseY/s);
Array1[aktY][aktX] = ! Array1[aktY][aktX];
}
void keyPressed() {
if (key == 's' && zustand == 0) {
zustand = 1;
}
}

void zustand() {
for (int i = 1; i < cols; i++) {
for (int j = 1; j < rows; j++) {
if (Array1[j] == true) {

fill(0);
} else {
//command check oben etc.
}
rect(j*s, i*s, s, s);
}
}
}

void zellen() {
int aktX = int(mouseX/s);
int aktY = int(mouseY/s);

if (aktX >= 1 && aktX <= cols && aktY >= 1 && aktY <= rows) {


if (Array1[aktY +1][aktX +1])
zelle ++;
if (Array1[aktY +1][aktX])
zelle ++;
if (Array1[aktY +1][aktX -1])
zelle ++;
if (Array1[aktY][aktX +1])
zelle ++;
if (Array1[aktY -1][aktX -1])
zelle ++;
if (Array1[aktY][aktX -1])
zelle ++;
if (Array1[aktY -1][aktX + 1])
zelle ++;
if (Array1[aktY-1][aktX])
zelle ++;

if (zelle == 3)
Array1[aktY][aktX] = true;

if (zelle >= 4 || zelle <= 1)
Array1[aktY][aktX] = false;
}
}
Das ist mein code. Er funktioniert mit processing und ich bin mir nicht ganz sicher aber ich glaube processing basiert auf java.
Der Fehler ist aus irgendeinem Grund funktioniert das leben und tod erkennen nicht richtig, alle bis zum Lebenden Pixel leben plötzlich. Ich habe auch schon nach anderen Varianten gesucht aber keine gefunden die meiner ähnlich ist, und ich möchte nicht einfach das ganze Programm kopieren, deswegen wäre ich sehr froh wenn jemand den Fehler finden würde, da ich glaube das es einfach nur ein kleiner Fehler ist. Danke für die bisherige Hilfe.
 
2 Fehler sind mir schon aufgefallen:
1) zustand() setzt fill(0); bei der ersten lebenden Zelle und alle anderen werden dann auch so gezeichnet. (zustand() macht auch eigentlich nur genau das was schon die Schleife darüber gemacht hat.)
2) zellen() erhöht immer nur zelle, der Wert wird aber niemals auf 0 zurückgesetzt.

Es gibt auch ein Game of Life Bespiel auf der Seite.

Übrigens wenn Du geposteten Code in [ CODE ] Blöcke einschliesst bleibt auch die Formatierung erhalten z.B:
Code:
        void setup() {
            size(x, y);
            Array1 = new boolean[cols][rows];
        }

        void drawMaschen() {
            for (int i = 0; i < width; i = i + groesseMuster)
                line(i, 0, i, height);

            for (int i = 0; i < height; i = i + groesseMuster)
                line(0, i, width, i);
        }
 
Vielen Dank für deine Tipps:)
Ich habe nun ()zustand rausgelöscht
Das Problem ist nur, dass ich das mit fill nicht verstehe es war nicht nur mein Programm auch ein Kumpel hat mir ein bisschen geholfen, ist ne komplizierte Geschichte aber die Kurzfassung ist, ich bin noch ein ziemlich schlechter Programmierer, aber trotzdem der beste der Gruppe (die anderen verstehen gar nichts davon). Jedenfalls ist Freitag Abgabetermin und mein Kumpel kann mir nicht mehr helfen und da alles kompliziertere von ihm ist habe ich komplett den überblick verloren. Deshalb wäre ich dir sehr dankbar wenn du etwas präziser auf den Fehler eingehen würdest evt auch Lösungsvorschlag^^
Danke im Voraus
 
Ok, ein paar Tipps, zellen() muss über alle Zellen gehen und nicht nur die wo die Maus gerade ist, mach eine Kopie von Array1 in z.B Array2 aus dem du den Status prüfst (if (Array2[...) und änder die Zellen in Array1, weil du sonst Zellen veränderst die eigentlich Auswirkungen auf andere Zellen haben sollten.

Code:
boolean[][] Array2;

...
for (int i=0; i<cols; i++) {
    for (int j=0; j<rows; j++) {
      Array2[i][j] = Array1[i][j];
    }
}
 
Vielen Dank ich habe versucht alle deine Tipps umzusetzen
Code:
int s = 10;
int groesseMuster = 10;
int y = 800;
int x = 1000;
int Zustand = 0;
float mousex;
float mousey;
int cols = y/10;
int rows = x/10;
int zustand = 0;
int rundherum = 0;

int zelle = 0;
void setup()
{
  size(x, y);
  Array1 = new boolean[cols][rows];
}


void drawMaschen()
{
  for (int i = 0; i < width; i = i+groesseMuster) {
    line(i, 0, i, height);
  }



  for (int i = 0; i < height; i = i+groesseMuster) {
    line( 0, i, width, i);
  }
}



boolean[][] Array1;
boolean[][] Array2;

void draw() {  // zeichnet die vierecke



  for (int i = 0; i < cols; i++) {
    for (int j = 0; j < rows; j++) {
      if (Array1[i][j] == true) {

        fill(0);
      } else {
        fill(255);
      }
      rect(j*s, i*s, s, s);
    }
  }
  if (zustand == 1)
    zustand();
  if (zustand == 1)
    zellen();
} 

void mousePressed() {
  int aktX = int(mouseX/s);
  int aktY = int(mouseY/s);
  Array1[aktY][aktX] = ! Array1[aktY][aktX];
}
void keyPressed() {
  if (key == 's' && zustand == 0) {
    zustand = 1;
  }
}

void zustand() {
 for (int i=0; i<cols; i++) {
    for (int j=0; j<rows; j++) {
      Array2[i][j] = Array1[i][j];
    }
}
}

void zellen() {
   for (int i=0; i<cols; i++) {
    for (int j=0; j<rows; j++) {
      
      if (i >= 1 && i <= cols && j >= 1 && j <= rows) {


    if (Array2[j +1][i +1])
      zelle ++;
    if (Array2[j +1][i])
      zelle ++;
    if (Array2[j +1][i -1])
      zelle ++;
    if (Array2[j][i +1])
      zelle ++;
    if (Array2[j -1][i -1])
      zelle ++;
    if (Array2[j][i -1])
      zelle ++;
    if (Array2[j -1][i + 1])
      zelle ++;
    if (Array2[j-1][i])
      zelle ++;

    if (zelle == 3)
      Array1[j][i] = true;

    if (zelle >= 4 || zelle <= 1)
      Array1[j][i] = false;
      i = 0;
      j = 0;
  }
}
   }
 }
Eine Fehleranzeige ist bei Array2 = Array1 Zeile 74 siehst du sonst noch irgendwo Fehler? Danke im voraus.
Ergänzung ()

Code:
    int s = 10;
    int groesseMuster = 10;
    int y = 800;
    int x = 1000;
    int Zustand = 0;
    float mousex;
    float mousey;
    int cols = y/10;
    int rows = x/10;
    int zustand = 0;
    int rundherum = 0;
     
    int zelle = 0;
    void setup()
    {
    size(1000, 1000);
    Array1 = new boolean[cols][rows];
    }
     
     
    void drawMaschen()
    {
    for (int i = 0; i < width; i = i+groesseMuster) {
    line(i, 0, i, height);
    }
     
     
     
    for (int i = 0; i < height; i = i+groesseMuster) {
    line( 0, i, width, i);
    }
    }
     
     
     
    boolean[][] Array1;
    boolean[][] Array2;
     
    void draw() { // zeichnet die vierecke
     
     
     
    for (int i = 0; i < cols; i++) {
    for (int j = 0; j < rows; j++) {
    if (Array1[i][j] == true) {
     
    fill(0);
    } else {
    fill(255);
    }
    rect(j*s, i*s, s, s);
    }
    }
    if (zustand == 1)
    zustand();
    if (zustand == 1)
    zellen();
    //(zustand == 0);
     }
    void mousePressed() {
    int aktX = int(mouseX/s);
    int aktY = int(mouseY/s);
    Array1[aktY][aktX] = ! Array1[aktY][aktX];
    }
    void keyPressed() {
    if (key == 's' && zustand == 0) {
    zustand = 1;
    }
    }
     
    void zustand() {
    for (int i=0; i<cols; i++) {
    for (int j=0; j<rows; j++) {
     //Array2[i][j];
      Array2[i][j] = Array1[i][j];
    }
    }
    }
     
    void zellen() {
    for (int i=0; i<cols; i++) {
    for (int j=0; j<rows; j++) {
    if (j >= 1 && j <= cols + 1 && i >= 1 && i <= rows + 1) {
     
     
    if (Array2[i +1][j +1])
    zelle ++;
    if (Array2[i +1][j])
    zelle ++;
    if (Array2[i +1][j -1])
    zelle ++;
    if (Array2[i][j +1])
    zelle ++;
    if (Array2[i -1][j -1])
    zelle ++;
    if (Array2[i][j -1])
    zelle ++;
    if (Array2[i -1][j + 1])
    zelle ++;
    if (Array2[i-1][j])
    zelle ++;
     
    if (zelle == 3)
    Array1[i][j] = true;
     
    if (zelle >= 4 || zelle <= 1)
    Array1[i][j] = false;
    
    zelle = 0;
    }
    }
    }
    }
Neues update:
Probeleme Array2 ist null und ich verstehe nicht wie ich das ändern kann, wahrscheinlich sind auch sonst noch einige Fehler versteckt danke im voraus
 
int zelle = 0; würde ich nur in zellen() definieren, weil es ja nur da gebraucht wird.
Array2 muss genau wie Array1 definiert werden, also oben in setup() noch:
Array2 = new boolean[cols][rows];
Sonst sieht es soweit ok aus, wobei ich einige Variablennamen ändern würde, wegen der Lesbarkeit:
zelle -> neighbors
x -> width
y -> height

int Zustand = 0;
float mousex;
float mousey;
int rundherum = 0;
rauslöschen, werden nie verwendet.

s und groesseMuster sind das gleiche, also für eine entscheiden.

int cols = y/10;
int rows = x/10;
sollte wohl besser
int rows= width/s;
int cols = height/s;
sein.

keypressed() würde ich ändern in:
Code:
void keyPressed() {
  if (key == 's')
    zustand = 1;
  else if (key == 'p')
    zustand = 0;
}
dann kannst du die laufende Engine auch wieder stoppen.

Dann wär der Code schon ziemlich gut.

Ich sehe gerade noch, die Prüfung in zellen() ist falsch:
if (j >= 1 && j <= cols + 1 && i >= 1 && i <= rows + 1) {
Du willst ein ArrayOutOfBounds verhindern, deshalb wäre:
if (j >= 1 && j <= cols - 1 && i >= 1 && i <= rows - 1) {
richtig, dann kann man aber die beiden For-Schleifen bei 1 starten lassen und bei v-1 enden lassen, aber wenn du diese Änderung machst kannst du dir diese Prüfung gleich ganz sparen.
Nachteil ist in beiden Fällen das die Zellen sich am Rand nicht korrekt verhalten.
Eigentlich müsste diese OutOfBounds-Abfrage vor jeder Zellenprüfung sein. z.B:
Code:
    if (j + 1 < cols) {
      if (i + 1 < rows && Array2[j +1][i +1])
        zelle ++;
      if (Array2[j +1][i])
        zelle ++;
      if (i - 1 >= 0 && Array2[j +1][i -1])
        zelle ++;
    }

Ansonsten, hau rein, das wird schon. :D
 
Tere1 schrieb:
Jedenfalls ist Freitag Abgabetermin und mein Kumpel kann mir nicht mehr helfen und da alles kompliziertere von ihm ist habe ich komplett den überblick verloren.

Ganz schlecht :D Sowas immer zu zweit vor _einem_ Rechner machen, dann wissen auch beide was gehauen und gestochen ist. Normalerweise ist es am Ende gar nicht so wichtig dass das fehlerfrei läuft (jedenfalls wenn der Lehrer nicht vom Mond ist), wenn man erklären kann was da abläuft, was man sich gedacht hat und wo möglich Fehler liegen ist IMHO ein schweres fehlerhaftes Projekt immer noch besser als ein einfaches fehlerfreies.

Processing basiert btw auf Javascript, nicht auf Java :D
 
@mambokurt

So wie ich das verstanden habe gab zuerst Processing (Java), dann processing.js (JavaScript) und zurzeit wird die Java Processing Bibliothek nach p5.js (JavaScript) portiert.

Habe ich das etwa falsch verstanden?
 
Zurück
Oben