| 1 | <?php\r |
| 2 | //Game of life 0.3 (2D Cellular automata example implementation)\r |
| 3 | //Coded: Harvie 2oo7\r |
| 4 | /*\r |
| 5 | * The Rules (THX2John Conway):\r |
| 6 | * For a space that is 'populated':\r |
| 7 | * Each cell with one or no neighbors dies, as if by loneliness. \r |
| 8 | * Each cell with four or more neighbors dies, as if by overpopulation. \r |
| 9 | * Each cell with two or three neighbors survives. \r |
| 10 | * For a space that is 'empty' or 'unpopulated':\r |
| 11 | * Each cell with three neighbors becomes populated. \r |
| 12 | *\r |
| 13 | * http://www.bitstorm.org/gameoflife/ -Online\offline java based version\r |
| 14 | * http://www.bitstorm.org/gameoflife/lexicon/ -Nice lexicon of lifes, that you can test on this simulator\r |
| 15 | *\r |
| 16 | * $life contains array of strings, where every character is one cell\r |
| 17 | * there is also function to load life from file (for more lifes see lexicon)\r |
| 18 | * i included two lifes life.txt - simple small life and glider.txt - the most classical of all, it become symbol of hackership\r |
| 19 | *\r |
| 20 | * for better experience please resize console window to size of life, that you are running.\r |
| 21 | *\r |
| 22 | * PHP+AsciiART == Rox!!!\r |
| 23 | */\r |
| 24 | \r |
| 25 | ///FUNCTIONS////////////////////////////////////////////////////\r |
| 26 | \r |
| 27 | //\r |
| 28 | function life_load($file) {\r |
| 29 | $life = file($file);\r |
| 30 | foreach ($life as $lnum => $line) {\r |
| 31 | $life[$lnum] = trim($line);\r |
| 32 | }\r |
| 33 | return $life;\r |
| 34 | }\r |
| 35 | \r |
| 36 | //\r |
| 37 | function life_randomize($lines, $chars) {\r |
| 38 | $pop = $GLOBALS["populated"];\r |
| 39 | $unp = $GLOBALS["unpopulated"];\r |
| 40 | $life = "";\r |
| 41 | $i = 0;\r |
| 42 | while($lines > $i) {\r |
| 43 | $line = "";\r |
| 44 | $ichars = $chars;\r |
| 45 | while($ichars > 0) {\r |
| 46 | $line = $line.rand(0,1);\r |
| 47 | $ichars--;\r |
| 48 | }\r |
| 49 | $line = str_replace("0", $unp, $line);\r |
| 50 | $line = str_replace("1", $pop, $line);\r |
| 51 | $life[$i] = $line;\r |
| 52 | $i++;\r |
| 53 | }\r |
| 54 | return $life;\r |
| 55 | }\r |
| 56 | \r |
| 57 | //\r |
| 58 | function life_print($life) {\r |
| 59 | foreach($life as $line) {\r |
| 60 | $line = str_replace($GLOBALS["populated"], $GLOBALS["prpop"], $line);\r |
| 61 | $line = str_replace($GLOBALS["unpopulated"], $GLOBALS["prunp"], $line);\r |
| 62 | echo($line."|\r\n");\r |
| 63 | }\r |
| 64 | }\r |
| 65 | \r |
| 66 | //\r |
| 67 | function life_neighs($life, $line, $char) {\r |
| 68 | @$neighs = "";\r |
| 69 | @$neighs = $neighs.$life[$line][$char+1];\r |
| 70 | @$neighs = $neighs.$life[$line][$char-1];\r |
| 71 | @$neighs = $neighs.$life[$line+1][$char+1];\r |
| 72 | @$neighs = $neighs.$life[$line+1][$char-1];\r |
| 73 | @$neighs = $neighs.$life[$line+1][$char];\r |
| 74 | @$neighs = $neighs.$life[$line-1][$char+1];\r |
| 75 | @$neighs = $neighs.$life[$line-1][$char-1];\r |
| 76 | @$neighs = $neighs.$life[$line-1][$char];\r |
| 77 | return $neighs;\r |
| 78 | }\r |
| 79 | \r |
| 80 | //\r |
| 81 | function life_neighs_num($life, $line, $char) {\r |
| 82 | $neighs = life_neighs($life, $line, $char);\r |
| 83 | $neighs = ereg_replace("(\.| |0|_|-)", "", $neighs); //Unpopulated chars: . 0_-\r |
| 84 | $neighs = strlen($neighs);\r |
| 85 | //echo($neighs); //Debug\r |
| 86 | return $neighs;\r |
| 87 | }\r |
| 88 | \r |
| 89 | //\r |
| 90 | function life_next($life) {\r |
| 91 | \r |
| 92 | $pop = $GLOBALS["populated"];\r |
| 93 | $unp = $GLOBALS["unpopulated"];\r |
| 94 | $old_life = $life;\r |
| 95 | \r |
| 96 | foreach($life as $lnum => $line) {\r |
| 97 | //echo($lnum); //Debug\r |
| 98 | for($i = 0;$i < strlen($line);$i++) {\r |
| 99 | $neigh_num = 0;\r |
| 100 | $neigh_num = life_neighs_num($old_life, $lnum, $i);\r |
| 101 | //echo($lnum."-".$i."=".$neigh_num."\n"); //Debug\r |
| 102 | if($old_life[$lnum][$i] == $pop) {\r |
| 103 | if($neigh_num == 2 || $neigh_num == 3) { $life[$lnum][$i] = $pop; } else { $life[$lnum][$i] = $unp; }\r |
| 104 | }\r |
| 105 | else\r |
| 106 | {\r |
| 107 | if($neigh_num == 3) { $life[$lnum][$i] = $pop; }\r |
| 108 | }\r |
| 109 | }\r |
| 110 | }\r |
| 111 | return $life;\r |
| 112 | \r |
| 113 | }\r |
| 114 | \r |
| 115 | //\r |
| 116 | function cls() {\r |
| 117 | //Clear screen\r |
| 118 | for($i = 0; $i < 20;$i++) echo("\r\n");\r |
| 119 | }\r |
| 120 | \r |
| 121 | ///CODE///////////////////////////////////////////////////////////////////////////////\r |
| 122 | \r |
| 123 | //Settings\r |
| 124 | $life = life_load("spacefiller.cells"); //Load life\r |
| 125 | //$life = life_randomize(30, 60); //Randomize life\r |
| 126 | $populated = "#"; //File format populated\r |
| 127 | $unpopulated = "."; //File format unpopulated\r |
| 128 |