Программирование игры Змейка

Зміст

Вступ…………………………………………………………....3.



1.ТЕОРЕТИЧНА ЧАСТИНА………………………………….5.



  1.1.Постановка задачі………………………………………....5.



2.ПРАКТИЧНА ЧАСТИНА…………………………………...6.



  2.1.Архітектура програми…………………………………….6.



  2.2.Опис програми………………………………………….....8.



  2.3.Контрольний приклад………………………………………



 та аналіз результатів машинного експерименту……………13.



ВИСНОВКИ……………………………………………………18.



СПИСОК ВИКОРИСТАНОЇ ЛІТЕРАТУРИ…………………18.



ДОДАТКИ……………………………………………………...19.























































Вступ

                   Центральним поняттям програмування є, безперечно , поняття 

алгоритму. З нього починається робота над програмою і від якості алгоритму залежить її успішне створення .Тому вміння програмувати в значній мірі означає розробляти хороші алгоритми і застосовувати вже відомі.

 

       

                  На сьогодні існує велика кількість різноманітних мов програмування, кожна з яких має свої певні переваги та недоліки. В цьому розмаїтті не завжди легко зробити свій вибір на користь якоїсь певної мови програмування .





              Для реалізації поставленої задачі вибрано середовище Turbo Pascal . Алгоритмічна мова Pascal була створена Н. Віртом на початку 70-х років. Завдяки зусиллям  розробників ця мова програмування стала потужним інструментом професійних програмістів, не втративши простоти і ясності, властивих цій мові від народження .







            Розробник системи Turbo Pascal – фірма Borland International виникла в 1984 році і за порівняно короткий час неодноразово дивувала користувачів персональних ЕОМ своїми Turbo системами. Було випущено кілька версій Turbo Pascal:3.0,4.0,5.0,5.5,6.0,7.0, Pascal for Windows, Borland Pascal.







Головні особливості середовища Turbo Pascal:



► широкий спектр типів даних, можливість обробки рядкових та структурних типів даних;



► достатній набір операторів управління розгалуженнями та циклами;



► добре розвинутий апарат підпрограм та зручні конструкції роботи з файлами;



► великі можливості управління усіма ресурсами ПЕОМ;

► різноманітні варіанти стикування з мовою Асемблера;



► підтримка ідей об’єктно—орієнтованого програмування (ООП).





           Саме з огляду на ці особливості програмна реалізація курсового проекту було здійснено в середовищі Turbo Pascal.





           Курсовий проект складається зі вступу , двох розділів , висновків , списку використаної літератури , графічної частини та додатків. Текст пояснювальної записки набрано та розрдуковано з використанням текстового редактора Word. Графічна частина виконана з допомогою графічного редактора Visio.



























































































1.Теоретична частина.



1.1.Постановка задачі.





Розробка програми-ігри «Змійка» для курсового проекту. Ідея програми полягає в тому, щоб «змія» могла б переміщатися по екрану за допомогою стрілок ←, ↑, →, ↓ та при набирані очок збільшувалась у довжину, при зіткненні зі своїм «хвостом» завершувалася гра. При завершені гри повинна виводитись підказка – «Завершити гру Y/N?» при натисканні клавіші «Y» гра просить ввести ваше ім’я та записує результати гри під введеним ім’ям в  текстовий файл Result.dat. При натисканні клавіші «N» гра розпочинається з початку.

Гра повинна мати меню, в якому вибирається рівень складності гри, або подивитися результати попередніх ігор.



            Мета написання курсового проекту — розробка програми-гри «Змійка».





























































2.Практична частина.



2.1.Архітектура програми



           Для реалізації поставленої задачі розроблено програму ZMEJKA.PAS (лістинг програми представлено в додатку 3).



          Програма складається з головного блоку та процедур: Menu, Ramka, Symbol, Rezultat, OverRes, GoUp, GoDown, DrawSnake, AddBonus, Kill, Move та модуля CRT.TPU, який забезпечує роботу з клавіатурою та екраном. Модуль CRT.TPU входить в стандартний набір модулів компілятора Borland Pascal 7.0.



   Запуск програми  здійснити двома способами:



      ▄  з головного меню інтегрованого середовища Borland Pascal шляхом вибору опції Run (попередньо програма повинна бути завантажена в ОП –F10, File-Open-ZMEJKA.PAS);

      ▄   з середовища ОС Windows XP Services Pack 2 шляхом запуску ZMEJKA.EXE .



