"В общем, мы, и взрослые и дети,
все без исключения - паровозы."
Рюноскэ Акутагава "Глядя на паровоз"
Приветствую вас, уважаемые читатели!
В этом выпуске я приведу исходник игры Жизнь на Perl-е.
Конечно это просто модификация аналогичной программы на C++
На Perl-е оказалось затруднительно получить нажатие одной клавиши и для простоты
я ввёл счётчик. В данном скрипте счётчик настроен на исходный файл с паровозом,
пример которого приведён в седьмом выпуске.
#!/usr/bin/perl
############################################################
#
# for LIFE GAME
#
# XIII
############################################################
# d -will die
# a -will born
$L_SIZE=20;
$L_SIZEY=60;
$file_name ="life.txt";
#variabels
@l_mas; # life-massive
$l_i=0; # counters
$l_j=0;
$l_age=0; # age of population
$l_coef=0; # coefficient for check cell
########
# START:
print"+---------------+\n";
print"| Life |\n";
print"| |\n";
print"| XIII |\n";
print"+---------------+\n\n";
#print"press Enter for next step; for Exit press q\n";
# set elements of l_mas zero
for($l_i=1;$l_i<$L_SIZE+1;$l_i++)
{
for($l_j=1;$l_j<$L_SIZEY+1;$l_j++)
{
$l_mas[($L_SIZEY+2)*$l_i+$l_j]="0";
}
}
# set border
for($l_i=0;$l_i<$L_SIZEY+2;$l_i++)
{
$l_mas[$l_i]=$l_mas[($L_SIZEY+2)*($L_SIZE+1)+$l_i]='-';
}
for($l_j=0;$l_j<$L_SIZE+2;$l_j++)
{
$l_mas[($L_SIZEY+2)*$l_j]=$l_mas[($L_SIZEY+2)*$l_j+$L_SIZEY+1]='|';
}
$l_mas[0]=$l_mas[$L_SIZEY+1]='+';
$l_mas[($L_SIZEY+2)*($L_SIZE+1)]=$l_mas[($L_SIZEY+2)*($L_SIZE+2)-1]='+';
in_file();
$ss=0;
while($ss!=150)# you can read here one key (see perlfaq5 and perlfaq8 :-)
{
$ss++;
print "Age: $l_age\n";
$l_age++;
# print life-massive
for($l_i=0;$l_i<$L_SIZE+2;$l_i++)
{
for($l_j=0;$l_j<$L_SIZEY+2;$l_j++)
{
if($l_mas[($L_SIZEY+2)*$l_i+$l_j] eq "d")
{
$l_mas[($L_SIZEY+2)*$l_i+$l_j]="0"; # amen 8-)
}
if($l_mas[($L_SIZEY+2)*$l_i+$l_j] eq "a")
{
$l_mas[($L_SIZEY+2)*$l_i+$l_j]='*'; # new cell
}
if($l_mas[($L_SIZEY+2)*$l_i+$l_j] eq "0" )
{
print " ";
}
else
{
print $l_mas[($L_SIZEY+2)*$l_i+$l_j];
}
}
print"\n";
}
# calculate next configuration
for($l_i=1;$l_i<$L_SIZE+1;$l_i++)
{
for($l_j=1;$l_j<$L_SIZEY+1;$l_j++)
{
calculate($l_i,$l_j);
}
}
}#while
######
# SUBROUTINES:
# get data from file and set life-massive
sub in_file
{
print"Open file $file_name ...\n";
# open file for reading
open(fs,$file_name)||die "Cant open file $file_name !\n";
for($l_i=1;$l_i<$L_SIZE+1;$l_i++)
{
for($l_j=1;$l_j<$L_SIZEY+1;$l_j++)
{
$temp=getc(fs);
$l_mas[($L_SIZEY+2)*$l_i+$l_j]=$temp;
}
# for 'next string' symbol !!!
$temp=getc(fs);# need for win and for *nix
}
close(fs);
}
# calculate one cell
sub calculate
{
#x->$_[0]
#y->$_[1]
($x, $y) = @_;
if ($l_mas[($L_SIZEY+2)*$x+$y] eq "0" || $l_mas[($L_SIZEY+2)*$x+$y] eq "*")
{
$l_coef=0;
if($l_mas[($L_SIZEY+2)*$x+$y-1] eq "*"|| $l_mas[($L_SIZEY+2)*$x+$y-1] eq "d")# west
{$l_coef++;}
if($l_mas[($L_SIZEY+2)*($x-1)+$y-1] eq "*"||$l_mas[($L_SIZEY+2)*($x-1)+$y-1] eq "d")# north-west
{$l_coef++;}
if($l_mas[($L_SIZEY+2)*($x-1)+$y] eq "*"||$l_mas[($L_SIZEY+2)*($x-1)+$y] eq "d")# north
{$l_coef++;}
if($l_mas[($L_SIZEY+2)*($x-1)+$y+1] eq "*"||$l_mas[($L_SIZEY+2)*($x-1)+$y+1] eq "d")# north-east
{$l_coef++;}
if($l_mas[($L_SIZEY+2)*$x+$y+1] eq "*"||$l_mas[($L_SIZEY+2)*$x+$y+1] eq "d")# east
{$l_coef++;}
if($l_mas[($L_SIZEY+2)*($x+1)+$y+1] eq "*"||$l_mas[($L_SIZEY+2)*($x+1)+$y+1] eq "d")# south-east
{$l_coef++;}
if($l_mas[($L_SIZEY+2)*($x+1)+$y] eq "*"||$l_mas[($L_SIZEY+2)*($x+1)+$y] eq "d")# south
{$l_coef++;}
if($l_mas[($L_SIZEY+2)*($x+1)+$y-1] eq "*"||$l_mas[($L_SIZEY+2)*($x+1)+$y-1] eq "d")# south-west
{$l_coef++;}
if($l_coef==0 || $l_coef==1) # will die
{
if($l_mas[($L_SIZEY+2)*$x+$y] eq "*")
{$l_mas[($L_SIZEY+2)*$x+$y]="d";}
return;
}
elsif ($l_coef == 2) # stable
{
return;
}
elsif ($l_coef == 3) # will born
{
if($l_mas[($L_SIZEY+2)*$x+$y] eq "0")
{$l_mas[($L_SIZEY+2)*$x+$y]="a";}
return;
}
elsif ($l_coef==4 || $l_coef==5 ||$l_coef==6||$l_coef==7||$l_coef==8) # will die
{
if($l_mas[($L_SIZEY+2)*$x+$y] eq "*")
{$l_mas[($L_SIZEY+2)*$x+$y]="d";}
return;
}
else{return;}
}
else
{
return;
}
}
|
В консоли Linux-а скрипт смотрится сносно, но в винде - плохо :)
"Каждый из нас - паровоз. Наша работа -
не более чем дым и искры, которые мы выбрасываем в небо."
Рюноскэ Акутагава "Глядя на паровоз"
Счастливо!
|