
Mrówka Langtona
O automatach komórkowych możesz przeczytać w rozdziale 24 książki Matematyka dla programistów Java oraz w rozdziale 21 książki Matematyka dla programistów JavaScript.
Strona używa skryptu ant.js
Uzbrój się w cierpliwość. Niestety przeglądarki nie respektują
czasów ustawianych w programach. Czasami czas faktyczny jest
20-krotnie dłuższy niż ustawiony.
Listing
var ant = new Ant();
timer = setInterval("ant.run()", 10);
Skrypt ant.js
var cv = document.getElementById('canvas');
var ctx = cv.getContext('2d');
var width = cv.width;
var height = cv.height;
var w = 800;
var h = 800;
var liczbaPol = 100;
var ap = liczbaPol / 2;
var szer = 8;
var s = szer / 2;
var len = szer * liczbaPol;
var CW = "white";
var CB = "black";
var CR = "red";
var antx = ap;
var anty = ap;
var antDir = 1;
var timer;
var Ant = function() {
this.autos1 = [];
this.autos2 = [];
for (var i = 0; i < liczbaPol; i++) {
this.autos1[i] = [];
this.autos2[i] = [];
}
this.clear();
};
Ant.prototype.clear = function() {
for (var j = 0; j < liczbaPol; j++) {
for (var k = 0; k < liczbaPol; k++) {
this.autos1[j][k] = 0;
this.autos2[j][k] = 0;
}
}
};
Ant.prototype.putStructure = function(x, y, array) {
this.clear();
for (var i = 0; i < array.length; i++) {
for (var j = 0; j < array[0].length; j++) {
this.autos1[i + y][j + x] = array[i][j];
}
}
};
Ant.prototype.run = function() {
this.autos2 = clone(this.autos1);
antDir = changeDir(antDir, this.autos2[antx][anty]);
if (this.autos2[antx][anty] == 0) {
this.autos2[antx][anty]++;
} else if (this.autos2[antx][anty] == 1) {
this.autos2[antx][anty]--;
}
if (antDir == 1) {
anty--;
if (anty == -1) {
anty = liczbaPol - 1;
}
} else if (antDir == 2) {
antx--;
if (antx == -1) {
antx = liczbaPol - 1;
}
} else if (antDir == 3) {
anty++;
if (anty == liczbaPol) {
anty = 0;
}
} else if (antDir == 4) {
antx++;
if (antx == liczbaPol) {
antx = 0;
}
}
this.autos1 = clone(this.autos2);
this.drawAnt();
};
Ant.prototype.drawAnt = function() {
ctx.save();
ctx.beginPath();
ctx.fillStyle = CW;
ctx.rect(0, 0, w, h);
ctx.fill();
ctx.strokeStyle = "lightgrey";
var z = 0;// polozenie linii
for (var i = 0; i <= liczbaPol + 1; i++) {
ctx.moveTo(0, z);
ctx.lineTo(len, z);
ctx.moveTo(z, 0);
ctx.lineTo(z, len);
z += szer;
}
ctx.lineWidth = 0.5;
ctx.stroke();
ctx.beginPath();
ctx.fillStyle = CB;
for (var i = 0; i < liczbaPol; i++) {
for (var j = 0; j < liczbaPol; j++) {
var x = i * szer;
var y = j * szer;
if (this.autos1[i][j] == 1) {
ctx.beginPath();
ctx.rect(x, y, szer, szer);
ctx.fill();
}
ctx.fillStyle = CR;
ctx.beginPath();
ctx.arc(antx * szer + s, anty * szer + s, s, 0, 2 * Math.PI, false);
ctx.fill();
ctx.fillStyle = CB;
}
}
ctx.restore();
}
function changeDir(dir, col) {
var newDir = 0;
switch (dir) {
case 1:
if (col == 0) {
newDir = 2;
} else if (col == 1) {
newDir = 4;
}
break;
case 2:
if (col == 0) {
newDir = 3;
} else if (col == 1) {
newDir = 1;
}
break;
case 3:
if (col == 0) {
newDir = 4;
} else if (col == 1) {
newDir = 2;
}
break;
case 4:
if (col == 0) {
newDir = 1;
} else if (col == 1) {
newDir = 3;
}
break;
}
return newDir;
};
function clone(array) {
var r = array.length;
var c = array[0].length;
var array1 = [];
for (var k = 0; k < r; k++) {
array1[k] = [];
}
for (var i = 0; i < r; i++) {
for (var j = 0; j < c; j++) {
array1[i][j] = array[i][j];
}
}
return array1;
};