Програма використовує одинадцять  процедур: Menu, Ramka, Symbol, Rezultat, OverRes, GoUp, GoDown, DrawSnake, AddBonus, Kill, Move. 



 Процедура Menu - виводить на дисплей  меню, котре пропонує користувачеві вибір складності програми-гри та перегляду результатів попередніх ігор. Вибрати пункт меню можна стрілочками клавіатури -↓,↑:



VERY SLOW

SLOW

MEDIUM

HIGH

VERY HIGH

RESULT

 

      При натисканні стрілочки ↑ або ↓ виконується процедура – GoUp або GoDown. Ці процедури дозволяють переходити по пунктам меню вверх або вниз.

Процедура Ramka – виводить написи меню та малює навколо них рамку.

Процедура Symbol – малює символ на заданій позиції.

Процедура Rezultat – після закінчення гри ця процедура записує результат гри у файл Result.dat, якщо цього файлу не існує він створюється в тій же папці з програмою-грою.

Процедура  OverRes – виводить результат з файлу Result.dat на екран, якщо цього файлу не існує, то виводиться надпис «Результатів немає».

Процедура DrawSnake – малює змійку на екрані.

Процедура AddBonus – малює на екрані символи «@» - це символи(бонуси), які «змійка» повинна збирати та поповнює очки.

Процедура Kill – знищує «змійку». Змійка знищується в разу зіткнення зі своїм «хвостом» або при натисканні клавіші Esc.

Процедура Move – задає координати «змійки».



Головний блок програми задає значення змінним, задає початкові координати «змійки» та визначає, яка клавіша керування клавіатурою була натиснута, щоб задати напрямок «змійки».

 Блок –схема головного блоку програми представлена в додатку 1.



















































































2.2.Опис програми



Програма складена , відкомпільована і відлагоджена в середовищі Bolard Pascal 7.0.



   На початку програми, відповідно до вимог технології програмування, знаходиться вступний коментар до програми , а решта операторів програми мають таке призначення:



Оператор                                         Призначення  оператора

001                 Заголовок програми

002                 Підключення зовнішніх модулів Crt( керування дисплеєм та                               

                       клавіатурою) 

003                 задає глобальну мітку

004-008          Описує  тип запис

009-010          Описує тип файл запису

011-020          Описання глобальних змінних

021-046          Процедура Ramka

021                 Заголовок процедури

022                 Початок тіла процедури

023-024,042,

044		   Задає коліри тексту та фону екрану

025,027,029,

031,033,035,

037,039,041,

045		   Задає координати курсора клавіатури

026,028,030,

032,034,036,

038,040,043   Вивід рамки на екран

046		   Кінець процедури Ramka	

047                 Заголовок процедури Symbol

048		   Початок тіла процедури	

049		   Встановлення координатів курсора клавіатури

050		   Виведення символа

051		   Встановлення курсора клавіатури на початок першої стрічки

052		   Закінчення процедури Symbol

053		   Загловок процедури Rezultat

054		   Описання змінних в процедурі

055		   Початок тіла процедури

056		   Директива компілятора, вона вимикає автоматичний контроль помилок I/O

057		   Відкриття файлу на запис

058		   Директива компілятора, вмикає автоматичний контроль помилок I/O

059		   Перевірка чи існує файл, якщо ні, то створюємо його

060		   Очистка екрану

061		   Встановлення координатів курсора клавіатури

062		   Задає зелений колір тексту

063		   Виведення тектсу

064		   Запис введенного тексту в змінну типу запис

065-066	   Присвоєння значень змінним типу запис

067		   Встановлення курсора клавіатури в текстовому файлі на кінець

068		   Запис одного файлу в інший

069		   Закриття файлу

070		   Задає колір тексту

071		   Вихід з програми

072		   Закінчення процедури Rezultat		   

073		   Заголовок процедури OverRes

074-075 	   Описання змінних в процедурі

076		   Початок тіла процедури

077		   Очистка екрану

078		   Директива компілятора, вона вимикає автоматичний контроль помилок I/O

079		   Відкриття файлу на запис

080		   Директива компілятора, вмикає автоматичний контроль помилок I/O

081		   Перевірка чи існує файл

082		   Задає координати курсора клавіатури

083		   Задає зелений колір тексту

084		   Виведення тексту

085		   Зарезервоване слово «інакше», якщо файл існує

086		   Початок оператора

087		   Задає зелений колір тексту

088		   Присвоєння значення змінній

089		   Цикл з передумовою, виконується поки не достигне кінця файлу

090		   Читання одного файлу в інший

091-093	   Задає координати курсора клавіатури та виводить значення змінних

094		   Присвоєння зачення змінній

095		   Кінець циклу з передумовою

096		   Закриття файлу

097		   Закінчення умовного оператора «інакше»

098		   Цикл з постумовою, повторюється поки не буде натиснута люба клавіша

099		   Задає колір тексту

100		   Закінчення процедури OverRes		   

101		   Заголовок процедури GoUp

102		   Початок тіла процедури

103		   Звернення до процедури Ramka з заданими параметрами

104		   Зменшуємо значення змінної MenuSelect на одиницю

105		   Умова, якщо MenuSelect<1 , то MenuSelect = 6

106-107	   Задає коліри тексту та фону екрану

108		   Задає координати курсору клавіатури

109		   Виводить текст, який міститься в масиві стрічок MenuItem[MenuSelect]

110-111	   Задає коліри тексту та фону екрану

112		   Задає координати курсору клавіатури (1,1)

113		   Закінчення процедури GoUp

114		   Заголовок процедури GoDown

115		   Початок тіла процедури

116		   Звернення до процедури Ramka з заданими параметрами

117		   Збільшуємо на одиницю значення змінної MenuSelect

118		   Умова, якщо MenuSelect>6 , то MenuSelect = 1

119-120	   Задає коліри тексту та фону екрану

121		   Задає координати курсору клавіатури

122		   Виводить текст, який міститься в масиві стрічок MenuItem[MenuSelect]

123-124	   Задає коліри тексту та фону екрану

125		   Задає координати курсору клавіатури (1,1)

126		   Закінчення процедури GoDown

127		   Заголовок процедури Menu

128		   Опис мітки

129-130	   Опис змінних процедури

131		   Початок тіла процедури

132		   Мітка

133		   Присвоєння значення змінній. Задає довжину змійки

134		   Присвоєння значення змінній. Початковий напрямок змійки

135-136	   Присвоєння значення змінній. Координати голови змійки

137		   Присвоєння значення змінній. Очки

138		   Присвоєння значення змінній. Координати курсору клавіатури

139		   Очищаємо екран

140		   Звернення до процедури Ramka з заданими параметрами

141-142	   Задає коліри тексту та фону екрану

143		   Задає координати курсору клавіатури

144		   Виводить текст, який міститься в масиві стрічок MenuItem[MenuSelect]

145-146	   Задає коліри тексту та фону екрану

147		   Задає координати курсору клавіатури

148-                цикл с постумовою. Вмістить в себе умову вибору, яка викконує процедуру                         -                      GoUp, якщо була натиснута клавіша клавіатури - ↑, або процедуру GoDown, -                      якщо була натиснута клавіша клавіатури -↓. Цикл завершується, тоді коли - 154                 будуть натиснути 	клавіші Enter або Esc.   		   	   		   

155		   Перевіряє, якщо була натиснута клавіша Esc, відбувається вихід з програми

156-		   Умова вибору. Перевіряє знащення змінної MenuSelect, та задає за цим 

163                 значенням складність гри. 

