Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Моделирование Виртуальной Вычислительной Системы.


Информационный Канал Subscribe.Ru


Моделирование Виртуальной Вычислительной Системы.
 
Выпуск №10
home URL
автор рассылки: noonv (noonv@narod.ru)

"В общем, мы, и взрослые и дети, все без исключения - паровозы."
Рюноскэ Акутагава "Глядя на паровоз"

Приветствую вас, уважаемые читатели!

В этом выпуске я приведу исходник игры Жизнь на 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-а скрипт смотрится сносно, но в винде - плохо :)

"Каждый из нас - паровоз. Наша работа - не более чем дым и искры, которые мы выбрасываем в небо."
Рюноскэ Акутагава "Глядя на паровоз"

Счастливо!

[noonv@volodia noonv]$ logout

XIII

Рейтинг@Mail.ru

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное