Використання графічних операторів в програмуванні

Тип работы:
Реферат
Предмет:
Программирование


Узнать стоимость новой

Детальная информация о работе

Выдержка из работы

Зміст

delphi інтерфейс графічний

Вступ

1. Опис алгоритму

2. Вибір складу технічних і програмних засобів

3. Організація вхідних і вихідних даних

4. Розробка програми

5. Блок-схема

6. Текст програми

7. Описання програми

Висновок

Література

Вступ

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

Актуальність теми полягає в наступному: показати, як використовуючи мишу та стандартні оператори в мові Delphi створити графічно розвинений інтерфейс користувача для гри «Ханойські вежі».

Об'єкт дослідження: використання графічних операторів в програмуванні.

Предмет дослідження: використання основних алгоритмiв гри «Ханойські вежі» в розробці програми на Delphi.

Мета дослідження: розглянути основні можливості використання алгоритмiв гри «Ханойські вежі» у графічному інтерфейсі Delphi.

Задачі:

1. Зробити огляд літератури за темою.

2. Розглянути графічні можливості Delphi.

3. Описати механізм підтримки правил гри «Ханойські вежі».

4. Розробити програму, яка надасть можливість гри у «Ханойські вежі».

Гіпотеза дослідження: робота надасть користувачеві інструкції до вивчення алгоритмів гри у «Ханойські вежі» та реалізації їх у Delphi.

1. Опис алгоритму

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

Ціллю головоломки є перенести весь стос дисків на інший стрижень, дотримуючись таких правил:

1. За раз можна рухати лише один диск.

2. Кожен крок полягає в перенесенні верхнього диска з одного зі стрижнєв і насування його на інший зверху інших дисків, які вже можуть бути присутніми на другому стрижні.

3. Диск не можна класти з гори меншого диска.

На Заході задачку вперше оприлюднив французький математик Едуард Лукас у 1863. Існує легенда про храм в Індії, який містив велику кімнату з трьома стовпами і 64 золотими дисками на них. Жрець брагман, виконував команду давнього пророцтва, переставляючи ці диски згідно з правилами головоломки, від того часу. Звідси друга назва головоломки -- головоломка веж Брагми. Згідно з легендою, після завершального руху настане кінець світу. Не ясно чи Лукас вигадав цю легенду або надихнувся нею.

Якщо легенда правдива, і якщо жрець може пересувати диски зі швидкістю один раз в секунду, найменша кількість пересувів займе в нього близько 585 мільярдів років або 18,446,744,073,709,551,615 пересувів до завершення.

Також існують інші версії легенди. Наприклад, в деяких викладеннях, храм був монастирем і жрець був монахом. Храм чи монастир може стояти в різних частинах світу -- включно з Ханоєм, В'єтнам, і може приналежати будь-якій релігії. В деяких варіаціях додаються інші складові, такі як те, що вежі створили на початку світу, або що жрець чи монах може робити лише один рух в день.

Кількість рухів необхідна для розв’язання становить.

2. Вибір складу технічних і програмних засобів

Середовище Delphi дозволяє доволі швидко розробляти додатки для Windows.

Delphi — імперативний, структурований, об'єктно-орієнтована мова програмування, діалект Object Pascal. Починаючи з середи розробки Delphi 7. 0, в офіційних документах Borland стала використовувати назву Delphi для позначення мови Object Pascal. Починаючи з 2007 року вже язик Delphi (похідний від Object Pascal) почав жити своїм самостійним життям і зазнавав різні зміни, пов’язані з сучасними тенденціями (наприклад, з розвитком платформи. NET) розвитку мов програмування: з’явилися class helpers, перевантаження операторів та інше.

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

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

Delphi дозволяє створювати додатки інтерактивним вибором необхідних компонентів з Component Palette і перетяганням їх на форму. Основне ж гідність цього методу полягає в тому, що Delphi при цьому самостійно створює необхідний код. Це нагадує по своїх можливостях Visual Basic і інші подібні мови програмування, однак у випадку Delphi ви одержуєте справжній об'єктно-орієнтований код і всі можливості цього підходу, включаючи розширення функціональних можливостей компонентів Delphi до рівня, що задовольняє ваші запити. Ви можете використовувати компоненти Delphi, можете успадковувати їх і додавати власні методи, а крім того, ви можете використовувати керуючі елементи Active X.

Одне з основних відмінностей Delphi від інших схожих інструментів візуальної розробки додатків полягає в наявності дійсно швидкого, ефективного компілятора. Компілятор видає не тільки повідомлення про помилки, але й величезна кількість попереджень і підказок, які дозволяють створювати більш ясний код. Важливою гідністю є також видача одночасно декількох повідомлень про помилки, що дозволяє швидше виправляти їх.

Одна з більших проблем не візуального програмування — створення користувацького інтерфейсу, тобто найчастіше більше часу займає саме розробка й створення інтерфейсу. З іншого боку, при розробці не варто забувати й про якісний програмний код. Delphi дозволяє створювати програму, вклавши максимум сил і вміння в її робочу частину, і всіляко допомагає вам у тій області, де не має конкурентів, в області створення користувацького інтерфейсу. Витративши якийсь час на навчання роботи в Delphi, ви зможете легко й просто створювати користувацькі інтерфейси, не порівнянні ні з якими іншими, створені за допомогою традиційного інструментарію. Більше того, вони будуть не просто елегантні, але при необхідності будуть мати «ізюминку» у вигляді розроблених вами нових керуючих елементів, що не займе у вас багато сил і часу з таким помічником, як Delphi.

Завдяки об'єктно-орієнтованій природі Delphi ви можете створювати свої компоненти не тільки з нуля, але й використовуючи багатий набір наявних компонентів. Крім створення нових компонентів, розширюваність Delphi включає також можливість інтегрування в середовище Delphi цілих підпрограм, називаних експертами. Expert Interface дозволяє вам доповнювати середовище своїми пунктами меню й діалоговими вікнами для розширення її функціональності.

Працездатність програми перевірялась на комп’ютерах з такими характеристиками:

1) AMD Phenom II x4 3.4 Ghz, 12 Gb RAM

2) AMD E450×2 2.3 Ghz., 4 Gb RAM

Ніяких проблем не було знайдено.

3. Організація вхідних і вихідних даних

Компонент Delphi Button це проста командна кнопка. Командна кнопка Delphi кнопка використовується для реалізації в програмі команд за допомогою обробника події OnClick цього компонента. Один і той же обробник може обробляти події кількох компонентів TButton (та й не тільки TButton, але й навіть компонентів інших типів). Для визначення того, подія якого саме компонента потрібно обробляти, використовується вбудована змінна Sender типу TObject, що позначає об'єкт, що викликав дану подію. Для ілюстрації цієї можливості розглянемо просту процедуру, визначальну натиснуту кнопку.

Компонент Delphi Edit являє собою однорядкове текстове поле, що служить для введення даних користувачем. Основною властивістю компонента Delphi Edit, передавальним введену інформацію, є властивість Text типу String. На відміну від компонента Delphi Label, який автоматично підлаштовує свою довжину під розмір тексту у властивості Caption, що вводиться в компонент Delphi Edit текст ніяк не впливає на довжину (властивість Width) цього компонента. Чи не поміщається в встановлену довжину частину тексту зсувається вправо або вліво за межі компоненту.

Delphi компонент Label призначений для відображення статичного тексту, тобто написів і позначок на формі, які не міняються протягом усього часу роботи програми. Звичайно, текст напису, відображуваний компонентом Label можна змінити, але не безпосередньо, а тільки програмно. Властивістю компонента Label, яке використовується для завдання відображуваного тексту, є Caption. Хоча вважається, що компонент Delphi Label призначений для відображення саме однострочного тексту, це не зовсім вірно. Властивість WordWrap компонента Label дозволяє виводити текст в декілька рядків.

Компонент Delphi Timer дуже простий компонент, який не видно на екрані, але, тим не менш, Timer Delphi виконує дуже важливі функції в програмі. Delphi Timer дозволяє вводити необхідні затримки між виконанням тих чи інших дій. Компонент Delphi Timer не є дуже точним і не підходить для вимірювання малих проміжків часу. Його точність порядку 50 мілісекунд.

FormCreate відповідає за створення головної форми. Game запускає саму гру, з даною кількістю дисків. Panel2Click, Panel3Click, Panel4Click відповідають за переміщення дисків на стержнях. Pos, Sel, Hig, Move — процедури які відповідають за підрахунки координат при переміщенні дисків. EndOfGame — закінчення гри. N4Click — вихід.

4. Розробка програми

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

2. Вивчення літератури з заданого питання

3. Розробка алгоритму написання програми

4. Створення блок-схеми

5. Макетування першочергових алгоритмів

6. Написання тестової версії програми

7. Аналіз за тестування створеного проекту

8. Доопрацювання програми та оформлення графічної оболонки

5. Блок-схема

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

Малюнок 1 — Блок-схема програми

6. Текст програми

unit kyrsov;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, Menus, ComCtrls, Buttons;

type

Pin = array of TPanel;

TForm1 = class (TForm)

Panel1: TPanel;

Panel2: TPanel;

Panel3: TPanel;

Panel4: TPanel;

Panel5: TPanel;

Panel6: TPanel;

Panel7: TPanel;

Edit1: TEdit;

Edit2: TEdit;

Edit3: TEdit;

Edit4: TEdit;

Edit5: TEdit;

Edit6: TEdit;

StatusBar1: TStatusBar;

Timer1: TTimer;

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Edit7: TEdit;

UpDown1: TUpDown;

Button1: TButton;

Button2: TButton;

Label4: TLabel;

Timer2: TTimer;

procedure Game (Sen: TObject);

procedure PanelClick (Sender: TObject);

procedure Move (Pan1, Pan2: TPanel; Ed: TEdit);

procedure Hig (Pan: Pin; Tow: TPanel; Ed1, Ed2: TEdit);

procedure EndOfGame;

procedure Sel (Pan1: TObject; Pan: Pin; Ed1, Ed2, Ed3: TEdit);

procedure Pos (Panel: TPanel);

procedure FormCreate (Sender: TObject);

procedure Panel3Click (Sender: TObject);

procedure Panel4Click (Sender: TObject);

procedure Panel2Click (Sender: TObject);

procedure N2Click (Sender: TObject);

procedure Timer1Timer (Sender: TObject);

procedure N4Click (Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

i, j, t, n: integer;

f: boolean;

p: Pin;

m, s: string;

v: TPanel;

Form1: TForm1;

implementation

{$R *. dfm}

procedure TForm1. FormCreate (Sender: TObject);

begin

Panel2. Height := UpDown1. Position * 20 + 40;

Panel3. Height := UpDown1. Position * 20 + 40;

Panel4. Height := UpDown1. Position * 20 + 40;

Panel2. Top := Panel5. Top — UpDown1. Position * 20 — 30;

Panel3. Top := Panel5. Top — UpDown1. Position * 20 — 30;

Panel4. Top := Panel5. Top — UpDown1. Position * 20 — 30;

f := False;

Panel1. Enabled := False;

Timer1. Enabled := False;

Label1. Visible := False;

Label2. Visible := False;

t := 0;

StatusBar1. Panels. Items[1]. Text := 'Кол-во шагов: ' + IntToStr (t);

m := '00';

s := '00';

StatusBar1. Panels. Items[0]. Text := 'Время игры: ' + m + ':' + s;

Edit1. Text := IntToStr (UpDown1. Position);

Edit2. Text := IntToStr (0);

Edit3. Text := IntToStr (0);

Edit5. Text := '';

Edit6. Text := '';

end;

procedure TForm1. Panel2Click (Sender: TObject);

begin

Label2. Caption := '';

if (f = True) and (v. Color = clLime) and

((v. Caption <= Edit4. Text) or (Edit4. Text = '')) then

begin

t := t + 1;

StatusBar1. Panels. Items[1]. Text := 'Кол-во шагов: ' + IntToStr (t);

Pos (v);

Edit1. Text := IntToStr (StrToInt (Edit1. Text) + 1);

Move (v, Panel5, Edit1);

Edit4. Text := v. Caption;

Hig (p, Panel3, Edit5, Edit2);

Hig (p, Panel4, Edit6, Edit3);

EndOfGame;

v. Color := clBlue;

Label2. Caption := 'Выберите диск для перемещения';

end

else

Label2. Caption := 'Неправильный ход';

end;

procedure TForm1. Panel3Click (Sender: TObject);

begin

Label2. Caption := '';

if (f = True) and (v. Color = clLime) and

((v. Caption <= Edit5. Text) or (Edit5. Text = '')) then

begin

t := t + 1;

StatusBar1. Panels. Items[1]. Text := 'Кол-во шагов: ' + IntToStr (t);

Pos (v);

Edit2. Text := IntToStr (StrToInt (Edit2. Text) + 1);

Move (v, Panel7, Edit2);

Edit5. Text := v. Caption;

Hig (p, Panel2, Edit4, Edit1);

Hig (p, Panel4, Edit6, Edit3);

EndOfGame;

v. Color := clBlue;

Label2. Caption := 'Выберите диск для перемещения';

end

else

Label2. Caption := 'Ход не верный';

end;

procedure TForm1. Panel4Click (Sender: TObject);

begin

Label2. Caption := '';

if (f = True) and (v. Color = clLime) and

((v. Caption <= Edit6. Text) or (Edit6. Text = '')) then

begin

t := t + 1;

StatusBar1. Panels. Items[1]. Text := 'Кол-во шагов: ' + IntToStr (t);

Pos (v);

Edit3. Text := IntToStr (StrToInt (Edit3. Text) + 1);

Move (v, Panel6, Edit3);

Edit6. Text := v. Caption;

Hig (p, Panel2, Edit4, Edit1);

Hig (p, Panel3, Edit5, Edit2);

EndOfGame;

v. Color := clBlue;

Label2. Caption := 'Выберите диск для перемещения';

end

else

Label2. Caption := 'Ход не верный';

end;

procedure TForm1. Pos (Panel: TPanel);

begin

if (Panel. Left = StrToInt (FloatToStr (90 — Panel. Width / 2))) then

Edit1. Text := IntToStr (StrToInt (Edit1. Text) — 1);

if (Panel. Left = StrToInt (FloatToStr (300 — Panel. Width / 2))) then

Edit2. Text := IntToStr (StrToInt (Edit2. Text) — 1);

if (Panel. Left = StrToInt (FloatToStr (510 — Panel. Width / 2))) then

Edit3. Text := IntToStr (StrToInt (Edit3. Text) — 1);

end;

procedure TForm1. Sel (Pan1: TObject; Pan: Pin; Ed1, Ed2, Ed3: TEdit);

begin

if ((Pan1 as TPanel). Caption = Ed1. Text) or

((Pan1 as TPanel). Caption = Ed2. Text) or

((Pan1 as TPanel). Caption = Ed3. Text) then

begin

for i := 1 to UpDown1. Position do

Pan[i]. Color := clBlue; (Pan1 as TPanel)

. Color := clLime;

Label2. Caption := 'Переместите диск';

end;

end;

procedure TForm1. EndOfGame;

begin

if (Edit2. Text = IntToStr (UpDown1. Position)) or

(Edit3. Text = IntToStr (UpDown1. Position)) then

begin

Panel1. Enabled := False;

Label1. Visible := True;

Label2. Visible := False;

Timer1. Enabled := False;

end;

end;

procedure TForm1. Hig (Pan: Pin; Tow: TPanel; Ed1, Ed2: TEdit);

begin

if StrToInt (Ed2. Text) = 1 then

for i := 1 to UpDown1. Position do

if (Tow. Left = Pan[i]. Left + Pan[i]. Width / 2 — 5) then

Ed1. Text := Pan[i]. Caption;

if StrToInt (Ed2. Text) > 1 then

for i := UpDown1. Position downto 2 do

for j := UpDown1. Position — 1 downto 1 do

if (Tow. Left = Pan[i]. Left + Pan[i]. Width / 2 — 5) and

(Tow. Left = Pan[j]. Left + Pan[j]. Width / 2 — 5) then

if (StrToInt (Pan[i]. Caption) > StrToInt (Pan[j]. Caption)) then

Ed1. Text := Pan[j]. Caption;

if StrToInt (Ed2. Text) = 0 then

Ed1. Text := '';

end;

procedure TForm1. Move (Pan1, Pan2: TPanel; Ed: TEdit);

begin

Pan1. Left := StrToInt (FloatToStr (Pan2. Left + Pan2. Width / 2 — Pan1. Width / 2)

Pan1. Top := Pan2. Top — 20 * StrToInt (Ed. Text);

end;

procedure TForm1. N2Click (Sender: TObject);

begin

Game (Sender);

end;

procedure TForm1. Timer1Timer (Sender: TObject);

begin

s := IntToStr (StrToInt (s) + 1);

if (s = '60') then

begin

m := IntToStr (StrToInt (m) + 1);

s := '00';

end;

if Length (s) = 1 then

s := '0' + IntToStr (StrToInt (s));

if Length (m) = 1 then

m := '0' + IntToStr (StrToInt (m) + 1);

StatusBar1. Panels. Items[0]. Text := 'Время игры: ' + m + ':' + s;

end;

procedure TForm1. PanelClick (Sender: TObject);

begin

if ((Sender as TPanel). Caption = Edit4. Text) or

((Sender as TPanel). Caption = Edit5. Text) or

((Sender as TPanel). Caption = Edit6. Text) then

begin

for i := 1 to UpDown1. Position do

p[i]. Color := clBlue; (Sender as TPanel)

Color := clLime;

v := (Sender as TPanel);

f := True;

Label2. Caption := 'Переместите диск';

end;

end;

procedure TForm1. Game (Sen: TObject);

begin

if MessageDlg ('Вы уверены, что хотите закончить эту игру и начать новую?',

mtInformation, [mbOK, mbCancel], 0) = 1 then

begin

for i := 1 to n do

p[i]. Destroy;

FormCreate (Sen);

Panel1. Enabled := True;

Timer1. Enabled := True;

Label2. Visible := True;

Label2. Caption := 'Выберите диск для перемещения';

n := UpDown1. Position;

SetLength (p, UpDown1. Position + 1);

for i := 1 to UpDown1. Position do

begin

Edit1. Text := IntToStr (i);

Edit4. Text := IntToStr (1);

p[i] := TPanel. Create (Self);

p[i]. Height := 20;

p[i]. Width := Panel5. Width — 16 * (UpDown1. Position — i + 1);

p[i]. Left := (Panel2. Left + 5) — StrToInt (FloatToStr (p[i]. Width / 2));

p[i]. Top := Panel5. Top — p[i]. Height * (UpDown1. Position — i + 1);

p[i]. Color := clBlue;

p[i]. Anchors := [akLeft, akBottom];

p[i]. Font. Color := clYellow;

p[i]. Font. Style := [fsBold];

p[i]. Caption := IntToStr (i);

p[i]. OnClick := PanelClick;

p[i]. Parent := Panel1;

end;

end;

end;

procedure TForm1. N4Click (Sender: TObject);

begin

if MessageDlg ('Закончить игру и выйти?', mtInformation, [mbOK, mbCancel], 0) = 1 then

Close;

end;

end.

7. Описання програми

procedure TForm1. FormCreate (Sender: TObject);

Створення головної форми та малювання веж

procedure TForm1. Pos (Panel: TPanel);

Переміщення диска при його виділенні

procedure TForm1. Sel (Pan1: TObject; Pan: Pin; Ed1, Ed2, Ed3: TEdit);

Виділення диску

procedure TForm1. Button3Click (Sender: TObject);

Визиває відомості про програму

procedure TForm1. EndOfGame;

Закінчення гри

procedure TForm1. Hig (Pan: Pin; Tow: TPanel; Ed1, Ed2: TEdit);

Графічне відображення диску на новій вежі

procedure TForm1. Move (Pan1, Pan2: TPanel; Ed: TEdit);

Процедура підрахунку координат при переміщенні

procedure TForm1. N2Click (Sender: TObject);

Клавіша нової гри

procedure TForm1. Timer1Timer (Sender: TObject);

Відлік часу

з

Процедури переміщення дисків на стержнях

procedure TForm1. Panel2Click (Sender: TObject);

до

procedure TForm1. Panel2Click (Sender: TObject);

procedure TForm1. Game (Sen: TObject);

Процедура початку нової гри

procedure TForm1. N4Click (Sender: TObject);

Клавіша виходу з програми

Для створення даної програми були використані стандартні можливості Delphi. Так виглядає вікно конструктора програми.

Малюнок 2 — Конструктор програмного засобу

Після запуску програми ми бачимо таку форму.

Малюнок 3 — Запуск програмного засобу

Після початку нової ігри з’являються вежі.

Малюнок 4 — Початок гри

Закінчення гри.

Малюнок 5 — Закінчення гри

Висновок

У даній курсовій роботі був зроблений огляд літератури по даній темі з яких було взято відомості про використання графічних засобів при розробці програми «Ханойські вежі» на Delphi.

Були вивчені основні методи рішення гри «Ханойські вежі» та розроблена програма-аналог даної гри.

Розроблена програма демонструє як користувач може грати та вигравати при правильному алгоритмі. У програмі на прикладах простих геометричних фігур було показано, як можливо за допомогою миші переміщювати графічни образи по екрану на різні вежі.

Література

1. Нил Дж. Рубенкинг. Язык программирования Delphi для «чайников». Введение в Borland Delphi 2006 = Delphi for Dummies. -- М.: Диалектика, 2007. -- 336 с.

2. Хавьер Пашеку. Программирование в Borland Delphi 2006 для профессионалов = Delphi for. NET Developer’s Guide. -- М.: Вильямс, 2006. -- 944 с.

3. А. Н. Вальвачев, К. А. Сурков, Д. А. Сурков, Ю. М. Четырько. Программирование на языке Delphi. Учебное пособие. -- 2005.

4. Архангельский А. Я. Delphi 7 Справочное пособие. — М.: Бином-Пресс. -2004. -1024 с.

5. Попов В. В. Программирование в Delphi. Оптимальный подход, Век, 2005. -150 с.

6. Глушаков С. В., Клевцов А. Л., Программирование в среде Delphi 7. 0, Фолио 2003 — 415 с.

7. Ханойская башня-- Википедия [Электроный ресурс]: Википедия -- свободная энциклопедия.

Показать Свернуть
Заполнить форму текущей работой