164 		   Очищує екран

165		   Закінчення процедури Menu

166		   Заголовок процедури DrawSnake

167		   Початок тіла процедури

168,180	   Задає колір тексту

169,171,173,

175,177	   Задає координати курсору клавіатури

170,172,174,

176,178	   Виводить текст

179		   Виводить символ змійки в початку стрічки

181-183	   Цикл малює змійку

184		   Задає колір тексту

185-186	   Малює символи бонусу «@»

187		   Задає колір тексту

188		   Задає координати курсору клавіатури

189		   Закінчення процедури DrawSnake

190		   Заголовок процедури AddBonus

191		   Опис мітки

192-193	   Описує змінні процедури

194		   Початок тіла процедури

195		   Мітка

    196		   Задає змінній нульове значення

    197-198	   Задає координати бонусу

199-204	   Цикли, перевіряють, щоб бонуси були розміщенні не на самій змійці

205		   Задає колір тексту

206		   Задає координати курсору клавіатури

207		   Закінчення процедури AddBonus

208		   Заголовок процедури Kill

209-210	   Опис змінних процедури

211		   Опис мітки

212	 	   Початок тіла процедури

213-218	   Присвоєння масиву символів значення	

219		   Задає колір тексту

220-223	   Цикл, малює мертву змійку

224		   Мітка

225		   Очищує екран

226,237	   Задає колір тексту

227,229,231,

233,235,238,

240,242,244,

246,248	   Задає координати курсору клавіатури

228,	230,232,

234,236,239,

241,243,245,

247		  Виводить на екран текст	      

249		  Чекає на натиснуту клавішу клавіатури

250		  Умова вибору, якщо натиснута клавіша ‘Y’, то продовжуємо гру, якщо була -                     натиснута клавіша ‘N’, то програма запросить ввести ім’я і запишить -      --- 254                результати у файл Result.dat

255		  Задає колір тексту

256		  Задає координати курсору клавіатури

257		  Закінчення процедури Kill

258		  Заголовок процедури Move

259 		  Початок тіла процедури

260		  Малює символ пробілу

261-270	  Умова вибору. Визначає  направлення змійки за натиснутою клавішею

271-   	  Умови. Якщо змійка виповзає за межі екрану, переводится на початок 

274                стрічки. 

275- 	   Цикл перевірки, чи «вкусила» змійка себе за хвіст,якщо так, виконується 278                 процедра Kill

279-   	   Цикл перевірки, чи «з’їла» змійка бонус, якщо так, то змійка збільшується в 287	         	   довжині на одиницю, та збільшуються очки	  		  

288-294	   Цикл. Щоб змійка не «розірвала» свій хвіст.

295		   Виконується процедура DrawSnake

296		   Задає колір тексту

297		   Задає координати курсору клавіатури

298		   Закінчення процедури Move

299		   Початок тіла основної програми

300		   Зв’язує файлову змінну з файлом на диску

301		   Задає режим відображення тексту на екрані

302		   Ініціює фунцію случайних чисел

303		   Очищує екран

304		   Цикл. Виводить бонуси на екран перед початком гри

305-310	   Задає масиву стрічок значення.

311		   Задає початкове значення змінній MenuSelect

312		   Очищує екран

313	 	   Виконується процедура Menu

314-318	   Цикл, задає початкові координати змійки,щоб вона не «розбіглася»

319		   Мітка

320-		   Цикл з передумовою, перевіряє, яка клавіша була натиснута,та задає  

328		   напрямок змійки

329,333	   Задається колір тексту

330,334	   Задаються координати курсору клавіатури

331		   Затримка DTime-секунд

332		   Виконується процедура Move

335		   Закінчення циклу 320

336		   Виконується процедура Kill

337		   Перехід на мітку

338		   Закриття файлу

339		   Закінчення основної програм



	   

Лістінг програми представлений в додатку 2, блок—схему головного блоку програми наведено в додатку 1.



                             





















2.3Контрольний приклад

