Coding'n Sim 4

Diese Seite hält Code und zusätzliche Hilfsmittel bereit.

Referenzlinks

Basiscode: Wolfram ZA


// p5js Beispiel "Wolfram CA"
// https://p5js.org/examples/
// verändert sci

let w = 10;
let zellen;                                      // 1D-Array, wird mit Nullen und Einsen gefüllt
let generation = 0;
let regelset = [0, 1, 0, 1, 1, 0, 1, 0];         // 1D-Array zum Speichern des Regelsets, z.B. [0,1,1,0,1,1,0,1]

function setup() {
  createCanvas(640, 400);
  zellen = Array(floor(width / w));
  for (let i = 0; i < zellen.length; i++) {
    zellen[i] = 0;
  }
  // zum Start wird in der 0. Generation nur die mittlere Zelle auf Status "1" geseetzt
  zellen[zellen.length/2] = 1;
}

function draw() {
  for (let i = 0; i < zellen.length; i++) {
    if (zellen[i] === 1) {
      fill(200);
    } else {
      fill(51);
      noStroke();
      rect(i * w, generation * w, w, w);
    }
  }
  if (generation < height/w) {
    generieren();
  }
}

// generiert die nächste Generation
function generieren() {
  let nextgen = Array(zellen.length);
  // Für jede Zelle Status festlegen, aufgrund des Vorfahren und dessen Nachbarn.
  // Randzellen ignorieren, da diese nur einen Nachbarn haben.
  for (let i = 1; i < zellen.length-1; i++) {
    let links   = zellen[i-1];                   // Status des linken Nachbarn auslesen
    let ich     = zellen[i];                     // Status des Vorfahren auslesen
    let rechts  = zellen[i+1];                   // Status des rechten Nachbarns auslesen
    nextgen[i] = regeln(links, ich, rechts);     // neuer Status aufgrund dieser Dreiernachbarschaft bestimmen
  }
  // die aktuelle Generation wird zur aktuellen generation
  zellen = nextgen;
  generation = generation + 1;
}

// Funktion enthält die Wolfram Regeln und liefert den passenden Wert zurück | umständlich programmiert - aber anschaulich
function regeln(a, b, c) {
  if (a == 1 && b == 1 && c == 1) {
    return regelset[0];
  }
  if (a == 1 && b == 1 && c == 0) {
    return regelset[1];
  }
  if (a == 1 && b == 0 && c == 1) {
    return regelset[2];
  }
  if (a == 1 && b == 0 && c == 0) {
    return regelset[3];
  }
  if (a == 0 && b == 1 && c == 1) {
    return regelset[4];
  }
  if (a == 0 && b == 1 && c == 0) {
    return regelset[5];
  }
  if (a == 0 && b == 0 && c == 1) {
    return regelset[6];
  }
  if (a == 0 && b == 0 && c == 0) {
    return regelset[7];
  }
  return 0;
}

Code: Game of Life


// p5js Beispiel "Game of Life"
// https://p5js.org/examples/
// verändert sci

let w;
let spalten;
let zeilen;
let brett;
let next;

function setup() {
  frameRate(10);
  createCanvas(720, 400);
  w = 20;
  // Aanzahl Spalten und Zeilen berechnen
  spalten = floor(width / w);
  zeilen = floor(height / w);
  // schrullige Art 2D-Array in JS zu generieren
  brett = new Array(spalten);
  for (let i = 0; i < spalten; i++) {
    brett[i] = new Array(zeilen);
  }
  // dito., für ein zweites 2D-Array
  next = new Array(spalten);
  for (i = 0; i < spalten; i++) {
    next[i] = new Array(zeilen);
  }
  init();
}

function draw() {
  background(255);
  generieren();
  for ( let i = 0; i < spalten; i++) {
    for ( let j = 0; j < zeilen; j++) {
      if ((brett[i][j] == 1)) {
        fill(0);
      } else {
        fill(255);
      }
      stroke(0);
      rect(i * w, j * w, w-1, w-1);
    }
  }
}

// Brett bei Mausklick zurücksetzen
function mousePressed() {
  init();
}

