Dokumentation

Idee:
Ein Algorithmus der auf einem „Spielfeld“ Bahnen zeichnet. Mit einem Start- und Endpunkt. Endlos das Spielfeld abfährt bis er nicht mehr weiter kann und dann neu anfängt.
Ausgehend von einem Anfangspunkt, gesetzt oder zufällig, wird als erstes ermittelt, welche Felder sich darum herum befinden und welche besetzt werden können. Anschliessend wird per Zufall ausgewählt auf welches „Nachbarfeld“ gezogen werden soll (Funktion Nachbar). Der Weg wird beendet sobald keine Nachbarn mehr verfügbar sind.

Die Idee an sich ist nicht sehr kompliziert, wenn es aber um die Umsetzung geht, stellen sich einige Fragen die ein Spektrum an Möglichkeiten eröffnen.

  • Wie findet die Orientierung auf dem Spielfeld statt?
  • Wie kann der Weg als Bahn dargestellt werden?
  • Wie werden die Felder Visuell verbunden?
  • Wie wird das Bild erstellt, ausgegeben?
  • Wie können die Wege farblich unterscheiden werden?

Um alle Felder auf dem Spielfeld zu besetzen habe ich das Script leicht erweitert. Nun wird mittels einer Schleife solange ein Feld ausgewählt bis keine Bahn mehr gezogen werden kann. Das Minimum sind dabei ein Start-und ein Endpunkt.

http://ibulla.com/pixelrun/pixelrun_chaos
(Ladezeit)

Funktionen

Der Algorithmus setzt folgende Funktionen ein.

Hier wird die Farbe der „Würme“, der Wege, definiert. Die Funktion erwartet eine Zahl. Aufgrund der Zahl wird hier entschieden wie der Weg eingefärbt wird. So wie die Funktion jetzt eingestellt ist wird der 1. Weg aus zufälligen Farben zusammengesetzt, die Wege 1-16 in Graustufen, ect…

function farbe_wurm($block) {
switch($block){
case 0:
mt_srand((double)microtime()*1000000);
    $rgbr = mt_rand(16,255);
    $r    = dechex($rgbr);
    $rgbg = mt_rand(16,255);
    $g    = dechex($rgbg);
    $rgbb = mt_rand(16,255);
    $b    = dechex($rgbb);
    $farbe = $r.$g.$b;
break;
case ($block >=1 && $block <= 16):
    $zufall = mt_rand(8,12);
    $rr = dechex(255-$block*$zufall);
    $gg = dechex(255-$block*$zufall);
    $bb = dechex(255-$block*$zufall);
    $farbe = $rr.$gg.$bb;
break;
case ($block >=17 && $block <= 32):
    $rr = dechex(220-$block);
    $gg = dechex(255);
    $bb = dechex(mt_rand(16,220));//64+$block);
    $farbe = $rr.$gg.$bb;
break;
case ($block > 32 && $block <= 64):
    $zufall = mt_rand(10,20);
    $rr = dechex(225-($block-$zufall));
    $gg = dechex(225-($block-$zufall));
    $bb = dechex(225-($block-$zufall));
    $farbe = $rr.$gg.$bb;
break;
default:
    $farbe = dechex(hexdec("ffffff")-(4048*$block));
break;
}
return $farbe;
}
function zufallsfarbe(){
     $rgbr      = mt_rand(16,255);
     $r         = dechex($rgbr);
     $rgbg      = mt_rand(16,255);
     $g         = dechex($rgbg);
     $rgbb      = mt_rand(16,255);
     $b         = dechex($rgbb);
     return $r.$g.$b;
}

Diese Funktion ermittelt auf dem Spielfeld die Nachbarn eines Punktes. Das Spielfeld selber ist dabei Quadratisch und der Punkt oben Links ist 0.

Die Funktion erwartet drei Variablen, die Anzahl Felder in der Breite, die Anzahl der Zeilen und das Feld von welchem die benachbarten Felder ermittelt werden sollen.

nachbar.php
<?
/*-------------*/
function nachbar($breite,$zeilen,$zahl){
$nachbar = [
"O" => "",
"R" => "",
"U" => "",
"L" => "",
];
$seite_o = 0;
$seite_r = 0;
$seite_u = 0;
$seite_l = 0;
$seite   = 0;
 
if((($zahl) >= 0) && (($zahl) < $breite)){
$seite_o = 1;
$seite = 1;
}
if(($zahl >= (($breite * $zeilen)-$breite)) && ($zahl < ($breite * $zeilen))){
$seite_u = 1;
$seite = 5;
}
if(($zahl % $breite) == 0){
$seite_l = 1;
$seite = 7;
}
if((($zahl - ($breite-1)) % $breite) == 0){
$seite_r = 1;
$seite = 3;
}
if(($seite_o == 1) && ($seite_r == 1)){
$seite = 2;
}
if(($seite_o == 1) && ($seite_l == 1)){
$seite = 8;
}
if(($seite_u == 1) && ($seite_r == 1)){
$seite = 4;
}
if(($seite_u == 1) && ($seite_l == 1)){
$seite = 6;
}
switch($seite){
case 0:
$nachbar = [
"O" => $zahl - $breite,
"R" => $zahl + 1,
"U" => $zahl + $breite,
"L" => $zahl - 1,
];
break;
case 1:
$nachbar = [
"O" => "-1",
"R" => $zahl + 1,
"U" => $zahl + $breite,
"L" => $zahl - 1,
];
break;
case 2:
$nachbar = [
"O" => "-1",
"R" => "-1",
"U" => $zahl + $breite,
"L" => $zahl - 1,
];
break;
case 3:
$nachbar = [
"O" => $zahl - $breite,
"R" => "-1",
"U" => $zahl + $breite,
"L" => $zahl - 1,
];
break;
case 4:
$nachbar = [
"O" => $zahl - $breite,
"R" => "-1",
"U" => "-1",
"L" => $zahl - 1,
];
break;
case 5:
$nachbar = [
"O" => $zahl - $breite,
"R" => $zahl + 1,
"U" => "-1",
"L" => $zahl - 1,
];
break;
case 6:
$nachbar = [
"O" => $zahl - $breite,
"R" => $zahl + 1,
"U" => "-1",
"L" => "-1",
];
break;
case 7:
$nachbar = [
"O" => $zahl - $breite,
"R" => $zahl + 1,
"U" => $zahl + $breite,
"L" => "-1",
];
break;
case 8:
$nachbar = [
"O" => "-1",
"R" => $zahl + 1,
"U" => $zahl + $breite,
"L" => "-1",
];
break;
	}
return $nachbar;
}
/*-------------*/
?>
  • art/pixelrun.txt
  • Zuletzt geändert: 2018/04/24 16:33
  • von spitz