та аналіз результатів машинного експерименту.



                 Для створення довільних виробів використовують відповідні технології. При цьому у поняття технології включаються сукупність виробничих процесів , методів та засобів , які призначені для створення певних видів виробів із зазначеними показниками якості. Одним з найбільш складних і трудомістких етапів технологічного процесу розробки програм є їх відладка. На відладку припадає  близько 50% трудомісткості загальних витрат на створення складних комплексів програм. Під відладкою слід розуміти процес , який забезпечує  можливість отримання програми, яка буде  функціонувати з потрібними характеристиками у заданій області вхідних даних.

    

  Процес відладки включає:

 

створення сукупності тестових еталонних значень , яким програма повинна відповідати;

тестування програми з виконанням об’єктного коду і з різними рівнями деталізації: детерміноване , стохастичне та тестування в реальному масштабі часу;


розробка модифікації програми з метою включення причин відхилення результатів від еталонних.



                   Основним методом виявлення помилок при відладці програм є їх тестування. При цьому затрати на тестування для виявлення помилок складають 30%-40% загальних затрат на розробку програм і у значній мірі визначають якість створеного програмного продукту. Ефективність тестування є важливим фактором, який визначає вартість та тривалість  розробки складних комплексів програм.



                    Основною метою тестування для виявлення помилок є виявлення всіх відхилень результатів функціонування програми від еталонних значень. При цьому ставиться задача виявлення  максимального числа помилок , які приводять до виникнення помилок. Після цього застосовується тестування для діагностики та локалізації виявлених помилок. На цій стадії найважливішим є точне встановлення місця спотворення програми або даних , яке є причиною відхилення результатів  від еталонних даних  при тестуванні з метою виявлення помилок. На цьому етапі визначається частина програми , яку слід коректувати (модифікувати). Еефективним є тести , які дозволяють швидко і точно локалізувати помилки.



                  Після локалізації і усунення виявлених помилок застосовується контрольне тестування. Контрольний приклад для перевірки правильності розробленої програми виконано вручну. Для перевірки роботи програми в нормальних умовах перевіряємо гру на іграбельність.







МЕНЮ гри Змійка





Процес гри





Після «смерті» змійки







Введення ім’я для запису результату у файл RESULT.DAT







Перегляд раніше записаних результатів



                

Розроблена програма-гра дає можливість добре відпочити після тривалого робочого дня.















Висновки.



                Розв’язування задач обчислювального характеру з використанням персональних комп’ютерів має велике практичне значення, оскільки дає можливість значно економити час при виконанні простих , але громістких обчислень. Використання з цією метою готових пакетів прикладних програм для виконання математичних обчислень має певні вади. Ліцензовані пакети прикладних програм мають високу вартість і достатньо високу складність експлуатації. Тому їх використання для розв’язування нескладних задач (а саме такою є сортування масиву) є недоцільним. Надзвичайно важливо вміти самостійно складати прості програми для розв’язування задач обчислювального характеру.



              В даному курсовому проекті розроблено і описано програму-гру «Змійка». Для розробки програми вибрано мову Паскаль (середовище Borland Pascal) . Програма розроблена із застосуванням методики процедурного проектування.



             Програма відкомпільована з отриманням ехе-файла та відладжена.



        Вибір алгоритмічної мови Паскаль для реалізації постановленої задачі повністю виправдав себе.





























	Список використаної літератури:

	

Т.В. Ковалюк, видавнича група «BHV», 2005- «ОСНОВИ ПРОГРАММУВАННЯ».

















ДОДАТКИ































                  



















                                        





































Встановлення основного та фонового колірів

Вивід інформаційного вікна

Початок

Поки істина

Вивід меню

Вибір опції меню

Vybir=3

Вивід нформаційного вікн

Процедура masiv

Кінець















		





1

                                                                                               


Додаток 2.

