Красноярський державний технічний університет p>
Кафедра ВТ p>
Утенков Валентин p>
Володимирович p>
Спеціальність 2201 p>
Шифр .448597 p>
Курсова робота за перший курс з предмету «Алгоритмічні мови та програмування» p>
Тема: моделювання гри "Життя" p>
1999 p>
Зміст p>
1. Вступ 3
2. Опис програми 5
3. Висновок 11
4. Додаток 12 p>
1. Введення p>
У наше століття, коли космічні кораблі борознять простори Великого
Театру, застосування комп'ютерів в різних галузях народного господарствастає необхідним і, як наслідок, неминучим. Комп'ютернітехнології та методи обробки даних стають застосовуються в будь-яких сферахлюдської діяльності від розрахунків графіків залізничних перевезень доскладання гороскопів. Звичайно, не у всіх питаннях комп'ютери можутьвидати рішення конкретної проблеми, але вони можуть, як мінімум, істотнополегшити накопичення, систематизацію та рутинну обробку даних. p>
Методи вирішення завдань за допомогою комп'ютерів можна розділити на дваосновні групи. p>
По-перше, це аналітичний метод, при якому вся поведінкадосліджуваної системи описується як ряд чітких залежностей, з яких зурахуванням вихідних даних обчислюється оптимальне співвідношення умов дляданого завдання. p>
По-друге, це метод моделювання, при якому задається початковестан та основні закони взаємодій в досліджуваній системі; післяцього система запускається «в життя» і спостерігач відстежує її поведінкав динаміці, візуально витягаючи з цього процесу, що цікавлять його аспекти. p>
У даній роботі зроблена спроба на простому прикладі, який (звідомими допущеннями) застосуємо в біології, продемонструвати застосуванняцього методу для дослідження поведінки колоній мікроорганізмів. p>
Модель поведінки системи гранично спрощена. Життєве простірпредставлено як поле, що складається з квадратних комірок розміром 50 (30 осередків;у кожної клітинки, очевидно, є 8 сусідніх. Кожна комірка може бути порожньоюабо містити клітку. Існування клітини визначається кількістюсусідів. Якщо в сусідніх комірках 2 або 3 клітини, то клітина живе, а якщосусідів більше трьох або менше двох то клітина гине (від
«Перенаселення» чи то «самотності»). Якщо ж навколо порожньої коміркизнаходяться рівно 3 клітини, то в ній з'являється нова клітина. p>
Таким чином, задані умови трьох основних процесів у живихістот: народження, існування і відмирання. p>
Представлена програма забезпечує перевірку цих умов івиконання відповідних дій. Програма, також, виконуєсхематичний висновок поля і деякої супутньої інформації на екран. p>
2. Опис програми p>
2.1. Програма реалізована на Borland Pascal 7.0. P>
2.2. Дані у програмі зберігаються в таких глобальних зміннихстандартних типів: p>
2.2.1 A і B - основний і допоміжний масиви елементів типу
Boolean розміром [0 .. 51,0 .. 31]. В основному масиві A зберігається інформація прозміст клітин в осередках поля. Допоміжний масив B введений длязанесення поточних змін вмісту осередків без зміни основногомасиву. Після заповнення масиву B його вміст копіюється в масив A. p>
2.2.2. i і j - змінні типу integer. У первинному варіантіпрограми використовувалися як лічильники в циклах типу for. Згодом всіці цикли були переміщені з тіла програми в процедури, і ці зміннібули використані як параметри процедури InitGraph для установкиграфічного режиму. p>
2.2.3. VP - змінна типу integer. Містить номер активноївідеосторінок. Використовується процедурою FlipVP (див. далі). P>
2.2.4. step, live, dead і born - змінні типу integer. Містять,відповідно, номер кроку роботи програми, поточну кількість живихклітин на поле і кількість загиблих і що з'явилися за останній крок клітин. p>
2.2.5. s і stri - змінні типу string. Змінна s застосовуєтьсяяк проміжна при переведенні чисел у строкове подання; з їїдопомогою формується мінлива stri, яка і виводиться на екранпроцедурою OutTextXY. p>
2.3. Програма використовує стандартні модулі crt.tpu і graph.tpu атак само модуль mono3d.tpu, написаний для інших цілей, з якоговикористовується тільки процедура FlipVP. p>
2.4. Основні блоки програми реалізовані в двох функціях і п'ятипроцедурах, що виконують наступні дії: p>
2.4.1. Функція Nears. Повертає значення типу integer. Застосовуєтьсядля підрахунку клітин в сусідніх клітинках. Аргументами функції x і y єномер стовпця і рядка, що містять клітинку, для якої визначаєтьсякількість сусідів. При виконанні функції внутрішні лічильники i і jпробігають значення від x-1 до x 1 і від y-1 до y +1 відповідно. При цьомуперевіряється вміст кожної клітинки A [i, j] і, якщо вона не порожня, значенняпідсумовує змінної s збільшується на 1 (перед виконанням функціїмінлива s обнуляється). Таким чином в змінну s заноситьсякількість клітин у квадраті 3х3 клітинки з досліджуваної осередком в центрі.
Після цього, якщо досліджувана клітинка не порожня, мінлива s зменшується на
1 (оскільки нас цікавить тільки вміст навколишніх осередків). Даліфункція повертає значення змінної s. p>
2.4.2. Функція Change виконує основні дії програми іповертає значення типу boolean. Під час її виконання внутрішнілічильники i та j пробігають діапазони значень, що охоплюють всюоброблювану площа поля. Для кожної комірки A [i, j] виконується перевірканаявності в ній клітини. Якщо в комірці є клітина, то за допомогою функції Nearsвизначається кількість її сусідів, якщо воно підходить під умовивідмирання, то осередок допоміжного масиву B [i, j] випорожнюється, амінлива dead збільшується на 1. Якщо комірка порожня, а функція Nearsповертає значення, що підходить під умову виникнення, то осередокдопоміжного масиву B [i, j] заповнюється, а мінлива bornзбільшується на 1. В інших випадках зміни даних не відбувається. P>
На початку виконання змінні і born dead обнуляються, а функції
Change присвоюється значення False. Якщо бодай одна змінаданих, функції присвоюється значення True. Оскільки ця функція єумовою виконання основного циклу програми, очевидно, що за відсутностідій відбуватиметься вихід з циклу. p>
2.4.3. Процедура Setup випадковим чином заповнює поле клітинами.
Щільність заповнення визначається аргументом стандартної функції Random. P>
2.4.4. Процедура Copy копіює вміст допоміжного масиву Bв основний масив A. p>
2.4.5. Процедура Count робить підрахунок клітин, що знаходяться вданий момент на поле. На початку її виконання мінлива live обнуляється.
Після цього перевіряється вміст кожної оброблюваної осередку основногомасиву A [i, j] і, якщо вона не порожня, мінлива live збільшується на 1. p>
2.4.6. Процедура Draw виводить зміст основного масиву A у виглядіграфічної побудови. Кожен осередок масиву A представлена на екраніпрямокутником 10х8 pix. У залежності від вмісту осередку він можемати яскраво-зелений колір і суцільну заливку (клітка) або темно-синій колір іштрихову заливку типу 9 (порожня осередок). Поверх заповненихпрямокутників (оператор Bar) на тому ж самому місці малюються контурніпрямокутники (оператор Rectangle) яскраво-синього кольору з яких виходитьсітка. p>
2.4.7. Процедура Print здійснює вивід на екран супутньоїінформації (змінні step, live, і born dead c коментарями). Змінніперетворюються у послідовну форму за допомогою процедури Val та проміжноїзмінної s, після чого за допомогою стандартних арифметичних дій,застосовних до одиниць даних типу string, формується мінлива stri,яка і виводиться на екран оператором OutTextXY. p>
2.4.8. Опис процедури FlipVP (модуль mono3d.tpu) виглядає так: p>
Procedure FlipVP (var P: Integer); p>
Begin p>
() p> < p> () SetVisualPage (P); p>
() P: = 1-P; p>
() SetActivePage (p); p>
() ClearDevice; p>
() p>
End; p>
Вона призначена для того, щоб приховати від користувача процеспромальовування екрану. Принцип дії її очевидна: активна відеосторінокзавжди залишається невидимою. p>
2.5. Робота програми. P>
2.5.1. Початок програми. P>
2.5.1.1. Процедура Setup заповнює основний масив A (п. 2.4.3.) P>
2. Змінним i і j присвоюються значення 9 і 1, що відповідає відеорежиму EGA640х350 pix, 16 кольорів. P>
3. Оператор InitGraph встановлює цей режим відео. P>
2.5.2. Основний цикл програми. P>
2.5.2.1. Оператор While відкриває цикл. P>
2.5.2.2. Функція Change використовується як умова виконання циклу,при цьому виконувані нею дії обробляють основний і допоміжниймасиви (п. 2.4.2.) p>
2.5.2.3. Лічильник кроків step збільшується на 1. P>
2.5.2.4. Процедура FlipVP перемикає активну і видимувідеосторінок (п. 2.4.8 .). p>
2.5.2.5. Процедура Draw виводить на активну відеосторінок відображенняполя (масиву A п.2.4.6 .). p>
2.5.2.6. Процедура Count підраховує поточну кількість клітин наполе (п. 2.4.5 .). p>
2.5.2.7. Процедура Print виводить на активну відеосторінок поточнуінформацію про стан системи (п.п. 2.4.7. та 2.2.4 .). p>
2.5.2.8. Оператор Delay забезпечує затримку виконання циклу длязручності візуального спостереження. p>
2.5.2.9. За допомогою стандартних функцій KeyPressed і ReadKey каскадумовних переходів забезпечує вихід з циклу після натискання клавіші (дляцього в програмі оголошена мітка l). p>
2.5.3. Закінчення програми. P>
2.5.3.1. Після виходу з циклу після натискання клавіші (п. 2.5.2.9) або поумовою виходу (п. 2.5.2.2.) функція ReadKey призупиняє програму донатискання клавіші без зміни вмісту екрану. p>
2.5.3.2. Оператор CloseGraph відключає графічний режим. P>
2.5.3.3. Оператор ClrScr очищає екран, приводячи його у вихіднестан. p>
5. Основні недоліки програми. P>
1. Для нормальної роботи функції Change (а точніше Nears) в полі є крайні клітинки A [0,0 .. 31], A [51,0 .. 31], A [0 .. 51,0] і p> < p> A [0 .. 51,31], які не дивлячись ні на які умови завжди залишаються порожніми, що знижує чистоту моделювання. p>
2. Деякі параметри, такі як частота оновлення, початкова щільність заповнення поля та ін змінюються тільки втручанням безпосередньо в текст програми. P>
3. Не передбачено вихід з циклу при виникненні стабільних циклічних процесів, які сприймаються функцією Change як зміни, хоча практично перестають бути такими. P>
2. Висновок. P>
3.1. У даній роботі наведено найпростіший приклад застосування методумоделювання системи. Ускладнення та модернізація алгоритму дозволить збільшою точністю відображати реальні процеси в моделі. p>
2. У нинішній формі програма дозволила виявити наступні нюанси:
3.2.1. Кінцева картина видається майже однаковою при щільностізаповнення поля від 1/2 до 1/6. При щільності нижче 1/6 система звичайнодосить швидко приходить до повного «вимирання».
3.2.2. Виявлено кілька видів стабільних фігур. Наприклад: p>
Циклічні фігури. Наприклад: p>
Рухомі фігури. Наприклад: p>
3.3. У ході виконання роботи були закріплені навички програмування намовою Pascal: використання стандартних функцій модуля crt.tpu, застосуванняелементів графіки з модуля graph.tpu, написання і підключення власнихмодулів (mono3d.tpu), робота з компілятором і пр. p>
3. Додаток
Текст програми «Життя» (файл life.pas) p>
uses crt, graph, mono3d; p>
var
A, B: array [0 .. 51,0 .. 31] of boolean; i, j, VP, step, live, dead, born: integer; s, stri: string; p>
label l; p>
Function Nears (x, y : integer): integer; p>
() p>
() var p>
() i, j, s: integer; p>
( ) p>
Begin p>
() p>
() s: = 0; p>
() for i: = x-1 to x 1 do p>
() for j: = y-1 to y 1 do p>
() if a [i, j] then s: = s +1; p>
() if a [x, y] then s: = s-1; p>
() Nears: = s; p>
() p> < p> End; p>
Function Change: Boolean; p>
Begin p>
() p>
() born: = 0; p >
() dead: = 0; p>
() Change: = False; p>
() p>
() for i: = 1 to 50 do p>
() for j: = 1 to 30 do p>
() begin p>
() () p>
() () if A [i, j] then p>
() () begin p>
() () () if ((Nears (i, j) 3)) then p>
() () () begin p>
() () () () B [i, j]: = False; p>
() () () () dead: = dead 1; p>
() () () () Change: = True; p>
() () () end; p>
( ) () end p>
() () else p>
() () begin p>
() () () if Nears (i, j) = 3 then p>
() () () begin p>
() () () () B [i, j]: = True; p>
() ( ) () () born: = born 1; p>
() () () () Change: = True; p>
() () () end; p >
() () end; p>
() () p>
() end; p>
() p>
End;
Procedure Setup; p>
() p>
() var p>
() i, j: integer; p>
() p>
Begin p>
() p>
() Randomize; p>
() for i: = 1 to 50 do p>
() for j: = 1 to 30 do p>
() if Random (2) = 0 then A [i, j]: = True; p>
() p>
End; p>
Procedure Draw; p>
() p>
() var p>
() i, j: integer; p >
() p>
Begin p>
() p>
() Rectangle (0,0,639,349); p>
() for i : = 0 to 51 do p>
() for j: = 0 to 31 do p>
() begin p>
() () p>
() () if A [i, j] then SetFillStyle (1,10) p>
() () else SetFillStyle (9,1); p>
() () Bar (55 +10 * i, 10 +8 * j, 65 +10 * i, 18 +8 * j); p>
() () Rectangle (55 +10 * i, 10 +8 * j , 65 +10 * i, 18 +8 * j); p>
() end; p>
() p>
End; p>
Procedure Copy; p>
() p>
() var p>
() i, j: integer; p>
() p>
Begin p>
() p>
() for i: = 1 to 50 do p>
() for j: = 1 to 30 do p >
() A [i, j]: = B [i, j]; p>
() p>
End; p>
Procedure Print;
Begin p>
() p>
() Str (step: 3, s); p>
() stri: = 'Крок #' + s; p>
() Str (live: 3, s); p>
() stri: = stri + 'Клітин' + s; p>
() outtextxy (55,300, stri); p>
() Str (born: 3, s); p>
() stri: = 'З'явилося' + s; p>
( ) Str (dead: 3, s); p>
() stri: = stri + 'Загинуло' + s; p>
() outtextxy (55,315, stri); p> < p> () p>
() p>
End; p>
Procedure Count; p>
() p>
() var p>
() i, j: integer; p>
() p>
Begin p>
() p>
( ) live: = 0; p>
() for i: = 1 to 50 do p>
() for j: = 1 to 30 do p>
() if A [i, j] then live: = live 1; p>
() p>
End; p>
BEGIN p>
Setup;
i: = 9;j: = 1;
InitGraph (i, j, 'c: dos'); p>
SetColor (9); p>
While Change dobegin
() Step: step = 1;
() FlipVP (VP);
() Draw;
() Count;
() Print;
() Copy;
() Delay (22);
() If KeyPressed then
() If ReadKey''then
() Goto l;end; p>
l: p>
ReadKey; p>
CloseGraph;
ClrScr; p>
END. P>
p>