|
|
|
/** Conways Spiel des Lebens (etwa B845, S.330):
In dieser Lebensform besteht ein Organismus aus einer einzelnen Zelle, die an (lebendig) oder
aus (tot) sein kann.
Die Regeln sind:
1. Wenn eine Lebensform zwei oder drei Nachbarn hat, überlebt sie. Anderfalls stirbt sie
2. Wenn eine leere Zelle von genau drei Zellen umgeben ist, dann wird eine neue Lebenszelle
geboren.
3. Alle Geburten und Todesfälle finden gleichzeitig statt.
Das Spiel des Lebens wurde um 1970 von John Horton Conway, einem
Mathematiker der Univerität Cambridge entwickelt und von Martin
Gardner im Buch "Wheels, Life and Other Mathematical Amusements"
bekannt gemacht
Es gibt Figuren, die sich zyklisch verändern (etwa Pulsar) oder
sich bewegen (etwa Glider)
Die hier programmierte Welt ist ein Torus.
*/
import java.awt.*;
import java.applet.Applet;
import java.awt.event.*;
public class Life01 extends Applet
implements ActionListener, MouseListener {
private Welt welt; // Die Welt der Lebewesen, siehe unten
private Button startB, stopB;
private Label zeitInfoL;
public void init() {
startB = new Button("Start");
add(startB);
startB.addActionListener(this);
stopB = new Button("Stop");
add(stopB);
stopB.addActionListener(this);
zeitInfoL = new Label("Zeit steht.");
add(zeitInfoL);
this.addMouseListener(this);
Graphics g = getGraphics();
welt = new Welt(g);
welt.start();
}
public void paint(Graphics g) {
welt.zeichneWelt();
welt.zeichneLebewesen();
}
public void actionPerformed(ActionEvent ev) {
if (ev.getSource()==startB) {
welt.starten();
zeitInfoL.setText("Zeit läuft.");
}
if (ev.getSource()==stopB) {
welt.anhalten();
zeitInfoL.setText("Zeit steht.");
}
}
public void mouseClicked(MouseEvent ev) {
int x = ev.getX();
int y = ev.getY();
welt.aendereLeben(x,y);
welt.zeichneLebewesen();
}
public void mouseReleased(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
} // ende class Life01
class Welt extends Thread {
private final int weltX0 = 10, weltY0=40; // linke obere Ecke der Welt
private final int dX = 4, dY = 4; // Größe der Lebenszellen
private final int nX=150, nY=80; // Indexgroesse lebewesen
private boolean lebewesen[][];
private boolean lebewesenAlt[][];
private final Color lebensFarbe = Color.red; //Zeichenfarben
private final Color todesFarbe = Color.yellow;
private final Color weltFarbe = Color.green;
private final int zyklusZeit = 50; // in Millisekunden
private Graphics g;
private boolean weitermachen = false;
public Welt(Graphics gE) {
g = gE;
lebewesen = new boolean[nX][nY];
lebewesenAlt = new boolean[nX+2][nY+2];
// im alten Zustand lebewesenAlt[i+1,j+1] wird der Zustand
// von lebewesen[i,j] abgespeichert. Der Rand wird dabei
// torusartig ergänzt.
// zeichne Gleider
setzeGlider(5,5); setzeGlider(40,50);
setzeGlider(126,55); setzeGlider(107,55);
// zeichne Pulsar
setzePulsar(25,15); setzePulsar(60,35);
setzePulsar(20,70); setzePulsar(120,30);
zeichneWelt();
zeichneLebewesen();
}
public void aendereLeben(int x, int y) {
int nx = findeLebewesenX(x);
int ny = findeLebewesenY(y);
if ( (nx>=0) && (ny>=0) ) {
if (lebewesen[nx][ny]) {
lebewesen[nx][ny]=false;
}
else {
lebewesen[nx][ny]=true;
}
}
}
private int findeLebewesenX(int x) {
int nx = (x-weltX0)/dX;
if (nx <0 || nx >=nX) nx=-1;
return nx;
}
private int findeLebewesenY(int y) {
int ny = (y-weltY0)/dY;
if (ny <0 || ny >=nY) ny=-1;
return ny;
}
public void zeichneWelt() {
int i,j;
g.setColor(weltFarbe);
g.fillRect(weltX0, weltY0, nX*dX, nY*dY);
}
public void zeichneLebewesen() {
int i, j;
for (i=0; i |
|
|
|
|
|
|