Лістинг програми.





  001}Program ZMEjKA;

  002}uses CRT;

  003}label 1;

  004}type result=record

  005}      scor:integer;

  006}     name:string[15];

  007}      len:integer;

  008}     end;

  009}  res=file of result;

  010}

  Var

  011} f:                                res;

  012}SnakeX,SnakeY:  array[1..4000] of longint;

  013}HeadX,HeadY:                      longint;

  014}BonusX,BonusY:  array[1..40]   of longint;

  015}DeathX,DeathY:  array[1..30]   of longint;

  016}Dlina,Naprav:                     longint;

  017}key:                              char;

  018}i,score:                          integer;

  019}MenuItem:       array[1..6]    of string;

  020}DTime,ScorePlus,ScoreMinus,MenuSelect,x,y:       integer;

{-----------------------------------------------------}

  021}Procedure Ramka(x,y:integer);

  022}Begin

  023}TextColor(2);

  024} TextBackground(0);

  025}gotoxy(x,y);

  026} writeln('╔═ ЗМЕЙКА 0.1 ══════╗');

  027} gotoxy(x,y+1);

  028} writeln('║     VERY SLOW     ║');

  029} gotoxy(x,y+2);

} writeln('║       SLOW        ║');

} gotoxy(x,y+3);

} writeln('║      MEDIUM       ║');

} gotoxy(x,y+4);

} writeln('║       HIGH        ║');

} gotoxy(x,y+5);

} writeln('║     VERY HIGH     ║');

} gotoxy(x,y+6);

 }writeln('║      RESULT       ║');

 }gotoxy(x,y+7);

 }writeln('╚═══════════════════╝');

 }gotoxy(x,y+8);

 }textcolor(14);

 }writeln('  Виберiть рiвень    ');

 }textcolor(0);

 }gotoxy(1,1);

 }End;

{------------------------------------------------------}

} Procedure Symbol(x,y:integer; sym:char);

} Begin

} gotoxy(x,y);

} write(sym);

} gotoxy(1,1);

} End;

{------------------------------------------------------}

} Procedure Rezultat(var d:res;scr,dl:integer);

	} var f1:result;



	} Begin

} {$I-}

} Reset(d);

} {$I+}

} IF IOResult<>0 THen rewrite(d);

} clrscr;

} gotoxy(28,22);

} textcolor(green);

} write('Введить ваше iм`я: ');

} readln(f1.name);

} f1.scor:=scr;

} f1.len:=dl;

} seek(d,filesize(d));

} write(d,f1);

} Close(d);

} Textcolor(0);

} Halt;

} End;

{--------------------------------------------------------}

} Procedure OverRes(var d:res);

} var f1:result;

} y:integer;

} Begin

} ClrScr;

} {$I-}

} Reset(d);

} {$I+}

} IF IOResult<>0 THEN begin

} gotoxy(28,22);

}  textcolor(green);

}  write('Результатiв немає!');end

} Else

} begin

} textcolor(green);

} y:=1;

} while not eof(d) do begin

} read(d,f1);

} gotoxy(1,y); write('Iм`я: ',f1.name);

} gotoxy(30,y); write('Довжина: ',f1.len);

} gotoxy(45,y); write('Oчки: ',f1.scor:5);

} y:=y+1;

} end;

} Close(d);

} end;

} repeat until keypressed;

} textcolor(0);

      100}End;

 {-------------------------------------------------------------------}



} Procedure GoUp(x,y:integer);

} Begin

} Ramka(x,y);

} MenuSelect:=Menuselect-1;

} IF MenuSelect < 1 THEN MenuSelect:=6;

} TextColor(14);

} TextBackground(0);

} GotoXY(x+1,y+MenuSelect);

} write(MenuItem[MenuSelect]);

} Textbackground(0);

} textcolor(0);

} gotoxy(1,1);

} End;

{------------------------------------------------------}

}Procedure GoDown(x,y:integer);

}Begin

}ramka(x,y);

}MenuSelect:=MenuSelect+1;

}IF MenuSelect > 6 THEN MenuSelect:=1;

}textcolor(14);

}textbackground(0);

}gotoxy(x+1,y+MenuSelect);

}write(MenuItem[MenuSelect]);

}textcolor(0);

}textbackground(0);

}gotoxy(x,y);

}End;

