МІНІСТЕРСТВО ОСВІТИ І НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ
НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ УКРАЇНИ
«КИЇВСЬКИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ»
Інститут прикладного системного аналізу
Кафедра математичних методів системного аналізу
КУРСОВИЙ ПРОЕКТ
З дисципліни «ПРОГРАМУВАННЯ ТА АЛГОРИТМІЧНІ МОВИ»
На тему «Вгадай слово»
Перевірив
Анотація
Розроблений продукт є ігровою програмою, побудованою на правилах загальновідомої гри «Вгадай слово». Ця гра дуже поширена в студентських колах, але зазвичай в неї грають за допомогою паперу,олівця та наявності, як мінімум двох гравців, так як один загадує слово, а іншій вгадує. Мій програмний продукт дає можливість поринути у світ даної гри та самому грати в неї. Тим паче, мій програмній продукт не потребує великих потужностей комп’ютера и може працювати майже на будь-якому комп’ютері. Даний програмній продукт був розроблений на мові Pascal в середовищі Free Pascal 2.4.2.
Зміст
Вступ …………………………………………………………………………. 4
Основна частина
Постановка задачі ………………………………………………………. 5
Метод розв’язку задачі …………………………………………………. 7
Опис алгоритму ……………………………………………………….. 10
Опис програми ………………………………………………………… 12
Опис інтерфейсу ………………………………………………………. 18
Висновки …………………………………………………………………… 23
Список використаної літератури …………………………………………. 25
Додаток A. Лістинг програми ……………………………………………….. 26
Вступ
Основною задачею курсової роботи є реалізація програми-симулятора гри «Вгадай слово» . «Витоки гри «Вгадай слово» неясні, але, схоже, виникли у вікторіанську епоху», говорить Тоні Аугарже, автор книги " Керівництво по світовим іграм"(Oxford University Press). Гра згадується у Еліс Берта Гомме "традиційного гри" в 1894 році під назвою"Птахи, звірі і риби". Правила прості, гравець записує перші і останні букви словадля тварин, і інший гравець здогади літер між ними. В інших джерелах гра називається «Шибениця» або «вішалка». Шибениця була представлені в 1978 на Speak & Spell під назвою "ТаємницяСлова".
Зараз існує чимало аналогів даної програми. Однак вони або реалізовані на інших мовах програмування з використанням складних алгоритмів, або ж розроблені на мові Pascal на доволі низькому рівні, тобто містять лише безпосередньо спрощений алгоритм гри без будь-яких необхідних ігрових функцій. Такі програми не дозволяють користувачу повноцінно відчути усю красу та захоплення від гри.
Представлена робота має необхідні стандартні функції, притаманні більшості найвідоміших комп’ютерних ігор. Зокрема, це можливість продовжувати гру після її переривання, також за рахунок того, що в моєму програмному продукті реалізована можливість зчитувати данні з текстових файлів, то будь-який користувач може налаштувати цю гру під себе. Змінювати можна майже все, починаючи від кольору ліній та заливки закінчуючи розмірами букв, форм так інших речей. Також реалізована можливість задавати будь-який алфавіт для вгадування слова. Але найголовніше те, що всі ці маніпуляції можливо робити навіть не знаючи мови програмування. Аналогів даної програмами з такою реалізацією, мною не було знайдено.
2.1. Постановка задачі
Постановка задачі полягає у створенні програми-симулятора реальної гри «Вгадай слово».
Правила головоломки надзвичайно прості та інтуїтивно зрозумілі:
Треба прочитати питання і вводити літери по одній;
Якщо в слові є дві однакові літери, комп’ютер самостійно вводить її необхідну кількість, тобто Вам не треба вводити її самостійно декілька разів;
Якщо ви помиляєтесь, починає малюватись малюнок;
Ви маєте право допустити 7 помилок, якщо їх більше, в цьому разі ви програєте.
Головною задачею користувача є за найменшу кількість кроків вгадати задане слово. Для кожного слова є своє власне пояснення чи питання «Що це?». Питання можна створювати самому та доповнювати бібліотеку.
У разі, якщо користувач вийде з програми, не вгадавши слово до кінця, під час наступного запуску йому буде запропоновано продовжити розпочату гру (зі збереженням кількості ходів) або ж почати нову гру.
У даному програмному продукті для користування використовуються клавіші клавіатури, насамперед клавіші курсора та ENTER. Таке керування на мою думку доволі просте і не викличе труднощів при роботі з програмою.
Для реалізації програмного продукту використано операційну систему Windows 7 та середовище програмування Free Pascal.
2.2. Метод розв’язку задачі
Дана програма є консольним додатком виконаним у середі розробки Free Pascal. Графічна оболонка реалізується з використанням допоміжного модуля Graph. Інтерфейсна частина гри виконана для клавіатури. Програма відповідно реагує на натиснення клавіш, обрання пунктів меню а також певних подій у грі. Наприклад, при правильному виборі букв програма сповіщає про перемогу.
Для зручного розв’язку задачі її алгоритм було розбито на декілька модулів, що дозволяє використовувати окремі функції та процедури цих модулів і в інших програмах. Процедури та функції модулів безпосередньо пов’язані з тим, яку роль вони відіграють у розв’язку задачі та у якому місці алгоритму мають використовуватись. Велика кількість модулів в даному програмному продукті пов’язана з тим, що розв’язок даною програми побудована не стандартним шляхом. Тобто дана програма реалізована не для одного окремого випадку а може змінюватися, модернізуватися виходячи з його уподобань.
2.3. Опис алгоритму
2.4. Опис програми
Програма Main є основною. Вона об’єднує роботу модулів та виконує почерговий виклик необхідних процедур та функцій з метою реалізації гри «Вгадай слово».
Опис типів та змінних головної програми (файл main.pas):
Усі типи, необхідні для роботи програми, оголошуються в модулях
UManager, UMenu, UAbout.
Menu^.Load('Data\Menu')- завантажує всі пункти меню
Menu^.CompMountEnabledSingle(1,1)- робить активним першу кнопку.
Manager^.Load('Data\Manager');- завантажує з дерик торії всі потрібну інформацію для роботи самої програми.
About^.Load('Data\About');- завантажує файли атриббутов и сам текс в підменю About(інформація про автора).
Menu^.Act(Manager,About)- виконую ту чи іншу дію при виборі певної кнопки.
Модуль UCoord-даний модуль створений для визначення координат по Х та Y
X, Y: word; - змінні для відповідних координат х та у
procedure MountXY(const iX, iY: word);встановлення координат
procedure TCoord.Load(Path: string); завантажуе координати с файла path
Модуль UPoint- створює точку для того щоб потім для інших об’єктів зробити данну точку предком и наслідувати її в інших модулях
procedure TPoint.MountParentColor(const iParentColor: word) задає так званий батьківський колір, тобто колір для того об’єкту який знаходиться на задньому фоні
function TPoint.GetVisible: word; функція повертає видимість об’єкта.
procedure TPoint.MountEnabled(const iEnabled: word); гамма кольорів видимої кнопки
procedure TPoint.Load(Path: string); завантажує із файлу координати використовуючи модуль-предок UCoord и встановлює значення для відображення певного об’єкту .
procedure TPoint.MoveTo(const iX, iY: word); прячу видимий об’єкт перемішаю та знову показую.
function TPoint.MountInheritorsVisible: word;ховаю передній фон и задаю в нащадки що parentvisible схован
procedure TPoint.DrawOut; виводить на екран об’єкт в залежності від того був відображений об’єкт чи ні.
Модуль UTextAttr - створений для визначення, обробки та створення різних атрибутів тексту
Font, Direction, Size, Color, AllignX, AllignY: word; Шрифт, напрямок,розмір, колір, горизонтальне, вертикальне вирівнювання.
procedure TTextAttr.Load(const FileName: string); - завантажує з текстового файла всі потрібні атрибути текста.
procedure TTextAttr.Apply –застосовуемо атрибути тексту
procedure TTextAttr.ReNil; - обнуляемо всі атрибути
SetTextJustify(AllignX,AllignY);- параметри виведення текста відносно координат х та у.
Модуль UFillAttr- створений для визначення, обробки та створення різних атрибутів заливки
Pattern,: word узор(тип) заливки
procedure TFillAttr.MountPattern(iPattern: word) – для створення власних ліній для стандартніх 1
procedure TFillAttr.Load(const FileName: string); завантажує з текстового файла всі потрібні атрибути заливки.
procedure TFillAttr.Mount(const iPattern, iColor: word);- привласнюе Pattern := iPattern; Color := iColor;
Модуль ULineAttr- створений для визначення, обробки та створення різних атрибутів ліній.
Thickness :word; змінна яка визначає товщину ліній
SType: word; визначае тип ліній
Всі процедурі аналогічні модулю UFillAttr, тільки зараз розроблено для ліній.
Модуль UDim. Створений для задання розмірів об’єктів та передачу цих модулів різним нащадкам
Width, Height: word ширина висота відповідно.
procedure TDim.Draw(x0,y0: word)- малює об’єкт ;
procedure TDim.ReNil – зануляе висоту та ширину;
procedure TDim.MountWidth(const iWidth: word)- задає ширину;
procedure TDim.MountHeight(const iHeight: word)- задає висоту.
Модуль UBar – створений для побудови прямокутників.
Depth: word;глубина.
Top: boolean; чи видима верхня грань паралелепіпеда.
procedure TBar.Draw(x0,y0: word);- малює прямокутник.
procedure TBar.Load(Path: string)-завантажує данні з текстового файлу .
Модуль UEllipse – створений для побудови фігури – еліпс.
procedure TEllipse.Draw(x0,y0: word)- малює еліпс. x,y-координати центра,
rx,ry координати від цента до еліпса по х та у відповідно.
procedure TEllipse.Load(Path: string)- завантажує данні з текстового файлу .
Модуль ULine- створений для побудови фігури – лінія
procedure TLine.Draw(x0,y0: word)- малює еліпс. x,y-координати початку
procedure TLine.Load(Path: string)- завантажує данні з текстового файлу .
Модуль UPolyLine- модуль утворений для побудови основи шибениці.
В даному модулі використав динамічній масив. Насамперед динамічним називається масив, розмір якого може змінюватися під час виконання програми. TCoordArr = array[1..maxint div sizeof(TCoord)] of TCoord;
CoordCount – змінна для задання кількості елементів, та визначення якого розміру має бути створений динамічний масив.
procedure TPolyLine.CoordDestroу-зануляє кількість елементів і звільняє пам'ять
procedure TPolyLine.CoordCreate- задае потрібну кількість елементів та виділяє потрібну кількість пам'яті
procedure TPolyLine.Draw(x0,y0: word)- передає першу координату
procedure TPolyLine.Load(Path: string) – завантажує з текстового файлу інформацію, а саме про кількість елементів і задає координати елементам массиву
Модуль UTitle – створений для виведення потрібного тексту
Caption: string- змінна для задання певного тексту
procedure TTitle.Load(Path: string)- завантаження потрібної інформації з текстового файла.
procedure TTitle.Draw(const iVisible: word)- малює та робить видним потрібний текст.
2.4. Опис інтерфейсу
Інтерфейс програми є доволі простим та інтуїтивно зрозумілим. Це дозволяє користувачу легко орієнтуватись серед численних функцій програми та легко виконувати потрібні дії.
Керування відбувається за допомогою клавіатури. Для пересування по алфавіту та пересування по меню використовуються клавіші вверх, вниз, вправо та вліво. Для вибору правильної на вашу думку літери, пункту меню або переходу до наступного меню потрібно натиснути Enter.
Натиснення клавіші Esc означатиме вихід з поточного меню або загалом з програми.
При запуску програми користувач побачить меню. У якому є всі потрібні пункти для продовження його дій. В меню можна взнати інформацію про автора програми (About), вийти з програми(Exit), чи почати нову гру(New Game). Кнопка (Continue) спочатку не активна, так як не було розпочато жодної гри.
Коли користувач обере New Game. Меню зникне та відкриється сама програма на якій буде алфавіт, питання щодо слова, область правильно введених букв, та область малювання людини.
Пробігаючи по алфавіту, активна літера позначена з синьою заливкою, можна буде здійснити вибір відповідної літери. В залежності від правильності буде малюватися шибениця и данна буква буде не активна для повторного вибору, чи данна буква буде записано в спеціальну область введення слова під алфавітом.
Після того як гравець допустить сім помилок, тобто сім раз не правильно введе букву шибинеця буде домальована до кінця и виведеться повідомлення про поразку
Або ж у разі правильності вгаданого слова за меншу кількість кроків виведеться повідомлення про перемогу.
Натиснення будь-якої клавіші поверне користувача до головного меню
Висновки
У даному проекті була реалізована гра «Вгадай слово». Аналогом даної гри и широковідома гра «Поле Чудес». Яка є захоплюючою та цікавою. Дружній інтерфейс дозволяє грати в дану гру користувачів з різних вікових категорій. Так як в даній грі все залежить від питання та слова-відповіді, а їх ви можете створювати самі в будь-якому обсязі
Перевагами розробленої програми можна назвати такі:
Керування програмою здійснюється за допомогою клавіатури, що дозволяє значно прискорити процес пересування по алфавіту та чіткого вибору необхідної букви, аніж при керуванні мишкою.
Інтерфейс гри є інтуїтивно зрозумілим, що стане у пригоді користувачам будь-якого віку та досвіду роботи з комп’ютером.
Інтерфейс виконано англійською мовою, що змушує користувача мати мінімальні знання англійської мови для повноцінної гри.
Реалізована можливість не втручаючись в структуру коду програми змінювати майже всі частини інтерфейсу.
Можливість додання питання до бібліотеки, та редагування їх.
Недоліками програми можна назвати такі:
Питання задаються на англійській мові, тобто користувач має володіти даною мовою.
Велика кількість допоміжних модулів.
Розроблена програма передбачає широкі можливості для покращення.
Зокрема, доцільно розробити багатомовний інтерфейс, що дозволить повноцінно насолодитися грою значно більшій кількості людей. Також можливе наповнення бібліотеки питаннями значного об’єму.
Гра дозволяє легко працювати при різних розподільних здатностях екрану (більше 800х600). Також данна гра не потребує великих потужностей від комп’ютера , а значить може бути завантажена майже на будь-якому комп’ютері
Список використаної літератури
Швачко Г. Г. Конспект лекцій з програмування.
http://volvo71.narod.ru- сайт присвячений ООП на мові програмування Pascal.
http://forum.pascal.net.ru/- форум «Все о Паскале»
Додаток А. Лістинг програми
unit ULetterBox;
interface
uses
UShape, ULineAttr, UFillAttr, UTextAttr, UDim;
type
TLetterArr = array[1..maxint div sizeof(PTShape)] of PTShape;
PLetterArr = ^TLetterArr;
TAttr = record
LineAttr: TLineAttr;
FillAttr: TFillAttr;
TextAttr: TTextAttr;
end;
//0 - nevibrana, 1 - vibrana, 2 - activna
TAttrArr = array[0..maxint div sizeof(TAttr) -1] of TAttr;
PAttrArr = ^TAttrArr;// динамический массив атрибуты
PTLetterBox = ^TLetterBox;//динам объект
TLetterBox = object(TShape)
private
procedure LoadSingleAttr(Path: string; var a: TAttr);//загрузка
protected
CompAttr: PAttrArr;//атрибуты компонентов
AttrCount,//количество атрибутов
LetterCount, ColCount,//количество квадратиков, максимальное количестово квадратиков в рядке
ColDistance, RowDistance,// растояние между столбиками, между рядками
Allign: word; //0 - pravo, 1 - centr, 2 - levo
CompDim: PTDim;//размеры компонентов
ActiveLetter: word;
procedure Draw(const iVisible: word); virtual;
procedure LetterCreate; virtual;//создание динам масива
procedure LetterDestroy; virtual;//удаление динам масива
procedure CompAttrCreate;//создание динам масива атрибутов
procedure CompAttrDestroy;//удаление динам масива атрибутов
procedure AllignApply;
procedure CompAttrLoad(Path: string); virtual;//загрузить компоненты для атрибутов
procedure Copy(var Dest: PTDim; const From : PTDim); virtual;
public
Letter: PLetterArr;//динам массив букв
procedure ReNil; virtual;
function MountInheritorsVisible: word; virtual;
constructor Init;
destructor Destroy; virtual;
procedure Load(Path: string);
procedure LetterLoad(Path: string);
function GetLetterCount: word;
procedure MountXY(const iX, iY: word); virtual;
procedure ShowAllLetter;
procedure ShowAllLetterTitle;
procedure CompMountEnabledSingle(const i, iEnabled: word);
procedure CompMountEnabledAll(const iEnabled: word);
procedure CompMountAttrSingle(const i, iEnabled: word);
procedure CompMountAttrAll(const iEnabled: word);
function LetterSelect: word;
end;
implementation
uses
Crt, Graph;
//------------------------------------------------------------------\\
function TLetterBox.LetterSelect: word;
var
PrevAL: word;
c:char;
begin
if (ActiveLetter < 1) or (LetterCount < ActiveLetter) then
ActiveLetter := 1;
while Letter^[ActiveLetter]^.GetEnabled <> 0 do
begin
inc(ActiveLetter);
if ActiveLetter>LetterCount then
ActiveLetter := 1;
end;
CompMountAttrSingle(ActiveLetter,2);//установка атрибутов еденичного кубика
repeat
PrevAL := ActiveLetter;
c := readkey;
if c = #0 then
c := readkey;
case c of
#72,#75:
repeat
dec(ActiveLetter);
if ActiveLetter<1 then
ActiveLetter := LetterCount;
until Letter^[ActiveLetter]^.GetEnabled = 0;
#77,#80:
repeat
inc(ActiveLetter);
if ActiveLetter>LetterCount then
ActiveLetter := 1;
until Letter^[ActiveLetter]^.GetEnabled = 0;
#27:
ActiveLetter := 0;
end;
CompMountAttrSingle(prevAL,Letter^[PrevAL]^.GetEnabled);
if ActiveLetter <> 0 then
CompMountAttrSingle(ActiveLetter,2);
until (c = #13)or(c = #27);
LetterSelect := ActiveLetter;
end;
//------------------------------------------------------------------\\
procedure TLetterBox.Copy(var Dest: PTDim; const From : PTDim);
begin
end;
//------------------------------------------------------------------\\
function TLetterBox.MountInheritorsVisible: word;
var
i: integer;
w: word;
begin
w := inherited;
for i := 1 to LetterCount do
Letter^[i]^.MountParentVisible(w);
if w = 0 then
for i := 1 to LetterCount do
Letter^[i]^.MountParentColor(FillAttr.GetColor);
MountInheritorsVisible := w;
end;
//------------------------------------------------------------------\\
procedure TLetterBox.LoadSingleAttr(Path: string; var a: TAttr);
var
fconfig: text;
FileName: string;
begin
Path := Path+'\';
assign(fconfig,Path+'config.txt');
reset(fconfig);
readln(fconfig);
readln(fconfig,FileName);
a.LineAttr.Load(Path+FileName);
readln(fconfig);
readln(fconfig,FileName);
a.FillAttr.Load(Path+FileName);
readln(fconfig);
readln(fconfig,FileName);
a.TextAttr.Load(Path+FileName);
close(fconfig);
end;
//------------------------------------------------------------------\\
procedure TLetterBox.CompAttrLoad(Path: string);
var
i: integer;
fconfig: text;
FileName: string;
begin
Path := Path+'\';
assign(fconfig,Path+'config.txt');
reset(fconfig);
readln(fconfig);
readln(fconfig,AttrCount);
CompAttrCreate;
for i := 0 to AttrCount-1 do
begin
readln(fconfig);
readln(fconfig,FileName);
LoadSingleAttr(Path+FileName,CompAttr^[i]);
end;
close(fconfig);
end;
//------------------------------------------------------------------\\
procedure TLetterBox.CompMountAttrSingle(const i, iEnabled: word);//установка атрибутов для отдельного элемента массива
begin
if (Letter^[i]^.GetParentVisible=1)and(Letter^[i]^.GetVisible=1)then
Letter^[i]^.Draw(0);
Letter^[i]^.LineAttr.Mount(CompAttr^[iEnabled].LineAttr);
Letter^[i]^.FillAttr.Mount(CompAttr^[iEnabled].FillAttr);
Letter^[i]^.Title.TextAttr.Mount(CompAttr^[iEnabled].TextAttr);
if (Letter^[i]^.GetParentVisible=1)and(Letter^[i]^.GetVisible=1)then
Letter^[i]^.DrawOut;
end;
//------------------------------------------------------------------\\
procedure TLetterBox.CompMountAttrAll(const iEnabled: word);
var
i: integer;
begin
for i := 1 to LetterCount do
CompMountAttrSingle(i, iEnabled);
end;
//------------------------------------------------------------------\\
procedure TLetterBox.CompMountEnabledSingle(const i, iEnabled: word);//установка для отдельного элемента массива enable
begin
Letter^[i]^.MountEnabled(iEnabled);
CompMountAttrSingle(i, iEnabled);
end;
//------------------------------------------------------------------\\
procedure TLetterBox.CompMountEnabledAll(const iEnabled: word);
var
i: integer;
begin
for i := 1 to LetterCount do
CompMountEnabledSingle(i, iEnabled);
end;
//------------------------------------------------------------------\\
procedure TLetterBox.ShowAllLetter;
var
i: integer;
begin
for i := 1 to LetterCount do
Letter^[i]^.Show;
end;
//------------------------------------------------------------------\\
procedure TLetterBox.ShowAllLetterTitle;//показать название букв
var
i: integer;
begin
for i := 1 to LetterCount do
Letter^[i]^.Title.Show;
end;
//------------------------------------------------------------------\\
procedure TLetterBox.LetterDestroy;//удаление динам массива
var
i: integer;
begin
for i := 1 to LetterCount do
Letter^[i]^.Destroy;
FreeMem(Letter, LetterCount*sizeof(PTShape));
LetterCount := 0;
end;
//------------------------------------------------------------------\\
procedure TLetterBox.LetterCreate;
var
i: integer;
begin
GetMem(Letter, LetterCount*sizeof(PTShape));
end;
//------------------------------------------------------------------\\
procedure TLetterBox.ReNil;
begin
inherited;
LetterDestroy;
CompAttrDestroy;
CompDim^.ReNil;
AttrCount := 0;
LetterCount := 0;
ColCount := 1;
ColDistance := 0;
RowDistance := 0;
Allign := 1;
end;
//------------------------------------------------------------------\\
procedure TLetterBox.LetterLoad(Path: string);//загружаю название букв
var
finf: text;
s: string;
i: integer;
begin
LetterDestroy;
assign(finf,Path);
reset(finf);
readln(finf,LetterCount);
LetterCreate;
for i := 1 to LetterCount do
with Letter^[i]^ do
begin
ReNil;
readln(finf,s);
Title.MountCaption(s);
Copy(Letter^[i]^.Dim,CompDim);
Title.MountXY(Title.GetX+X+Dim^.GetWidth div 2,Title.GetY+Y+Dim^.GetHeight div 2);//установка букв по средине кубиков
Letter^[i]^.LineAttr := CompAttr^[1].LineAttr;
end;
close(finf);
AllignApply;
ActiveLetter := 0;
MountInheritorsVisible;
end;
//------------------------------------------------------------------\\
procedure TLetterBox.AllignApply;//применение выравнивания
var
LeftShift, TopShift: word;
i: integer;
RowCount: integer;
s: string;
begin
RowCount := (LetterCount-1) div ColCount +1;
LeftShift := GetX+(Dim^.GetWidth-ColCount*CompDim^.GetWidth-(ColCount-1)*ColDistance)div 2;
TopShift := GetY+(Dim^.GetHeight-RowCount*CompDim^.GetHeight-(RowCount-1)*RowDistance)div 2;
for i := 1 to ColCount*(RowCount-1) do
Letter^[i]^.MountXY(LeftShift+((i-1) mod ColCount)*(CompDim^.GetWidth+ColDistance),
TopShift+((i-1) div ColCount)*(CompDim^.GetHeight+RowDistance));
i := ColCount*RowCount-LetterCount;//храниться количество несуществуюших букв в последнем рядке
case Allign of
0: ;
1: LeftShift := LeftShift + i div 2*(CompDim^.GetWidth+ColDistance);
2: LeftShift := LeftShift + i*(CompDim^.GetWidth+ColDistance)div 2;
end;
for i := ColCount*(RowCount-1)+1 to LetterCount do
Letter^[i]^.MountXY(LeftShift+((i-1) mod ColCount)*(CompDim^.GetWidth+ColDistance),
TopShift+((i-1) div ColCount)*(CompDim^.GetHeight+RowDistance));
end;
//------------------------------------------------------------------\\
procedure TLetterBox.CompAttrDestroy;
var
i: integer;
begin
for i := 0 to AttrCount-1 do
with CompAttr^[i] do
begin
LineAttr.Destroy;
FillAttr.Destroy;
TextAttr.Destroy;
end;
FreeMem(CompAttr, AttrCount*sizeof(TAttr));
AttrCount := 0;
end;
//------------------------------------------------------------------\\
procedure TLetterBox.CompAttrCreate;
var
i: integer;
begin
GetMem(CompAttr, AttrCount*sizeof(TAttr));
for i := 0 to AttrCount-1 do
with CompAttr^[i] do
begin //вызов конструкторов
LineAttr.Init;
FillAttr.Init;
TextAttr.Init;
end;
end;
//------------------------------------------------------------------\\
procedure TLetterBox.MountXY(const iX, iY: word);//задал Х У элипса и перемистил буквы если надо
var
i: integer;
begin
for i := 1 to LetterCount do
Letter^[i]^.MountXY(Letter^[i]^.GetX+iX-GetX,Letter^[i]^.GetY+iY-GetY);
inherited;
end;
//------------------------------------------------------------------\\
function TLetterBox.GetLetterCount: word;
begin
GetLetterCount := LetterCount;
end;
//------------------------------------------------------------------\\
procedure TLetterBox.Load(Path: string);//загружаю объект letterbox
var
finf, fconfig: text;
FileName: string;
begin
Path := Path+'\';
assign(fconfig,Path+'config.txt');
reset(fconfig);
readln(fconfig);
readln(fconfig,FileName);
inherited Load(Path+FileName);
readln(fconfig);
readln(fconfig,FileName);
CompDim^.Load(Path+FileName);
readln(fconfig);
readln(fconfig,FileName);
CompAttrLoad(Path+FileName);
readln(fconfig);
readln(fconfig,FileName);
assign(finf,Path+FileName);
reset(finf);
readln(finf,ColDistance, RowDistance);
readln(finf,ColCount);
readln(finf,Allign);
close(finf);
close(fconfig);
end;
//------------------------------------------------------------------\\
procedure TLetterBox.Draw(const iVisible: word);//рисование letterbox
var
i: integer;
begin
inherited;
for i := 1 to LetterCount do
Letter^[i]^.DrawOut;//выводит на экран текуший видимий фон
end;
//------------------------------------------------------------------\\
constructor TLetterBox.Init;
begin
inherited;
LetterCount := 0;
ColCount := 1;
ColDistance := 0;
RowDistance := 0;
Allign := 0;
end;
//------------------------------------------------------------------\\
destructor TLetterBox.Destroy;
begin
LetterDestroy;
inherited;
CompDim^.Destroy;
CompAttrDestroy;
end;
end.
unit ULine;
interface
uses
UDim;
type
PTLine = ^TLine;
TLine = object(TDim)
public
procedure Load(Path: string); virtual;
constructor Init;
destructor Destroy; virtual;
procedure Draw(x0,y0: word); virtual;
end;
implementation
uses
Graph;
//------------------------------------------------------------------\\
procedure TLine.Draw(x0,y0: word);
begin
Line(X0,Y0,Width,Height);//высота и шырина подгружаюсться с dim Width,Height-конечнии координати
end;
//------------------------------------------------------------------\\
procedure TLine.Load(Path: string);
var
finf: text;
begin
assign(finf,Path);
reset(finf);
readln(finf,Width,Height);
close(finf);
end;
//------------------------------------------------------------------\\
constructor TLine.Init;
begin
inherited;
end;
//------------------------------------------------------------------\\
destructor TLine.Destroy;
begin
end;
end.
unit ULineAttr;
interface
type
TLineAttr = object
protected
SType, Pattern, Thickness, Color: word;
public
procedure ReNil;
procedure Load(const FileName: string);
procedure Mount(const iSType, iPattern, iThickness,
iColor: word); overload;
procedure Mount(const iLineAttr: TLineAttr); overload;
procedure Apply;
procedure MountColor(iColor: word);
function GetColor: word;
constructor Init;
destructor Destroy; virtual;
end;
implementation
uses
Graph;
constructor TLineAttr.Init;
begin
ReNil;
end;
destructor TLineAttr.Destroy;
begin
end;
procedure TLineAttr.MountColor(iColor: word);
begin
Color := iColor;
end;
function TLineAttr.GetColor: word;
begin
GetColor := Color;
end;
procedure TLineAttr.ReNil;
begin
SType := 0;
Pattern := 0;
Thickness := 1;
Color := 0;
end;
procedure TLineAttr.Mount(const iLineAttr: TLineAttr);
begin
Self := iLineAttr;
end;
procedure TLineAttr.Mount(const iSType, iPattern, iThickness,
iColor: word);
begin
SType := iSType;
Pattern := iPattern;
Thickness := iThickness;
Color := iColor;
end;
procedure TLineAttr.Load(const FileName: string);
var
finf: text;
begin
assign(finf,FileName);
reset(finf);
readln(finf,SType, Thickness, Color, Pattern);
close(finf);
end;
procedure TLineAttr.Apply;
begin
SetLineStyle(SType,Pattern,Thickness);
SetColor(Color);
end;
end.
unit UManager;
interface
uses
UPoint, UUsedLet, UAnswer, UShape, UBar, UCanvas, UTitle;
type
PTManager = ^TManager;
TManager = object(TPoint)
protected
LibPath: string;//путь к библиотеке вопросов
Answer: PTAnswer;
Question: PTShape;
Canvas: PTCanvas;
Winner: PTTitle;
Looser: PTTitle;
UsedLet: PTUsedLet;
function MountInheritorsVisible: word; virtual;
procedure LoadQuestion(Path: string);
procedure Draw(const iVisible: word); virtual;
procedure LoadGame;