RSS    

   Реферат: Моделирование схемы Жизнь

          {}

          End;

Она предназначена для того, чтобы скрыть от пользователя процесс прорисовки экрана. Принцип действия ее очевиден: активная видеостраница всегда остается невидимой.

 

2.5. Работа программы.

2.5.1. Начало программы.

2.5.1.1. Процедура Setup заполняет основной массив A (п. 2.4.3.)

2.5.1.2.  Переменным i и j присваиваются значения 9 и 1, что соответствует  видеорежиму EGA640х350 pix, 16 цветов.

2.5.1.3.  Оператор InitGraph устанавливает этот видеорежим.

2.5.2.    Основной цикл программы.

2.5.2.1. Оператор While открывает цикл.

2.5.2.2. Функция Change используется как условие выполнения цикла, при этом выполняемые ею действия обрабатывают основной и вспомогательный массивы (п. 2.4.2.)

2.5.2.3. Счетчик шагов step увеличивается на 1.

2.5.2.4. Процедура FlipVP переключает активную и видимую видеостраницы (п. 2.4.8.).

2.5.2.5. Процедура Draw выводит на активную видеостраницу отображение поля (массива A п.2.4.6.).

2.5.2.6. Процедура Count подсчитывает текущее количество клеток на поле (п. 2.4.5.).

2.5.2.7. Процедура Print выводит на активную видеостраницу текущую информацию о состоянии системы (п.п. 2.4.7. и  2.2.4.).

2.5.2.8. Оператор Delay обеспечивает задержку выполнения цикла для удобства визуального наблюдения.

2.5.2.9. С помощью стандартных функций KeyPressed и  ReadKey каскад условных переходов обеспечивает выход из цикла по нажатию клавиши (для этого в программе объявлена метка l).

2.5.3. Окончание программы.

2.5.3.1. После выхода из цикла по нажатию клавиши (п. 2.5.2.9) или по условию выхода (п. 2.5.2.2.) функция ReadKey приостанавливает программу до нажатия клавиши без изменения содержимого экрана.

2.5.3.2. Оператор CloseGraph отключает графический режим.

2.5.3.3. Оператор ClrScr очищает экран, приводя его в исходное состояние.


2.6.         Основные недостатки программы.

2.6.1.      Для нормальной работы функции Change (а точнее Nears) в поле имеются крайние ячейки A[0,0..31], A[51,0..31], A[0..51,0] и A[0..51,31], которые несмотря ни на какие условия всегда остаются пустыми, что снижает чистоту моделирования.

2.6.2.      Некоторые параметры, такие как частота обновления, начальная плотность заполнения поля и др. изменяются только вмешательством непосредственно в текст программы.

2.6.3.      Не предусмотрен выход из цикла при возникновении стабильных циклических процессов, которые воспринимаются функцией Change как изменения, хотя практически перестают являться таковыми.


3.              Заключение.

3.1. В данной работе приведен простейший пример применения метода моделирования системы. Усложнение и модернизация алгоритма позволит с большей точностью отображать реальные процессы в модели.

3.2.     В нынешней  форме программа позволила выявить следующие нюансы:

3.2.1. Конечная картина представляется почти одинаковой при плотности заполнения поля от 1/2 до 1/6. При плотности ниже 1/6 система обычно довольно быстро приходит к полному «вымиранию».

3.2.2. Обнаружено несколько видов стабильных фигур. Например:

 


Циклические фигуры. Например:


Движущиеся фигуры. Например:

 



3.3. В ходе выполнения работы были закреплены навыки программирования на языке Pascal: использование стандартных функций модуля crt.tpu, применение элементов графики из модуля graph.tpu, написание и подключение собственных модулей (mono3d.tpu), работа с компилятором и пр.

4.       Приложение

Текст программы «Жизнь» (файл life.pas)

uses

  crt,graph,mono3d;

var

  A,B:array[0..51,0..31]of boolean;

  i,j,VP,step,live,dead,born:integer;

  s,stri:string;

