Wir programmieren Teil 8
Dieses ist der 8. Teil. Hier geht es zum 7. Teil.
Erstmal zur Lösung:
int[][] feld=new int[10][10];
int[][] z=new int[10][10];
int xs=0;
int ys=0;
// --------------------------------------------------------
// Setup, also Erstellen des Programmfensters
void setup() {
size(640,480);
xs=width/8;
ys=height/8;
smooth(); frameRate(3);
for (int x=1;x < 9; x++) {
for (int y=1;y < 9; y++) {
if (int(random(0,3))==1) feld[x][y]=1;
}
}
fill(255,0,0);
}
// --------------------------------------------------------
// Hauptfunktion
void draw() {
background(0,0,0);
int l=0;
for (int x=1;x < 9; x++) {
for (int y=1;y < 9; y++) {
l=-feld[x][y];
for (int xx=-1; xx < 2; xx++) {
for (int yy=-1; yy < 2; yy++) {
l+=feld[x+xx][y+yy];
}
}
if (l==3) { z[x][y]=1; }
if (l==2) { z[x][y]=feld[x][y]; }
if (l > 3) { z[x][y]=0; }
if (l < 2) { z[x][y]=0; }
}
}
for (int x=1;x < 9; x++) {
for (int y=1;y < 9; y++) {
feld[x][y]=z[x][y];
if (feld[x][y]==1) {
rect((x-1)*xs,(y-1)*ys,xs-1,ys-1);
}
}
}
}
Schade ist, dass wir keine Steine selbst setzen können, darum kümmern wir uns jetzt.
Am elegantesten ginge das Setzen und Löschen von lebenden Zellen mit der Maus. Hierfür gibt es die Systemvariablen mouseX, mouseY, mouseButton, mousePressed, keyPressed . Den Wert von Systemvariablen bestimmt das System. Bisher hatten wir am Anfang z.B. width und height genutzt, die die Breite und Höhe des Fensters enthalten. mouseButton enthält z.B. ein einen gültigen Wert (z.B. LEFT) in dem Moment, wo mousePressed true enthält. So könnte man z.B. abfragen, ob die linke Taste gedrückt wurde mit:
if (mousePressed && mouseButton==LEFT) { ... }
Gut wäre es, mit einem Linksklick eine Zelle zum Leben zu erwecken und mit einem Rechtsklick sie sterben zu lassen.
Aus der Mausposition müssen wir noch die Koordinaten des Kästchens berechnen. Dabei ist zu beachten, dass mouseX 0 ist, sobald der Mauszeiger nicht im Fenster ist. Auch werden die Reihen und Zeilen 0 und 9 nicht angezeigt!
In meiner Lösung nutze ich für die Kästchenkoodinaten, die sich aus der Position des Mauszeigers ergeben die Variablen mx und my.
Unser bisheriges Programm nutzt die Eigenschaft, dass z.B. nur 3 mal pro Sekunde ein Generationsschritt passiert. Diese Programmierung hätte zur Folge, dass auch die Maus oder besser das mit der Maus gewählte Kästchen sich so träge verhält. Abhilfe schaftt hier wieder ein Counter, sodass wir wieder mit 30 Frames pro Sekunde das Bild aufbauen lassen, aber nur alle 20 Frames einen Generationsschritt machen.
In meiner Lösung nutze ich hierfür die Variable framecount.
Obwohl nur alle 20 Frames eine Generationsschritt erfolgen soll, muss das Feld bei jedem Durchgang sichtbar gemacht werden! Sonst bekommen wir mit dem folgenden Punkt Probleme.
Das durch die Maus gewählte Kästchen lasse ich wie folgt einfärben:
fill(255,255,255,60);
rect((mx-1)*xs,(my-1)*ys,xs-1,ys-1);
Der 4. Wert bei fill sagt aus, dass die Füllung durchschimmert. Die Farbkodierung nennt sich folglich RGBA.
Noch eine letzte letzte Forderung: Solange eine Taste gedrückt ist, sollten keine Generationsschitte erfolgen. Auf diese Art lassen sich auch die besonderen Konstellationen aus dem Wikipediaartikel nachbauen.
Es gibt viel zu tun, also legt los! Bis morgen mit Teil 9!




Nach den doch recht schleppenden Beginn geht es nun doch vorwärts. Auf der Seite http://reactivision.sourceforge.net/ fand sich die benötigte Software und ich wagte...