// Brettzellen zufällig füllen
function init() {
  for (let i = 0; i < spalten; i++) {
    for (let j = 0; j < zeilen; j++) {
      // Randzellen mit Nullen füllen, die restlichen Zellen mit Zufallszahl [0, 1]
      if (i == 0 || j == 0 || i == spalten-1 || j == zeilen-1) {
        brett[i][j] = 0;
      } else {
        brett[i][j] = floor(random(2));
      }
      next[i][j] = 0;
    }
  }
}

// Neue Generation erstellen
function generieren() {

  // durch alle Zellen iterieren und direkte Nachbarn checken
  for (let x = 1; x < spalten - 1; x++) {
    for (let y = 1; y < zeilen - 1; y++) {
      // alle Werte des 3x3 Felder grossen Spots aufadieren
      let nachbarn = 0;
      for (let i = -1; i <= 1; i++) {
        for (let j = -1; j <= 1; j++) {
          nachbarn = nachbarn + brett[x+i][y+j];
        }
      }

      // kleiner Trick: Wert der zentralen Zelle subtrahieren, da in vorherige for-Schleife aufsummiert
      nachbarn = nachbarn - brett[x][y];
      // Überlebensregeln anwenden
      if ((brett[x][y] == 1) && (nachbarn <  2)) {                 // Einsamkeit
        next[x][y] = 0;
      } else if ((brett[x][y] == 1) && (nachbarn >  3)) {          // Überpopulation
        next[x][y] = 0;
      } else if ((brett[x][y] == 0) && (nachbarn == 3)) {          // Geburt
        next[x][y] = 1;
      } else {                                                     // Überleben
        next[x][y] = brett[x][y];                                  
      }
    }
  }

  // Swap! | Tausch!
  let temp = brett;
  brett = next;
  next = temp;
}

Code: Langtons Ant


// Langton's Ant
// https://thecodingtrain.com/challenges/89-langtons-ant by D. Shiffman
// angepasst sci

let gitter;
let x;
let y;
let richtung;

let ANTNORD = 0;
let ANTOST = 1;
let ANTSUED = 2;
let ANTWEST = 3;

function setup() {
  createCanvas(400, 400);
  background(245);
  gitter = mache2DArray(width, height);
  x = width / 2;
  y = height / 2;
  richtung = ANTNORD;
}

function dreheRechts() {
  richtung++;
  if (richtung > ANTWEST) {
    richtung = ANTNORD;
  }
}

function dreheLinks() {
  richtung--;
  if (richtung < ANTNORD) {
    richtung = ANTWEST;
  }
}

function bewegeVorwaerts() {
  if (richtung == ANTNORD) {
    y--;
  } else if (richtung == ANTOST) {
    x++;
  } else if (richtung == ANTSUED) {
    y++;
  } else if (richtung == ANTWEST) {
    x--;
  }

  if (x > width - 1) {
    x = 0;
  } else if (x < 0) {
    x = width - 1;
  }
  if (y > height - 1) {
    y = 0;
  } else if (y < 0) {
    y = height - 1;
  }
}

function draw() {
  strokeWeight(1);
  for (let n = 0; n < 100; n++) {
    let status = gitter[x][y];
    if (status == 0) {
      dreheRechts();
      gitter[x][y] = 1;
    } else if (status == 1) {
      dreheLinks();
      gitter[x][y] = 0;
    }

    stroke(255);
    if (gitter[x][y] == 1) {
      stroke(0);
    }
    point(x, y);
    bewegeVorwaerts();
  }
}

function mache2DArray(spalten, zeilen) {
  let arr = new Array(spalten);
  for (let i = 0; i < arr.length; i++) {
    arr[i] = new Array(zeilen);
    for (let j = 0; j < arr[i].length; j++) {
      arr[i][j] = 0;
    }
  }
  return arr;
}

Braitenberg Vehikel 1

Braitenberg Vehikel ohne Sensorik, d.h. mit konstanter Geschwindigkeit:

Referenzlinks

Resnick's Termite

640'000 Berechnungsschritte in 320 Bildern im Zeitraffer:

fs in ksw