function(){ return isProb(TREE_PROB) ? TREE : BARE; } ]); } function displayForest($forest, $generationNum) { system("clear"); echo PHP_EOL . "Generation: $generationNum" . PHP_EOL; mapForest(['forest' => $forest, 'func' => function($f, $x, $y){ echo $f[$y][$x] . ($x == WIDTH - 1 ? PHP_EOL : ''); } ]); echo PHP_EOL; usleep(PAUSE); } function getNextForest($oldForest) { return mapForest(['forest' => $oldForest, 'func' => function($f, $x, $y){ switch ($f[$y][$x]) { case BURN: return BARE; case BARE: return isProb(GROW_PROB) ? TREE : BARE; case TREE: $caughtFire = isProb(FIRE_PROB); $ablaze = $caughtFire ? true : getNumBurningNeighbors($f, $x, $y) > 0; return $ablaze ? BURN : TREE; } } ]); } function getNumBurningNeighbors($forest, $x, $y) { $burningNeighbors = mapForest([ 'forest' => $forest, 'x1' => $x - 1, 'x2' => $x + 2, 'y1' => $y - 1, 'y2' => $y + 2, 'default' => 0, 'func' => function($f, $x, $y){ return $f[$y][$x] == BURN ? 1 : 0; } ]); $numOnFire = 0; foreach ($burningNeighbors as $row) { $numOnFire += array_sum($row); } return $numOnFire; } function mapForest($params) { $p = array_merge([ 'forest' => [], 'func' => function(){echo "default\n";}, 'x1' => 0, 'x2' => WIDTH, 'y1' => 0, 'y2' => HEIGHT, 'default' => BARE ], $params); $newForest = []; for ($y = $p['y1']; $y < $p['y2']; $y++) { $newRow = []; for ($x = $p['x1']; $x < $p['x2']; $x++) { $inBounds = ($x >= 0 && $x < WIDTH && $y >= 0 && $y < HEIGHT); $newRow[] = ($inBounds ? $p['func']($p['forest'], $x, $y) : $p['default']); } $newForest[] = $newRow; } return $newForest; } function isProb($prob) { return rand(0, 100) < $prob; }