label l;

 Function Nears(x,y:integer):integer;

          {}

          {} var

          {}  i,j,s:integer;

          {}

          Begin

          {}

          {} s:=0;

          {} for i:=x-1 to x+1 do

          {} for j:=y-1 to y+1 do

          {} if a[i,j] then s:=s+1;

          {} if a[x,y] then s:=s-1;

          {} Nears:=s;

          {}

          End;

 Function Change:Boolean;

          Begin

          {}

          {} born:=0;

          {} dead:=0;

          {} Change:=False;

          {}

          {} for i:=1 to 50 do

          {} for j:=1 to 30 do

          {} begin

          {} {}

          {} {} if A[i,j] then

          {} {} begin

          {} {} {} if ((Nears(i,j)<2) or (Nears(i,j)>3)) then

          {} {} {} begin

          {} {} {} {} B[i,j]:=False;

          {} {} {} {} dead:=dead+1;

          {} {} {} {} Change:=True;

          {} {} {} end;

          {} {} end

          {} {}           else

          {} {} begin

          {} {} {} if Nears(i,j)=3 then

          {} {} {} begin

          {} {} {} {} B[i,j]:=True;

          {} {} {} {} born:=born+1;

          {} {} {} {} Change:=True;

          {} {} {} end;

          {} {} end;

          {} {}

          {} end;

          {}

          End;

Procedure Setup;

          {}

          {} var

          {}  i,j:integer;

          {}

          Begin

          {}

          {} Randomize;

          {} for i:=1 to 50 do

          {} for j:=1 to 30 do

          {} if Random(2)=0 then A[i,j]:=True;

          {}

          End;

Procedure Draw;

          {}

          {} var

          {}  i,j:integer;

          {}

          Begin

          {}

          {} Rectangle(0,0,639,349);

          {} for i:=0 to 51 do

          {} for j:=0 to 31 do

          {} begin

          {} {}

          {} {} if A[i,j] then SetFillStyle(1,10)

          {} {}           else SetFillStyle(9,1);

          {} {} Bar(55+10*i,10+8*j,65+10*i,18+8*j);

          {} {} Rectangle(55+10*i,10+8*j,65+10*i,18+8*j);

          {} end;

          {}

          End;

Procedure Copy;

          {}

          {} var

          {}  i,j:integer;

          {}

          Begin

          {}

          {} for i:=1 to 50 do

          {} for j:=1 to 30 do

          {} A[i,j]:=B[i,j];

          {}

          End;

Procedure Print;

          Begin

          {}

          {} Str(step:3,s);

          {} stri:='Шаг # '+s;

          {} Str(live:3,s);

          {} stri:=stri+'            Клеток '+s;

          {} outtextxy(55,300,stri);

          {} Str(born:3,s);

          {} stri:='Появилось '+s;

          {} Str(dead:3,s);

          {} stri:=stri+'       Погибло '+s;

          {} outtextxy(55,315,stri);

          {}

          {}

          End;

Procedure Count;

          {}

          {} var

          {}  i,j:integer;

          {}

          Begin

          {}

          {} live:=0;

          {} for i:=1 to 50 do

          {} for j:=1 to 30 do

          {} if A[i,j] then live :=live+1;

          {}

          End;


BEGIN

Setup;

i:=9;

j:=1;

InitGraph(i,j,'c:\dos');

SetColor(9);

While Change do

begin

{} step:=step+1;

{} FlipVP(VP);

{} Draw;

{} Count;

{} Print;

{} Copy;

{} Delay(22);

{} if KeyPressed then

{} if ReadKey<>''then

{} goto l;

end;

l:

ReadKey;

CloseGraph;

ClrScr;

END.


Страницы: 1, 2


Новости


Быстрый поиск

Группа вКонтакте: новости

Пока нет

Новости в Twitter и Facebook

                   

Новости

Обратная связь

Поиск
Обратная связь
Реклама и размещение статей на сайте
© 2010.