Моделирование Виртуальной Вычислительной Системы.
 
Выпуск №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
Хостинг от uCoz