{------------------------------------------------------}

 }Procedure Menu;

 }label b;

 }Var

 }X,Y,I:integer;

 }Begin

 }b:

			 }dlina:=5;

			 }Naprav:=1;

			 }HeadX:=5;

	 }HeadY:=1;

	 }Score:=0;

	 }X:=28;Y:=20;

	 }clrscr;

			}Ramka(x,y);

			}textcolor(14);

			}textbackground(0);

			}gotoxy(x+1,y+Menuselect);

			}write(MenuItem[MenuSelect]);

			}textcolor(0);

			}textbackground(0);

			}gotoxy(1,1);

			}repeat

			}I:=ord(readkey);

			}case I of

			}72:GoUp(x,y);

			}80:GoDown(x,y);

			}end;

			}Until (I=27)or(I=13);

			}IF i=27 THEN halt;

			}Case MenuSelect of

			}1: Begin

	DTime:=10000;

	ScorePlus:=5;

	End;

			}2: Begin

	DTime:=8000;

	ScorePlus:=10;

	End;

			}3: Begin

	 DTime:=6000;

	 ScorePlus:=15;

	 End;

			}4: Begin

	  DTime:=4000;

		  ScorePlus:=20;

		  End;

			}5: Begin

		  DTime:=2000;

		  ScorePlus:=25;

		  End;

			}6: Begin

		  OverRes(f);

		  ClrScr;

		  goto b;

		  End;

			}End;

			}CLRSCR;

			}End;

	{---------------------------------------------------------}

				}Procedure DrawSnake;

				}Begin

				}textcolor(15);

				}gotoxy(1,50);

				}write('            ');

				}gotoxy(1,50);

				}write('Oчки:  ',Score);

				}gotoxy(20,50);

				}write('Програму разрoбив Матковський Руслан aka Pat');

				}gotoxy(65,50);

				}write('              ');

				}gotoxy(65,50);

				}write('Довжина: ',Dlina);

				}Symbol(SnakeX[1],SnakeY[1],chr(15));

				}textcolor(2);

				}for i:=2 to Dlina do  begin

				}Symbol(SnakeX[i],SnakeY[i],chr(15));

				}end;

				}textcolor(red);

				}for i:=1 to 40 do

				}Symbol(BonusX[i],BonusY[i],chr(64));

				}textcolor(0);

				}gotoxy(1,1);

				}End;

			{----------------------------------------------------------}

			}Procedure AddBonus(b:longint);

			}label 1;

			}var

			}Err,f:integer;

			}Begin

			}1:

			}Err:=0;

			}BonusX[b]:=Random(78)+1;

			}BonusY[b]:=Random(48)+1;

			}For f:=1 to 40 do

			}if f<>b THEN

			}if ((BonusX[f]=BonusX[b]) and (BonusX[f]<>0) and (BonusY[f]=BonusY[b]) and (BonusY[f]<>0)) THEN Err:=1;

			}For f:=1 to Dlina do

			}if (SnakeX[f]=BonusX[b]) and (SnakeY[f]=BonusY[b]) THEN Err:=1;

			}IF Err=1 THEN goto 1;

			}textcolor(0);

			}gotoxy(1,1);

			}End;

			{-----------------------------------------------------------}

			}Procedure Kill;

			}Var c:array[1..6] of char;

			}j:integer;

			}label 1;

			}Begin

			}c[1]:='X';

			}c[2]:='x';

			}c[3]:=':';

			}c[4]:='.';

			}c[5]:='.';

			}c[6]:=' ';

			}Textcolor(2);

			}for i:=1 to 6 do begin

			}for j:=1 to Dlina do Symbol(SnakeX[j],SnakeY[j],c[i]);

			}delay(5000);

			}end;

			}1:

			}CLRSCR;

			}textcolor(15);

			}gotoxy(1,50);

			}write('            ');

			}gotoxy(1,50);

			}write('Oчки:  ',Score);

			}gotoxy(20,50);

			}write('Програму разрoбив Матковський Руслан aka Pat');

			}gotoxy(65,50);

			}write('              ');

			}gotoxy(65,50);

			}write('Довжина: ',Dlina);

			}textcolor(2);

			}gotoxy(28,22);

			}write('╔═══════════════════╗');

			}gotoxy(28,23);

			}write('║                   ║');

			}gotoxy(28,24);

			}write('║ Продовжити(Y/N)?  ║');

			}gotoxy(28,25);

			}write('║                   ║');

			}gotoxy(28,26);

			}write('╚═══════════════════╝');

			}gotoxy(1,1);

			}key:=readkey;

			}case key of

			}'Y','y','Н','н': begin

	menu;

	for i:=1 to Dlina do

	begin

	SnakeX[i]:=6-i;

	SnakeY[i]:=1;

	end;

	end;

			}'N','n','Т','т':Rezultat(f,Score,Dlina);

			}else goto 1;

			}end;

			}textcolor(0);

			}gotoxy(1,1);

			}End;

		{----------------------------------------------------------}

	}procedure Move;

	}begin

	}Symbol(SnakeX[Dlina],SnakeY[Dlina],' ');

	}case naprav of

	}1: begin

	          HeadX:=HeadX+1;

	}End;

	}2: begin

	         HeadX:=HeadX-1;

	}end;

	}  3: begin

	        HeadY:=HeadY-1;

	}end;

	}4: begin

	        HeadY:=HeadY+1;

	}end;

	}end;

	}if HeadX>80 then HeadX:=1;

	}if HeadX<1 then HeadX:=80;

	}if HeadY>49 then HeadY:=1;

	}if HeadY<1 then HeadY:=49;

		}for I:=1 to Dlina do

	}begin

	}If (HeadX=SnakeX[i])and(HeadY=SnakeY[i]) then kill;

	}end;

	}for i:=1 to 40 do

	}begin

	}if (HeadX=BonusX[i])and(HeadY=BonusY[i]) then

	}begin

	}Dlina:=Dlina+1;

	}score:=score+ScorePlus;

	}addbonus(i);

	}end;

	}end;

	

	}for I:=Dlina downTo 2 do

	}begin

	}SnakeX[i]:=SnakeX[i-1];

	}SnakeY[i]:=SnakeY[i-1];

	}end;

	}SnakeX[1]:=HeadX;

	}SnakeY[1]:=HeadY;

	}drawsnake;

	}textcolor (0);

	}gotoxy( 1,1);

	

	}end;

	{-----------------------------------------------------------------}

	

		}BEGIN

		}Assign(f,'result.dat');

		}Textmode(c80 + Font8x8);

		}randomize;

		}CLRSCR;

		}for i:=1 to 40 do addbonus(i);

		}MenuItem[1]:='     VERY SLOW     ';

		}MenuItem[2]:='       SLOW        ';

		}MenuItem[3]:='      MEDIUM       ';

		}MenuItem[4]:='       HIGH        ';

		}MenuItem[5]:='     VERY HIGH     ';

		}MenuItem[6]:='      RESULT       ';

		}MenuSelect:=1;

		}clrscr;

		}menu;

		}for i:=1 to Dlina do

		}begin

		}SnakeX[i]:=6-i;

		}SnakeY[i]:=1;

		}end;

		}1:

		}while key<>#27 do

		}begin

		}if KeyPressed then

		}begin

		}key:=readkey;

		}if key=#0 then

		}case readkey of

	                   #72: if Naprav <> 4 then Naprav := 3;{Down}

	                   #80: if Naprav <> 3 then Naprav := 4;{up}

	                   #75: if Naprav <> 1 then Naprav := 2;{Left}

	                  #77: if Naprav <> 2 then Naprav := 1;{Rigth}

		}end;

		}end;

		}textcolor (0);

		}gotoxy(1,1);

		}DELAY(DTime);

		}Move;

		}textcolor (0);

		}gotoxy( 1,1);

		}end;

		}kill;

		}goto 1;

		}close(f);

		}end.