Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/perl
- #phurba is ghey
- use warnings;
- use strict;
- use Term::ANSIColor;
- use GD;
- my @grid;
- my $X = 500;
- my $Y = 500;
- for my $a(0 .. $X) {
- for my $b(0 .. $Y) {
- $grid[$a][$b] = 0;
- }
- }
- sub display {
- system("clear");
- for my $a(0 .. $X) {
- for my $b(0 .. $Y) {
- my $neighbors = neighbors($a, $b);
- if($grid[$a][$b] == 1) {
- # print colored ['red on_green'], $neighbors;
- print colored ['red on_green'], ' ';
- } else {
- # print $neighbors > 0 ? $neighbors : ' ';
- print ' ';
- }
- }
- print "\n";
- }
- }
- sub neighbors {
- my($a, $b) = @_;
- my $neighbors = 0;
- $neighbors++ if($grid[($a -1) % $X][$b] == 1); # left
- $neighbors++ if($grid[($a +1) % $X][$b] == 1); # right
- $neighbors++ if($grid[$a][($b -1) % $Y] == 1); # above
- $neighbors++ if($grid[$a][($b +1) % $Y] == 1); # below
- $neighbors++ if($grid[($a -1) % $X][($b -1) % $Y] == 1); # diag above left
- $neighbors++ if($grid[($a -1) % $X][($b +1) % $Y] == 1); # diag above right
- $neighbors++ if($grid[($a +1) % $X][($b -1) % $Y] == 1); # diag below left
- $neighbors++ if($grid[($a +1) % $X][($b +1) % $Y] == 1); # diag below right
- return $neighbors;
- }
- sub generation {
- my @neighbors;
- for my $a(0 .. $X) {
- for my $b(0 .. $Y) {
- $neighbors[$a][$b] = neighbors($a, $b);
- }
- }
- for my $a(0 .. $X) {
- for my $b(0 .. $Y) {
- if($grid[$a][$b] == 1) {
- if($neighbors[$a][$b] < 2) {
- if($grid[$a][$b] == 1) {
- if($neighbors[$a][$b] < 2) {
- $grid[$a][$b] = 0; #print "KilledA $a,$b with $neighbors[$a][$b] ";
- } elsif($neighbors[$a][$b] == 2 || $neighbors[$a][$b] == 3) {
- $grid[$a][$b] = 1; #print "Lived $a,$b ";
- } elsif($neighbors[$a][$b] > 3) {
- $grid[$a][$b] = 0; #print "KilledB $a,$b ";
- }
- } else {
- if($neighbors[$a][$b] == 3 ) {
- $grid[$a][$b] = 1; #print "LIved $a,$b ";
- }
- }
- }
- #print "\n";
- }
- }
- sub mutate {
- for my $a(0 .. 59) {
- for my $b(0 .. 59) {
- # 1 in 100 chance of mutation
- if(int(rand(99)) == 5) {
- if($grid[$a][$b] == 1) {
- $grid[$a][$b] = 0;
- } else {
- $grid[$a][$b] = 1;
- }
- }
- }
- }
- }
- # glider gun
- $grid[1][25] = 1;
- $grid[2][23] = 1;
- $grid[2][25] = 1;
- $grid[3][13] = 1;
- $grid[3][14] = 1;
- $grid[3][21] = 1;
- $grid[3][22] = 1;
- $grid[3][35] = 1;
- $grid[3][36] = 1;
- $grid[4][12] = 1;
- $grid[4][16] = 1;
- $grid[4][21] = 1;
- $grid[4][22] = 1;
- $grid[4][35] = 1;
- $grid[4][36] = 1;
- $grid[5][1] = 1;
- $grid[5][2] = 1;
- $grid[5][11] = 1;
- $grid[5][17] = 1;
- $grid[5][21] = 1;
- $grid[5][22] = 1;
- $grid[6][1] = 1;
- $grid[6][2] = 1;
- $grid[6][11] = 1;
- $grid[6][15] = 1;
- $grid[6][17] = 1;
- $grid[6][18] = 1;
- $grid[6][23] = 1;
- $grid[6][25] = 1;
- $grid[7][11] = 1;
- $grid[7][17] = 1;
- $grid[7][25] = 1;
- $grid[8][12] = 1;
- $grid[8][16] = 1;
- $grid[9][13] = 1;
- $grid[9][14] = 1;
- for(0 .. 9999) {
- writeOut($_);
- #display();
- print "Generation $_\n";
- generation();
- #mutate() if(int(rand(9)) == 1);
- }
- sub writeOut {
- my $file = shift;
- my $image = GD::Image->new($Y, $X);
- my $black = $image->colorAllocate(0, 0, 0);
- my $white = $image->colorAllocate(255, 255, 255);
- for my $a(0 .. $X) {
- for my $b(0 .. $Y) {
- if($grid[$a][$b] == 1) {
- $image->setPixel($b, $a, $white);
- }
- }
- }
- my $fn = sprintf("%06u.jpg", $file);
- open(OUT, "> /tmp/life/$fn") or die $!;
- binmode(OUT);
- print OUT $image->gif();
- close(OUT);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement