Помощь в написании студенческих работ
Антистрессовый сервис

Объектный подход реализации программных систем

КурсоваяПомощь в написанииУзнать стоимостьмоей работы

Настоящая программа представляет собой игру, повторяющую всем известные «Пятнашки». В разработанной объектной модели была приведена работа с тремя его классами. Программа компилируется без ошибок. Для компиляции использовался компилятор, поставляемый в сборке Embarcadero RAD Studio 2010. Всё это свидетельствует о работоспособности программы. При построении программы были использованы основные… Читать ещё >

Объектный подход реализации программных систем (реферат, курсовая, диплом, контрольная)

Министерство Образования и науки Украины Севастопольский национальный технический университет Кафедра ИС ПОЯСНИТЕЛЬНАЯ ЗАПИСКА к курсовому проекту на тему: «Объектный подход реализации программных систем»

по дисциплине «Объектно-ориентированное программирование»

Выполнили: Ст. гр. И-33д Тихонов А. А., Костенко К.А.

Проверила:

Сметанина Т. И.

Севастополь 2011

  • Введение
  • 1. Список исполнителей
  • 2. Постановка задачи
  • 3. Проектное решение (разработка объектной модели)
  • 3.1 Абстрагирование и выделение объектов
  • 3.2 Построение иерархии классов
  • 3.3 Построение информационной модели
  • 3.4 Описание жизненного цикла программы
  • 3.5 Диаграмма переходов состояний
  • 3.6 Диаграмма потоков данных и действий
  • 3.7 Описание классов
  • 3.8 Блок-схема основной программы
  • 3.9 Блок-схема алгоритма игрового процесса
  • 4. Программная реализация
  • 4.1 Среда разработки
  • 4.2 Описание программы
  • 4.3 Критерии качества
  • 4.4 Интерфейс пользователя
  • 4.4.1 Введение
  • 4.4.2 Описание назначение элементов интерфейса
  • Заключение
  • Библиографический список
  • Приложение

Как известно, объектный подход — один из современных методов реализации программных систем (ПС). Наиболее показательна эффективность применения объектного подхода для больших ПС, со сложным характером взаимодействия значительного количества элементов.

Исследованиям этих вопросов и посвящена настоящая курсовая работа.

Тематика курсовой работы продиктована популярностью динамических моделей реального времени. Так как рассматриваемые модели учитывают влияние многих факторов на многие элементы системы, то разработка таких систем требует от проектировщика продуманных шагов и взвешенных решений.

Таким образом, цель настоящей курсовой работы — детальное проектирование и программная реализация стратегической системы, которая в соответствии с заданным вариантом реализует процессы создания и взаимодействия группы объектов.

Однако следует заметить, что преимущества объектно-ориентированного программирования в полной мере проявляются лишь при разработке достаточно сложных программ.

Объектно-ориентированный подход помогает справиться с такими сложными проблемами, как

уменьшение сложности программного обеспечения;

повышение надежности программного обеспечения;

обеспечение возможности модификации отдельных компонентов программного обеспечения без изменения остальных его компонентов;

обеспечение возможности повторного использования отдельных компонентов программного обеспечения.

Систематическое применение объектно-ориентированного подхода позволяет разрабатывать хорошо структурированные, надежные в эксплуатации, достаточно просто модифицируемые программные системы. Этим объясняется интерес программистов к объектно-ориентированному подходу и объектно-ориентированным языкам программирования. Объектно-ориентированный подход является одним из наиболее интенсивно развивающихся направлений теоретического и прикладного программирования.

1. Список исполнителей

Тихонов Алексей Анатольевич:

Разработка алгоритма основной программы

Разработка алгоритма игрового процесса

Реализация процедур запуска форм, отображающих игровой процесс, как с буквами, так и цифрами.

Реализация процедуры ReloadPole, которая отвечает за создание игрового поля и заполнения его элементами заданного массива.

Реализация процедуры FormCreate, отвечающей за создание и указание позиции окна, отображающего игровой процесс.

Реализация процедуры go, которая подсчитывает количество ходов.

Реализация процедуры ChekPole — проверка правильности выложенной последовательности.

Костенко Кирилл Александрович:

Разработка дизайна программы

Реализация процедуры Image1Click, которая осуществляет передвижение ячейки, содержащей значение последовательности, при нажатии на него левой кнопкой мыши.

Реализация процедуры SwitchCkick, которая позволяет пользователю изменить управление с мыши на клавиатуру и обратно.

Реализация процедуры FormKeyDown — отвечает за обозначение клавиш стрелок клавиатуры за управляющие, при игре на клавиатуре.

Реализация процедуры Direction — определяет направление перемещения ячейки в зависимости от пустой.

Реализация процедуры ResetClick — заново выполняет заполнение игрового поля элементами массива случайным образом.

объектный подход модель интерфейс

2. Постановка задачи

Целями курсового проектирования является изучение современного подхода к программированию на основе объектно-ориентированной технологии, приобретение навыков написания программ на языке с поддержкой ООП (С++, Java и Object Pascal) на примере написания программы согласно варианту задания.

Для достижения цели на разных этапах курсового проектирования должны

быть решены следующие задачи:

выбор варианта задания и языка реализации, детализация поставки задачи;

абстрагирование, разработка классов и их иерархии;

написание текста разработанных классов на выбранном языке;

тестирование и отладка программы;

разработка программных документов в соответствии с действующими стандартами.

По окончанию курса студенты должны овладеть объектно-ориентированным подходом решения практических задач, овладеть инструментами, сопровождающими разработку программных систем с использованием этого подхода. Существует множество объектов различного вида и типа, которые взаимодействуют между собой. Задача: перемещая и комбинируя определенным образом объекты, необходимо добиться заданного графически ожидаемого результата. Достижение результата представляется возможным в случае единственно правильного расположения и взаимодействия используемого множества объектов. Системными требованиями для данной курсовой работы является наличие операционной системы Windows 9x/Me/2000/XP/Vista/7, мышки и видеоадаптера.

3. Проектное решение (разработка объектной модели)

3.1 Абстрагирование и выделение объектов

В этом разделе описываются объекты, которые фигурируют в программе и то как они взаимодействуют друг с другом.

Описание объектов:

Игровое поле — поле, в котором отображаются ячейки, заполненные элементами массива случайным образом, поле, где происходят все действия.

Пустое поле — пустое поле, простой объект, за счет которого другие объекты могут перемещаться по игровому полю.

Поле с символом — объект, который содержит символ. Такими объектами заполнено все игровое поле. С такими объектами непосредственно взаимодействует пользователь, перемещает их, пытаясь выстроить их в последовательность.

3.2 Построение иерархии классов

В данном случае имеется один абстрактный класс, в котором описаны несколько процедур, они же используются основным классом. Объекты которого, в свою очередь используют классы, в которых содержатся объекты игрового процесса.

Иерархическая система данного продукта представлена на рисунке 3.1.

Рисунок 3.1 — Иерархия классов

3.3 Построение информационной модели

Информационная модель содержит в себе основные объекты и то, как они взаимодействуют друг с другом. Всё это представлено на рисунке 3.2

Рисунок 3.2 — Информационная модель

Связь — это набор отношений, которые систематически возникают при взаимодействии объектов. Поскольку в качестве способа представления объекта был выбран текстовый подход, то при изображении связей в качестве звеньев отображаются объекты без указания их атрибутов.

Связь R1 — типа один к одному. Игровое поле взаимодействует только с пустым полем. Связь формализована посредством одномерного целочисленного массива, в котором содержатся номера ячеек содержащих строковый порядковый номер ячейки.

Связь R2 — типа один ко многим. Пустое поле может взаимодействовать с полями, заполненными с символами, которые находятся рядом с ним.

Связь R3 — типа один к одному. Поле с символом взаимодействует с игровым полем.

Связь R4 — типа один к одному. Пустое поле взаимодействует с игровым полем.

Связь R5 — типа один к одному. Поле с символом взаимодействует с пустым полем.

Связь R6 — один ко многим. Игровое поле взаимодействует с полями, заполненными символами.

Действие начинается с создания случайной последовательности ячеек, содержащих символы численной последовательности, а так же буквенной, из которых в последствие нужно будет собрать правильную последовательность.

А специальный счетчик подсчитывает количество ходов, за которое пользователь собрал правильную последовательность.

3.4 Описание жизненного цикла программы

На рисунке 3.3 представлена диаграмма жизненного цикла данного основного игрового процесса.

Рисунок 3.3 — Диаграмма жизненного цикла игрового процесса

Как только начинается игра, программа ожидает совершения пользователем хода. После того, как пользователь сделал ход, программа ищет пустой элемент на игровом поле, и в зависимости от того, с какой ячейкой взаимодействовал пользователь, делает её перемещение.

Если ячейка находилась над пустой, то она соответственно движется вниз, занимая её место. По такому же принципу совершаются перемещения других ячеек, в зависимости от их расположения относительно пустой ячейки.

После каждого хода выполняется проверка на правильность выложенной последовательности.

В любое время пользователь может начать игру заново. Игровое поле заново заполнится случайными элементами.

3.5 Диаграмма переходов состояний

Модель состояния объектов или системы состоит из диаграммы переходов состояний (ДПС), а также из описания каждого звена на этой ДПС.

Модели состояний объектов выражают описание жизненного цикла объектов, то есть являются формальным описанием поведения объектов.

Каждая диаграмма состояний описывает все возможные состояния одного экземпляра определенного класса и возможные последовательности его переходов из одного состояния в другое, то есть моделирует все изменения состояний объекта как его реакцию на внешние воздействия.

Диаграмма состояний является графом специального вида, который представляет некоторый автомат. Вершинами графа являются возможные состояния автомата, изображаемые соответствующими графическими символами, а дуги обозначают его переходы из состояния в состояние. Диаграммы состояний могут быть вложены друг в друга для более детального представления отдельных элементов модели.

Диаграмма переходов состояний изображена на рисунке 3.4.

Рисунок 3.4 — Диаграмма переходов состояний игрового процесса

3.6 Диаграмма потоков данных и действий

Диаграмма потоков данных — это граф, на котором показано движение значений данных от их источников через преобразующие их процессы к их потребителям в других объектах.

Основные компоненты ДПДД:

внешние сущности, представляющее собой источник или приемник информации;

процессы преобразования входных данных в выходные в соответствии с определенным алгоритмом;

накопители данных, в которые можно помещать и извлекать информацию;

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

Такая диаграмма для данной программы изображена на рисунке 3.5.

Рисунок 3.5 — Диаграмма потоков данных и действий

3.7 Описание классов

В качестве отправной точки для создания пятнашек служат классы TIntro, TMian и TMain1, первый из которых описывает характеристики объектов, содержащихся в главном и двух игровых окнах. Ссылки на объекты, описанные в этом классе, есть в классах TMain и TMain1.

В классах TMain и TMain1 заданы массивы, содержащие последовательности, которыми поочередна заполняются ячейки пятнашек, а так же переменные, хранящие положение выделенной ячейки при игре на клавиатуре.

Класс TIntro:

WinText{При победе выводит сообщение на экран}

WholestepsText{Считает количество шагов, сделанных игроком}

Playkeyb{Индикатор для переключения на клавиатуру}

Playmouse{ индикатор для переключения на мышь}

Методы класса TIntro:

procedure Play — открывает форму, в которой реализована игра с последовательностью чисел.

procedure Play2 — открывает форму, в которой реализована игра с последовательностью букв.

procedure TIntro. FormCreate — отвечает за положение открывающейся формы. В данном случае по центру экрана.

Среди полей класса TMain можно выделить следующие:

Pjat: array [1.16] of integer;

steps, keybpos: integer;

keyb: string;

Есть массив, хранящий в себе ссылки на принадлежащие ему объекты, и соответственно имеющий к ним доступ посредством методов своего класса, а те в свою очередь обращаются к методам объектов типа TMain и TMain1.

Методы класса TMain:

procedure startpjat () — Задает массив, который в случайном порядке заполняет ячейки пятнашек.

procedure ReloadPole — Создает игровое поле и поля для заполнения случайными значениями из массива с помощью прямоугольников.

function CheckPole — Проверка правильности выложенной последовательности.

procedure TMain. FormCreate — отвечает за положение открывающейся формы. В данном случае по центру экрана. Так же выполняет заполнение ячеек значениями из массива и задает позицию выделенной ячейки при игре на клавиатуре.

procedure TMain. ResetClick — заново выполняет заполнение полей значениями массива в случайном порядке и создает игровое поле.

procedure go — подсчитывает количество ходов, сделанных пользователем и показывает это число под игровым полем.

procedure direction — Определяет, в какую сторону сместится ячейка в зависимости от свободной и от положения выделенной ячейки при ирге на клавиатуре.

procedure TMain. Image1Click — Определяет, в какую сторону сместится ячейка в зависимости от свободной ячейки и от положения курсора при ирге на мыши.

procedure TMain. SwitchClick — Переключает управление с мыши на клавиатуру.

procedure TMain. FormKeyDown — Определяет клавиши стрелочек для управления выделенной ячейкой.

Поля класса TMain1:

Pjat: array [1.16] of integer;

steps, keybpos: integer;

keyb: string;

Все процедуры в TMain и в TMain1 идентичны, кроме процедуры ReloadPole, в ней задается символьный массив от `a' до `o' и при заполнении ячеек эти символы используют индексы, которые заданы в массиве pjat.

3.8 Блок-схема основной программы

Блок-схема основной программы представлена на рисунке 3.6.

Рисунок 3.6 — Блок-схема основной программы

3.9 Блок-схема алгоритма игрового процесса

Данный раздел является основным. Именно в этом разделе происходят основные события.

Алгоритм данного раздела заключается в следующем:

Создание формы и игрового поля;

Заполнение ячеек пятнашек случайными цифрами из заданного массива;

Вывод заполненных ячеек на экран в хаотичном порядке;

Поиск пустого элемента;

Ввод направления перехода;

Перемещение элементов относительно пустого;

Проверка расположения символов последовательности;

Итог;

Схема алгоритма игрового процесса предоставлена на рисунке 3.7.

Рисунок 3.7 — Алгоритм игрового процесса

4. Программная реализация

4.1 Среда разработки

Программа была реализована в среде разработки Borland Delphi 7 c использованием стандартных компонент.

Delphi был выбран для реализации программы по следующим причинам:

Высокопроизводительный компилятор в машинный код.

Объектно-ориентированная модель компонент.

Визуальное (а следовательно и скоростное) построение приложений.

4.2 Описание программы

Дизайн и интерфейс программы интуитивно понятен. В программе предусмотрен удобный способ выбора типа игры. К тому же возможность менять управление с клавиатуры на мышь и обратно. Так же есть функция сброса игрового поля (начало игры заново).

4.3 Критерии качества

Фактор качества ПО — это нефункциональное требование к программе, которое обычно не описывается в договоре с заказчиком, но, тем не менее, является желательным требованием, повышающим качество программы.

В данном продукте учтены следующие факторы:

Понятность (При виде программы становится ясно, для чего она);

Полнота (Все части программы реализованы полностью);

Краткость (Лишней и дублированной информации не присутствует);

Портируемость (Лёгкая адаптация программы к другому окружению);

Согласованность (Используются одни форматы и обозначения);

Удобство использования (Интерфейс прост и доступен пониманию);

Сопровождаемость (Программа документирована и не запутана);

Надежность (Отказы и сбои в работе программы отсутствуют);

Безопасность;

4.4 Интерфейс пользователя

4.4.1 Введение

Прежде чем начать описание данной программы, необходимо определить его назначение. Настоящая программа представляет собой игру, повторяющую всем известные «Пятнашки». Главное окно программы представлено на рисунке 4.1.

Рисунок 4.1 — Главное окно программы

Здесь пользователю предоставлен выбор, с чем играть, последовательностью букв или цифр. При нажатии соответствующей кнопки выводится соответствующее окно с игрой.

При нажатии на кнопку «Цифры» появляется окно «Пятнашек» с полями, заполненными цифрами от одного до пятнадцати. Интерфейс окна предоставлен на рисунке 4.2.

Рисунок 4.2 — Окно «Цифры»

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

4.4.2 Описание назначение элементов интерфейса

— Кнопка в виде игрового манипулятора осуществляет переключение управления с мыши на клавиатуру и обратно, так же, ели навести на неё курсор мыши, можно получить подсказку, что такое переключение можно произвести так же с помощью нажатия комбинации клавиш Ctrl+Tab.

— Кнопка в виде стрелочки осуществляет сброс игрового поля, тем самым начинает игру заново.

Кнопка закрывает программу полностью.

Для того чтобы выбрать другой тип игры, нужно просто закрыть окно, нажав на крестик.

При нажатии на кнопку «Буквы» в главном окне программы появляется окно «Пятнашек» с полями, заполненными буквами от «а» до «о». Интерфейс окна предоставлен на рисунке 4.3.

Рисунок 4.3 — Окно «Буквы»

На рисунке видно, что окно с «буквами» идентично окну с «цифрами». Буквы в игровом поле также расположены в хаотичном порядке.

Следует заметить, что в каждом из игровых окон, под игровым полем присутствует счетчик ходов. В конце игры пользователь сможет посмотреть, за сколько ходов он справился с задачей.

Программа проста и легка в использовании. При наведении на каждый из элементов окна появляется подсказка, помогающая пользователю понять, для чего тот или иной элемент нужен.

Заключение

Данная программа разработана в соответствии с постановкой задачи на курсовое проектирование по теме «Объектный подход» по дисциплине «Объектно-ориентированное программирование» .

При написании программы были использованы методические указания по курсовому проектированию по дисциплине «Объектно-ориентированное программирование». Интерфейс программы удобен и прост в обращении. Тестирование программы подтвердило, что программа корректно выполняет обработку данных и демонстрацию взаимодействия объектов различных классов.

При построении программы были использованы основные идеи объектного подхода. Программа, реализующая данную объектную модель, написана в соответствии с основными принципами объектно-ориентированного программирования. В процессе написания программы были закреплены и усовершенствованы навыки работы в среде Delphi.

Настоящая программа представляет собой игру, повторяющую всем известные «Пятнашки». В разработанной объектной модели была приведена работа с тремя его классами. Программа компилируется без ошибок. Для компиляции использовался компилятор, поставляемый в сборке Embarcadero RAD Studio 2010. Всё это свидетельствует о работоспособности программы.

Библиографический список

1. Буч Г. Объектно-ориентированное проектирование с примерами применения: Пер с англ. — М.: Конкорд, 1992. — 519 с.

2. Доронина Ю. В. Конспект курса лекций по дисциплине «Объектно-ориентированное программирование»

3. Р. Вайнер, Л. Пинсон. Delphi 5 изнутри. — Киев: НПИФ «ДиаСофт», 2001.

4. И. Пол. Объектно-ориентированное программирование с использованием Delphi. — Киев: НПИФ «ДиаСофт», 1999.

5. Г. Шилдт. Самоучитель Delphi 5. BHV-Санкт-Петербург. 2000

6. П. Дарахвелидзе, Е. Марков Delphi — среда визуального программирования. — BHV-Санкт-Петербург 1996.

Приложение

Текст программы

Главное окно программы

unit Pre;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, ExtCtrls, StdCtrls;

type

TIntro = class (TForm)

Start: TImage;

Exit: TImage;

Background: TImage;

PStart: TImage;

PExit: TImage;

PStart01: TImage;

Start01: TImage;

procedure FormCreate (Sender: TObject);

procedure StartMouseDown (Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure StartMouseUp (Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure ExitMouseDown (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

procedure ExitMouseUp (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

procedure Start01MouseDown (Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure Start01MouseUp (Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Intro: TIntro;

WinText, WholestepsText, playkeyb, playmouse: string;

implementation

uses Unit1, Unit2;

{$R *. dfm}

procedure Play;

begin

begin

WinText: ='Вы выиграли! ';

WholestepsText: ='Всего ходов: ';

end;

main. showmodal;

end;

procedure Play2;

begin

begin

WinText: ='Вы выиграли! ';

WholestepsText: ='Всего ходов: ';

end;

main1. showmodal;

end;

procedure TIntro. FormCreate (Sender: TObject);

begin

Intro. left: = (screen. Width-Intro. Width) div 2;

Intro. top: = (screen. Height-Intro. Height) div 2;

end;

procedure TIntro. StartMouseDown (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

begin

Start. Visible: =False;

PStart. Visible: =True;

end;

procedure TIntro. StartMouseUp (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

begin

Start. Visible: =True;

PStart. Visible: =False;

Play;

end;

procedure TIntro. ExitMouseDown (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

begin

Exit. Visible: =False;

PExit. Visible: =True;

end;

procedure TIntro. ExitMouseUp (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

begin

Exit. Visible: =True;

PExit. Visible: =False;

Halt;

end;

procedure TIntro. Start01MouseDown (Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

Start01. Visible: =False;

PStart01. Visible: =True;

end;

procedure TIntro. Start01MouseUp (Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

Start01. Visible: =True;

PStart01. Visible: =False;

Play2;

end;

end.

Окно с числовым игровым полем

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, ExtCtrls;

type

TMain = class (TForm)

Image1: TImage;

Label1: TLabel;

Label2: TLabel;

Switch: TImage;

Reset: TImage;

Exit: TImage;

Image5: TImage;

PExit: TImage;

PReset: TImage;

PSwitch: TImage;

procedure FormCreate (Sender: TObject);

procedure Image1Click (Sender: TObject);

procedure FormPaint (Sender: TObject);

procedure FormKeyDown (Sender: TObject; var Key: Word;

Shift: TShiftState);

procedure SwitchClick (Sender: TObject);

procedure ResetClick (Sender: TObject);

procedure ExitClick (Sender: TObject);

procedure SwitchMouseDown (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

procedure SwitchMouseUp (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

procedure ResetMouseDown (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

procedure ResetMouseUp (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

procedure ExitMouseDown (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

procedure ExitMouseUp (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Main: TMain;

Pjat: array [1.16] of integer;

steps, keybpos: integer;

keyb: string;

implementation

uses pre;

{$R *. dfm}

procedure startpjat ();

var

i, q, w, a: integer;

begin

steps: =0;

main. label2. caption: ='0';

randomize;

pjat [1]: =random (16);

for i: =2 to 16 do

begin

a: =1;

while (a=1) do

begin

w: =0;

pjat [i]: =random (16);

for q: =i-1 downto 1 do

if (pjat [i] =pjat [q]) then w: =w+1;

if (w=0) then a: =2;

end;

end;

end;

procedure ReloadPole (canvas: TCanvas);

var i, q, w, x, y: integer;

begin

canvas. Rectangle (0,0, 201, 201);

if keyb='yes' then

begin

canvas. Brush. Color: =clGradientInactiveCaption;

case keybpos of

1: begin x: =0; y: =0; end;

2: begin x: =50; y: =0; end;

3: begin x: =100; y: =0; end;

4: begin x: =150; y: =0; end;

5: begin x: =0; y: =50; end;

6: begin x: =50; y: =50; end;

7: begin x: =100; y: =50; end;

8: begin x: =150; y: =50; end;

9: begin x: =0; y: =100; end;

10: begin x: =50; y: =100; end;

11: begin x: =100; y: =100; end;

12: begin x: =150; y: =100; end;

13: begin x: =0; y: =150; end;

14: begin x: =50; y: =150; end;

15: begin x: =100; y: =150; end;

16: begin x: =150; y: =150; end;

end;

canvas. Rectangle (x, y, x+51,y+51);

canvas. Brush. Color: =clWhite;

end;

w: =3;

for q: =0 to w do

for i: =0 to w do

begin

canvas. MoveTo (i*50,q*50);

canvas. LineTo ((i) *50, (w-q+1) *50);

canvas. MoveTo (i*50,q*50);

canvas. LineTo ((w-i+1) *50, (q) *50);

end;

w: =1;

for q: =1 to 4 do

for i: =1 to 4 do

begin

if (pjat [w] <>0) then

if (keyb='yes') and (keybpos=w) then

begin

canvas. Brush. Color: =clGradientInactiveCaption;

canvas. TextOut (i*50−30,q*50−30, inttostr (pjat [w]));

canvas. Brush. Color: =clWhite;

end else

canvas. TextOut (i*50−30,q*50−30, inttostr (pjat [w]));

w: =w+1;

end;

end;

function CheckPole (): string;

var i: integer;

begin

result: ='yes';

for i: =1 to 15 do if (pjat [i] <>i) then result: ='no';

if (pjat <>0) then result: ='no';

end;

procedure TMain. FormCreate (Sender: TObject);

begin

startpjat ();

reloadPole (image1. Canvas);

main. left: = (screen. Width-main. Width) div 2;

main. top: = (screen. Height-main. Height) div 2;

keyb: ='no';

keybpos: =1;

end;

procedure TMain. ResetClick (Sender: TObject);

begin

startpjat ();

reloadPole (image1. Canvas);

end;

procedure go (i, cell: integer);

begin

pjat [i]: =pjat [cell];

pjat [cell]: =0;

steps: =steps+1;

reloadPole (main. image1. Canvas);

main. label2. Caption: =inttostr (steps);

if CheckPole='yes' then showmessage (pre. wintext);

end;

procedure direction (dire: string);

var cell: integer;

begin

if dire='sdown' then if (keybpos<=12) then keybpos: =keybpos+4;

if dire='sleft' then if (keybpos<>1) and (keybpos<>5) and (keybpos<>9) and (keybpos<>13) then keybpos: =keybpos-1;

if dire='sup' then if (keybpos>=5) then keybpos: =keybpos-4;

if dire='sright'then if (keybpos<>4) and (keybpos<>8) and (keybpos<>12) and (keybpos<>16) then keybpos: =keybpos+1;

if dire='space' then begin

cell: =keybpos;

if (pjat [cell-1] =0) and (cell>=2) and (cell<=17) then

go (cell-1,cell);

if (pjat [cell+1] =0) and (cell>=0) and (cell<=15) then

go (cell+1,cell);

if (pjat [cell-4] =0) and (cell>=5) and (cell<=20) then

go (cell-4,cell);

if (pjat [cell+4] =0) and (cell>=-3) and (cell<=12) then

go (cell+4,cell);

end;

reloadPole (main. image1. Canvas);

end;

procedure TMain. Image1Click (Sender: TObject);

var

x, y, cell: integer;

begin

if keyb='no' then

begin

x: =mouse. CursorPos. x-image1. left-main. Left-4;

y: =mouse. CursorPos. y-image1. top-main. top-30;

x: =x div 50;

y: =y div 50;

cell: =x*1+y*4+1;

if (pjat [cell-1] =0) and (cell>=2) and (cell<=17) then

go (cell-1,cell);

if (pjat [cell+1] =0) and (cell>=0) and (cell<=15) then

go (cell+1,cell);

if (pjat [cell-4] =0) and (cell>=5) and (cell<=20) then

go (cell-4,cell);

if (pjat [cell+4] =0) and (cell>=-3) and (cell<=12) then

go (cell+4,cell);

end;

end;

procedure TMain. SwitchClick (Sender: TObject);

begin

if (keyb='yes')

then

begin

keyb: ='no';

reloadpole (image1. Canvas);

end

else

begin

keyb: ='yes';

reloadpole (image1. Canvas);

end;

end;

procedure TMain. ExitClick (Sender: TObject);

begin

halt;

end;

procedure TMain. FormPaint (Sender: TObject);

begin

label1. Caption: =pre. WholestepsText;

if keyb='no'

then

if keyb='yes'

then

end;

procedure TMain. FormKeyDown (Sender: TObject; var Key: Word;

Shift: TShiftState);

begin

if keyb='yes'

then

case Key of

vk_down: direction ('sdown');

vk_left: direction ('sleft');

vk_up: direction ('sup');

vk_right: direction ('sright');

vk_space: direction ('space');

VK_TAB: SwitchClick (Sender);

end

else

case key of

VK_TAB: SwitchClick (Sender);

end;

end;

procedure TMain. SwitchMouseDown (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

begin

Switch. Visible: =False;

PSwitch. Visible: =True;

end;

procedure TMain. SwitchMouseUp (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

begin

Switch. Visible: =True;

PSwitch. Visible: =False;

end;

procedure TMain. ResetMouseDown (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

begin

Reset. Visible: =False;

PReset. Visible: =True;

end;

procedure TMain. ResetMouseUp (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

begin

Reset. Visible: =True;

PReset. Visible: =False;

end;

procedure TMain. ExitMouseDown (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

begin

Exit. Visible: =False;

PExit. Visible: =True;

end;

procedure TMain. ExitMouseUp (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

begin

Exit. Visible: =True;

PExit. Visible: =False;

end;

end.

Окно с буквенным игровым полем

unit Unit2;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, ExtCtrls;

type

TMain1 = class (TForm)

Image1: TImage;

Label1: TLabel;

Label2: TLabel;

Switch: TImage;

Reset: TImage;

Exit: TImage;

Image5: TImage;

PExit: TImage;

PReset: TImage;

PSwitch: TImage;

procedure FormCreate (Sender: TObject);

procedure Image1Click (Sender: TObject);

procedure FormPaint (Sender: TObject);

procedure FormKeyDown (Sender: TObject; var Key: Word;

Shift: TShiftState);

procedure SwitchClick (Sender: TObject);

procedure ResetClick (Sender: TObject);

procedure ExitClick (Sender: TObject);

procedure SwitchMouseDown (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

procedure SwitchMouseUp (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

procedure ResetMouseDown (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

procedure ResetMouseUp (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

procedure ExitMouseDown (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

procedure ExitMouseUp (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Main1: TMain1;

Pjat: array [1.16] of integer;

steps, keybpos: integer;

keyb: string;

implementation

uses pre;

{$R *. dfm}

procedure startpjat ();

var

i, q, w, a: integer;

begin

steps: =0;

main1. label2. caption: ='0';

randomize;

pjat [1]: =random (16);

for i: =2 to 16 do

begin

a: =1;

while (a=1) do

begin

w: =0;

pjat [i]: =random (16);

for q: =i-1 downto 1 do

if (pjat [i] =pjat [q]) then w: =w+1;

if (w=0) then a: =2;

end;

end;

end;

procedure ReloadPole (canvas: TCanvas);

var i, q, w, x, y: integer;

mass58: array [1.15] of char;

begin

mass58 [1]: ='a';

mass58 [2]: ='b';

mass58 [3]: ='c';

mass58 [4]: ='d';

mass58 [5]: ='e';

mass58 [6]: ='f';

mass58 [7]: ='g';

mass58 [8]: ='h';

mass58 [9]: ='i';

mass58 [10]: ='j';

mass58 [11]: ='k';

mass58 [12]: ='l';

mass58 [13]: ='m';

mass58 [14]: ='n';

mass58 [15]: ='o';

canvas. Rectangle (0,0, 201, 201);

if keyb='yes' then

begin

canvas. Brush. Color: =clGradientInactiveCaption;

case keybpos of

1: begin x: =0; y: =0; end;

2: begin x: =50; y: =0; end;

3: begin x: =100; y: =0; end;

4: begin x: =150; y: =0; end;

5: begin x: =0; y: =50; end;

6: begin x: =50; y: =50; end;

7: begin x: =100; y: =50; end;

8: begin x: =150; y: =50; end;

9: begin x: =0; y: =100; end;

10: begin x: =50; y: =100; end;

11: begin x: =100; y: =100; end;

12: begin x: =150; y: =100; end;

13: begin x: =0; y: =150; end;

14: begin x: =50; y: =150; end;

15: begin x: =100; y: =150; end;

16: begin x: =150; y: =150; end;

end;

canvas. Rectangle (x, y, x+51,y+51);

canvas. Brush. Color: =clWhite;

end;

w: =3;

for q: =0 to w do

for i: =0 to w do

begin

canvas. MoveTo (i*50,q*50);

canvas. LineTo ((i) *50, (w-q+1) *50);

canvas. MoveTo (i*50,q*50);

canvas. LineTo ((w-i+1) *50, (q) *50);

end;

w: =1;

for q: =1 to 4 do

for i: =1 to 4 do

begin

if (pjat [w] <>0) then

if (keyb='yes') and (keybpos=w) then

begin

canvas. Brush. Color: =clGradientInactiveCaption;

canvas. TextOut (i*50−30,q*50−30,mass58 [Pjat [w]]);

canvas. Brush. Color: =clWhite;

end else

canvas. TextOut (i*50−30,q*50−30,mass58 [Pjat [w]]);

w: =w+1;

end;

end;

function CheckPole (): string;

var i: integer;

begin

result: ='yes';

for i: =1 to 15 do if (pjat [i] <>i) then result: ='no';

if (pjat <>0) then result: ='no';

end;

procedure TMain1. FormCreate (Sender: TObject);

begin

startpjat ();

reloadPole (image1. Canvas);

main1. left: = (screen. Width-main1. Width) div 2;

main1. top: = (screen. Height-main1. Height) div 2;

keyb: ='no';

keybpos: =1;

end;

procedure TMain1. ResetClick (Sender: TObject);

begin

startpjat ();

reloadPole (image1. Canvas);

end;

procedure go (i, cell: integer);

begin

pjat [i]: =pjat [cell];

pjat [cell]: =0;

steps: =steps+1;

reloadPole (main1. image1. Canvas);

main1. label2. Caption: =inttostr (steps);

if CheckPole='yes' then showmessage (pre. wintext);

end;

procedure direction (dire: string);

var cell: integer;

begin

if dire='sdown' then if (keybpos<=12) then keybpos: =keybpos+4;

if dire='sleft' then if (keybpos<>1) and (keybpos<>5) and (keybpos<>9) and (keybpos<>13) then keybpos: =keybpos-1;

if dire='sup' then if (keybpos>=5) then keybpos: =keybpos-4;

if dire='sright'then if (keybpos<>4) and (keybpos<>8) and (keybpos<>12) and (keybpos<>16) then keybpos: =keybpos+1;

if dire='space' then begin

cell: =keybpos;

if (pjat [cell-1] =0) and (cell>=2) and (cell<=17) then

go (cell-1,cell);

if (pjat [cell+1] =0) and (cell>=0) and (cell<=15) then

go (cell+1,cell);

if (pjat [cell-4] =0) and (cell>=5) and (cell<=20) then

go (cell-4,cell);

if (pjat [cell+4] =0) and (cell>=-3) and (cell<=12) then

go (cell+4,cell);

end;

reloadPole (main1. image1. Canvas);

end;

procedure TMain1. Image1Click (Sender: TObject);

var

x, y, cell: integer;

begin

if keyb='no' then

begin

x: =mouse. CursorPos. x-image1. left-main1. Left-4;

y: =mouse. CursorPos. y-image1. top-main1. top-30;

x: =x div 50;

y: =y div 50;

cell: =x*1+y*4+1;

if (pjat [cell-1] =0) and (cell>=2) and (cell<=17) then

go (cell-1,cell);

if (pjat [cell+1] =0) and (cell>=0) and (cell<=15) then

go (cell+1,cell);

if (pjat [cell-4] =0) and (cell>=5) and (cell<=20) then

go (cell-4,cell);

if (pjat [cell+4] =0) and (cell>=-3) and (cell<=12) then

go (cell+4,cell);

end;

end;

procedure TMain1. SwitchClick (Sender: TObject);

begin

if (keyb='yes')

then

begin

keyb: ='no';

reloadpole (image1. Canvas);

end

else

begin

keyb: ='yes';

reloadpole (image1. Canvas);

end;

end;

procedure TMain1. ExitClick (Sender: TObject);

begin

halt;

end;

procedure TMain1. FormPaint (Sender: TObject);

begin

label1. Caption: =pre. WholestepsText;

if keyb='no'

then

if keyb='yes'

then

end;

procedure TMain1. FormKeyDown (Sender: TObject; var Key: Word;

Shift: TShiftState);

begin

if keyb='yes'

then

case Key of

vk_down: direction ('sdown');

vk_left: direction ('sleft');

vk_up: direction ('sup');

vk_right: direction ('sright');

vk_space: direction ('space');

VK_TAB: SwitchClick (Sender);

end

else

case key of

VK_TAB: SwitchClick (Sender);

end;

end;

procedure TMain1. SwitchMouseDown (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

begin

Switch. Visible: =False;

PSwitch. Visible: =True;

end;

procedure TMain1. SwitchMouseUp (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

begin

Switch. Visible: =True;

PSwitch. Visible: =False;

end;

procedure TMain1. ResetMouseDown (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

begin

Reset. Visible: =False;

PReset. Visible: =True;

end;

procedure TMain1. ResetMouseUp (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

begin

Reset. Visible: =True;

PReset. Visible: =False;

end;

procedure TMain1. ExitMouseDown (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

begin

Exit. Visible: =False;

PExit. Visible: =True;

end;

procedure TMain1. ExitMouseUp (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

begin

Exit. Visible: =True;

PExit. Visible: =False;

end;

end.

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