Создание приложения "Игра на запоминание"

Тип работы:
Курсовая
Предмет:
Программирование


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

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

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

Создание приложения «Игра на запоминание»

Введение

программа delphi компьютерный игра

Темой курсовой работы является создание компьютерной игры посредством среды программирования Delphi. В Delphi программирование обучающей программы мы будем видеть, как компонент TDrawGrid может использоваться, чтобы помочь нам развить игру «Memory» (Игра на запоминание).

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

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

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

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

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

В Заключении делается вывод о проделанной работе.

1. Анализ постановки задачи

1.1 Назначение и область применения

программа delphi компьютерный игра

Данная игра предназначена для развития памяти. Игрок может выбирать уровни сложности (Difficulty level).

«Игра на запоминание» позволяет увеличить эффективность заученного и ведет к развитию памяти и интеллекта.

1.2 Теоретические сведения

1.2.1 Память

Память -- познавательный процесс, обеспечивающий запечатление, хранение и воспроизведение опыта.

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

1.2.2 Теории забывания

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

1.2.3 Измерение запоминания

Обычно при измерении памяти исследуются разные стороны этого процесса, в том числе:

— простое запоминание нового материала

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

— измерение способности восстанавливать правильную последовательность фрагментов материала, если они предъявлялись в нарушенном порядке

— степень узнавания исходной информации в случае ее смешения с новым или не связанным с ней материалом.

1.2.4 Принципы запоминания

Среди наиболее хорошо изученных и важнейших принципов запоминания можно назвать следующие: забывание происходит быстрее всего сразу после заучивания, через некоторое время этот процесс замедляется; запоминание происходит тем лучше, чем выше уровень овладения материалом. При одинаковом уровне овладения материалом запоминанию способствует осмысленность запоминаемого или же более дробный способ подачи материала; запоминание тем лучше, чем больше повторяется заучиваемый материал; забывание происходит тем быстрее, чем более сходна (вплоть до почти полного совпадения) последующая деятельность с той, что была ранее, до заучивания нового материала; чем выше уровень овладения последующим материалом, тем быстрее происходит забывание предыдущего; материал вспоминается тем полнее, чем более сходна с изначальной ситуация в момент проверки уровня запоминания (включая желание индивида запомнить и воспроизвести материал).

2. Обоснование инструментов разработки

Для реализации данной программы я выбрал язык программирования Borland Delphi 7. Эта версия позволила объединить в рамках единой системы мощный алгоритмический потенциал языка, методы объектно-ориентированного программирования, графику, удобные средства тестирования и отладки программ, а также обеспечить хороший интерфейс для работы пользователя. В основе Delphi лежит язык Object Pascal, предоставляющий возможность полной реализации основных принципов ООП (инкапсуляция, наследование, полиморфизм) и обладающий встроенной обработкой исключительных ситуаций. Компонентная архитектура Delphi является прямым развитием поддерживаемой объектной модели. Все компоненты являются объектными типами (классами), обладающими возможностью неограниченного наследования. Компоненты Delphi поддерживают РМЕ-модель (Property, Method, Events — свойства, методы, события), позволяющую изменять поведение компонентов без необходимости создания новых классов. При создании данной программы я пользовался следующими компонентами и методами:

— Компонент Image (находится на вкладке Additional) — cлужит для отображения графического растрового файла, иконки или метафайла. Компонент Image много богаче по своим возможностям и удобнее, чем PaintBox. Он имеет существенное преимущество: в нем не приходится думать о перерисовке изображения, испорченного из-за перекрытия данного окна другими. Все, связанное с обработкой событий OnPaint, в Image осуществляется автоматически. Кроме того с помощью Image проще, чем при непосредственном рисовании на канве формы, расположить в окне приложения несколько изображений и управлять ими. При этом отпадает необходимость сложных и нудных расчетов координат канвы формы, обеспечивающих требуемое взаимное расположение изображений, т. е. в полной мере проявляются преимущества визуального программирования. Так что, вероятно, во всех случаях лучше работать с канвой Image, чем с канвой формы.

Но помимо этих возможностей у компонента Image имеются свойства, позволяющие работать с различными типами графических файлов. Delphi поддерживает три типа файлов — битовые матрицы, пиктограммы и метафайлы. Все три типа файлов хранят изображения; различие заключается лишь в способе их хранения внутри файлов и в средствах доступа к ним. Битовая матрица (файл с расширением. bmp) отображает цвет каждого пикселя в изображении. При этом информация хранится таким образом, что любой компьютер может отобразить изображение с разрешающей способностью и количеством цветов, соответствующими его конфигурации.

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

Метафайлы (Metafiles) хранят не последовательность битов, из которых состоит изображение, а информацию о способе создания картинки. Они хранят последовательности команд рисования, которые и могут быть повторены при воссоздании изображения. Это делает такие файлы, как правило, более компактными, чем битовые матрицы.

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

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

Свойства компонента Image:

— autoSize. Если он в true, то размер компонента Image будет автоматически подгоняться под размер помещенной в него картинки. Если же свойство AutoSize установлено в false, то изображение может не поместиться в компонент или, наоборот, площадь компонента может оказаться много больше площади изображения.

— stretch. Оно позволяет подгонять не компонент под размер рисунка, а рисунок под размер компонента. Устанавливать Stretch в true может иметь смысл только для каких-то узоров, но не для картинок. Свойство Stretch не действует на изображения пиктограмм, которые не могут изменять своих размеров.

— center. Установленное в true, центрирует изображение на площади Image, если размер компонента больше размера рисунка.

— transparent (прозрачность). Если Transparent равно true, то изображение в Image становится прозрачным. Это можно использовать для наложения изображений друг на друга. Одно из возможных применений этого свойства — наложение на картинку надписей, выполненных в виде битовой матрицы. Эти надписи можно сделать с помощью встроенной в Delphi программы Image Editor. Учтите, что свойство Transparent действует только на битовые матрицы.

— height (высота) и width (ширина). При загрузке разных изображений размер окна приложения может оказаться или слишком маленьким, и тогда вы увидите только часть изображения, или слишком большим, и тогда изображение будет некрасиво размещено в левом верхнем углу формы, оставляя много пустого пространства. При помощи этих свойств, эти недостатки можно устранить.

— Компонент класса TSpinEdit (находится на вкладке Samples) — предназначен исключительно для ввода целых чисел. Две кнопки, находящиеся в правой части компонента, предоставляют возможность пошагового изменения значения чисел. В этот компонент допускается ввод только цифр и знаков «плюс» (+) и «минус» (-).

Свойства компонента SpinEdit:

— EditorEnabled. Разрешает или запрещает ручной ввод чисел.

— Increment. Позволяет задать шаг изменения числа при нажатии кнопки увеличения или уменьшения. По умолчанию это свойство имеет значение 1.

— MaxValue. Определяет максимально допустимое значение числа.

— MinValue. Определяет минимально допустимое значение числа.

— Value. Возвращает текущее значение числа.

— Компонент DrawGrid используется для создания в приложении таблицы, которая может содержать графические изображения. Этот компонент подобен компоненту StringGrid, поскольку последний является производным от DrawGrid. Поэтому в DrawGrid присутствуют все свойства, методы, события компонента StringGrid, кроме относящихся к тексту, т. е. кроме свойств Cells, Cols, Rows, Objects.

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

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

Компонент DrawGrid имеют канву Canvas, на которой можно размещать изображения. Имеется метод CellRect, который возвращает область канвы, отведенную под заданную ячейку.

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

— TTimer — находится на странице System

Этот не визуальный компонент предназначен для уведомления программы об истечении определенных промежутков времени. Компонент инкапсулирует системный таймер Windows и работает через посылку сообщений WM_TIMER.

Свойство:

— property Enabled: Boolean. Включает/выключает таймер, влияя на генерацию им событий. Будучи установлен в Enabled, таймер начинает генерировать события OnTimer через интервал времени.

— property Interval: Word. Измеряется в миллисекундах.

— property OnTimer: TNotifyEvent. После каждого истечения такого интервала инициируется обработчик, связанньш с событием, при этом программист получает очередной квант времени.

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

— TRadioGroup — находится на странице Standart

Готовая группа радиокнопок, содержащая все средства для управления ими. Каждая радиокнопка в группе наследует все свойства TRadioButton. Радиокнопки могут располагаться в несколько столбцов.

Свойство:

— property Columns: Integer; - устанавливает число столбцов с радиокнопками. Оно не должно превышать 16. Индекс нажатой радиокнопки в группе определяется свойством:

— property Itemlndex: Integer. Индекс исчисляется от 0. Если он равен -1, ни одна радиокнопка в группе не нажата.

— property Items: TStrings. Набор строк с заголовками радиокнопок содержится в свойстве.

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

— TMainMenu — находится на странице Standart

Этот компонент представляет главное меню формы и наследует все методы и свойства TMenu. Особенность его в том, что в нем реализован сложный механизм объединения меню. Это необходимо по следующим причинам: Если в приложении имеется несколько форм со своими меню, то для упрощения работы целесообразно соединить их в одно и управлять меню из главной формы. Объединение меню нужно при работе с интерфейсом MDI и его подокнами. Механизм объединения меню используется серверами. OLE, запускаемыми по месту нахождения объекта OLE. Загружаясь, сервер дописывает осуществляемые им операции к меню другого приложения. Объединение меню происходит по специальным правилам, в основе которых лежит использование группового индекса (свойства GroupIndex) каждого объекта TMenuItem. У пунктов меню одного уровня, в частности всех подменю верхнего уровня в главном меню, свойство GroupIndex является неубывающим, т. е. у последующего пункта групповой индекс больше либо равен индексу предыдущего. Это требование отслеживается как на этапе разработки, так и на этапе исполнения. На уровне работы с серверами OLE предусмотрены дополнительные возможности по объединению меню. Если в компонент TOLEContainer загружен объект OLE, то в конец подменю Edit обычно добавляется подменю, из которого можно вызвать функции открытия и редактирования этого объекта. После активизации сервера он может не только вставлять свои подменю в главное, но и добавлять новые пункты к уже существующим подменю.

Конструктор меню Delphi поможет значительно упростить разработку меню. В нем имеются готовые шаблоны типовых подменю верхнего уровня: File, Edit и др. Можно также определить свои шаблоны.

— TEdit — находится на странице Standart

Этот компонент не содержит собственного кода, в нем только опубликованы свойства его предка TCustomEdit. Он представляет собой редактируемую строку.

Свойства Edit:

— property AutoSize: Boolean. Если равно True, компонент изменяет свою высоту в зависимости от размера шрифта (свойство Font).

— property OEMConvert: Boolean. Определяет необходимость автоматического преобразования вводимых символов из кодировки OEM в ANSI и обратно. Такое свойство часто бывает нужно при обработке текста в кодировке MS-DOS.

— property AutoSelect: Boolean. Описывает реакцию редактирующего элемента при получении фокуса. Если оно установлено в True (по умолчанию это так), то при получении фокуса ввода весь текст в нем выделяется независимо от состояния свойства SelText. Если AutoSelect установлено в False, то при получении фокуса выделяется лишь то, что было выделено до его утери.

— property HideSelection: Boolean. После утери фокуса редактором выделенный в нем текст обычно теряет цветовое выделение. Чтобы оно оставалось, установите в False второе свойство:

— property MaxLength: Integer. Определяет максимальную длину текста редактора в символах. Если значение этого свойства равно 0, то ограничений на длину текста нет.

3. Реализация программы

3.1 Логическая структура

Проект «Игра на запоминание» состоит из формы, модулей, установок параметра объекта, ресурсов и т. д. Многие из этих файлов автоматически создаются в Delphi во время построения приложения, а также некоторые создаются компиляторами.

Автоматически созданные файлы:

— единственный «файл — проект» (Memory. dpr) содержит блок — программы, управляющий приложением вцелом. В нем содержатся операторы инициализации и запуска программного выполнения. Его расширение *. dpr;

— три «файлов — формы» (MainUnit. dfm, Unit2. dfm, Unit3. dfm), данные формы являются основными окнами нашей программы, с которыми будет работать пользователь;

— три «файлов — модулей», с расширением *. pas (MainUnit. pas, Unit2. pas, Unit3. pas), в нем содержится текст модуля для работы формы;

— файл опции проекта (Memory. dof). В нем находятся процедуры нашего проекта;

— файл конфигурации проекта (Memory. cfg). В нем хранится установка проекта, директивы компилятора и т. д;

— файл ресурсов (Memory. res) содержит, используемые проектом пиктограмму и другие ресурсы;

— файлы резервных копий (MainUnit. ~ddp, MainUnit. ~dfm, MainUnit. ~pas, Unit2. ~ddp, Unit2. dfm, Unit2. ~pas, Unit3. ~ddp, Unit3. dfm, Unit3. ~pas).

Файлы, созданные компилятором:

— файл memory. exe, использующий файл приложения. Если для выполнения файла не используется никакая библиотека, то этого файла достаточно для работы приложения;

— файлы MainUnit. dcu, Unit2. dcu, Unit3. dcu — это откомпилированные файлы модулей MainUnit. pas, Unit2. pas, Unit3. pas.

3.2 Функции и элементы управления

Так как данная программа-игра предназначена для развития памяти детей, студентов, то просто необходимо было предусмотреть различные уровни сложности. В данной программе предусмотрено 3 уровня сложности: Easy, Standart и Hard.

Используемые в программе процедуры и их описание:

— procedure LoadImages — Процедура загрузки изображения

var

i: integer;

begin

for i := 0 to 9 do

begin

Images[i] := TImage. Create (nil);

Images[i]. Picture. LoadFromFile (ImagePaths[i])

end

end;

— procedure RandomizeThePermutationArray — это процедура, которая случайным способом разбрасывает картинки по таблице.

4. Тестирование

Данные испытания были проведены с целью выявления и устранения ошибок.

В ходе проверки игры была выявлена ошибка ввода значений со знаком (-) в SpinEdit. При работе с игрой с клавиатуры можно было вводить значения с (-). Для решения данной проблемы необходимо в SpinEdit данной программы вminValue поствать значение 1, чтобы избежать значений со знаком (-).

При повторном запуске программы введение значений со знаком (-) стало не доступным.

При вызове справки была замечена странная ошибка, связанная с нечитабельным текстом написанным кириллицей. Однако, в дальнейшем, эта ошибка была исправлена.

В ходе тестирования были обнаружены ошибки, которые с успехом были исправлены.

5. Применение

5 1 Назначение и условия применения программы

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

5.2 Инсталляция

В комплект поставки программного обеспечения входит компакт-диск, на котором записан инсталлятор программы. Для использования данного программного обеспечения необходимо запустить программу установки с компакт-диска (файл «Setup. exe») и дождаться ее завершения. Программа не будет функционировать полностью, если установка проводиться от имени учетной записи, не имеющей прав администратора.

Для того чтобы удалить данное программное обеспечения с компьютера, необходимо выполнить деинсталляцию с помощью элемента «Установка и удаление программ» панели управления.

5.3 Выполнение

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

Заключение

В ходе создания курсового проекта было разработана игра в среде программирования Delphi. Основные цели, поставленные перед созданием данного курсового проекта были реализованы.

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

Также она может служить примером для студентов при изучении таблиц в Delphi.

Литература

1. Прищепов М. А. Программирование на языках Basic, Pascal и Object Pascal в среде Delphi / М. А. Прищепов, Е. В. Севернёва, А. И. Шакирин — Минск: «ТетраСистемс», 2006. — 313 с.

2. Справочник по компонентам Delphi [Электронный ресурс]. -2009. — Режим доступа: http: //www. cyberguru. ru/programming/delphi/delphi-components-part1. html

Приложение

Код программы

MainUnit:

unit MainUnit;

interface

uses

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

Dialogs, Grids, ExtCtrls, Menus, StdCtrls;

type

TfrmMain = class (TForm)

DrawGrid: TDrawGrid;

MainMenu1: TMainMenu;

itemNewGame: TMenuItem;

Timer1: TTimer;

Edit1: TEdit;

N1: TMenuItem;

Newgame1: TMenuItem;

Restart1: TMenuItem;

Exit1: TMenuItem;

procedure FormCreate (Sender: TObject);

procedure itemNewGameClick (Sender: TObject);

procedure DrawGridDrawCell (Sender: TObject; ACol, ARow: Integer;

Rect: TRect; State: TGridDrawState);

procedure DrawGridSelectCell (Sender: TObject; ACol, ARow: Integer;

var CanSelect: Boolean);

procedure Timer1Timer (Sender: TObject);

procedure Exit1Click (Sender: TObject);

end;

type

TCellMode = (ALREADY_MATCHED, CELL_VISIBLE, CELL_INVISIBLE);

const

MAX_IMAGES = 10;

var

frmMain: TfrmMain;

tick: integer;

Images: array [0. MAX_IMAGES-1] of TImage;

RandomPermutationArray: array [0. 19] of integer;

PartnerOf: array [0. 19] of integer;

ImageOfCell: array [0. 19] of integer;

ModeOfCell: array [0. 19] of TCellMode;

FirstCell, SecondCell: integer;

NumberOfVisibleCells, n: integer;

ImagePaths: array [0. MAX_IMAGES-1] of string

= ('img0. bmp', 'img1. bmp', 'img2. bmp', 'img3. bmp', 'img4. bmp', 'img5. bmp',

'img6. bmp', 'img7. bmp', 'img8. bmp', 'img9. bmp');

implementation

{$R *. dfm}

procedure RedrawCell (index: integer);

var

Col, Row: integer;

begin

Row := index div 5;

Col := index mod 5;

frmMain. DrawGridDrawCell (frmMain, Col, Row, frmMain. DrawGrid. CellRect (Col, Row), [])

end;

procedure LoadImages;

var

i: integer;

begin

for i := 0 to MAX_IMAGES-1 do

begin

Images[i] := TImage. Create (nil);

Images[i]. Picture. LoadFromFile (ImagePaths[i])

end

end;

procedure TfrmMain. FormCreate (Sender: TObject);

var

i: integer;

begin

LoadImages;

for i := 0 to 19 do

RandomPermutationArray[i] := i;

Randomize;

itemNewGame. Click

end;

function LinearIndexOf (Row, Column: integer): integer;

begin

Result := 5 * Row + Column

end;

procedure RandomizeThePermutationArray;

var

i, RandomPosition, Temp: integer;

begin

for i := 0 to 18 do

begin

RandomPosition := i + Random (19 — i) + 1;

Temp := RandomPermutationArray[i];

RandomPermutationArray[i] := RandomPermutationArray[RandomPosition];

RandomPermutationArray[RandomPosition] := Temp

end;

end;

procedure AssignPartnerships;

var

i: integer;

begin

for i := 0 to 19 do

if i mod 2 = 0 then

PartnerOf[RandomPermutationArray[i]] := RandomPermutationArray[i + 1]

else

PartnerOf[RandomPermutationArray[i]] := RandomPermutationArray[i — 1]

end;

procedure AssignImagesToCells;

var

i: integer;

begin

for i := 0 to 19 do

ImageOfCell[RandomPermutationArray[i]] := i div 2

end;

procedure InitializeCellModes;

var

i: integer;

begin

for i := 0 to 19 do

ModeOfCell[i] := CELL_INVISIBLE

end;

procedure TfrmMain. itemNewGameClick (Sender: TObject);

var

i: integer;

begin

timer1. Enabled:=true;

tick: =30;

RandomizeThePermutationArray;

AssignPartnerships;

AssignImagesToCells;

InitializeCellModes;

NumberOfVisibleCells := 0;

for i := 0 to 19 do

RedrawCell (i);

end;

procedure TfrmMain. DrawGridDrawCell (Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);

var

index: integer;

begin

index := LinearIndexOf (ARow, ACol);

if ModeOfCell[index] = CELL_INVISIBLE then

begin

DrawGrid. Canvas. Brush. Color := clBlack;

DrawGrid. Canvas. FillRect (Rect)

end

else if ModeOfCell[index] = ALREADY_MATCHED then

begin

DrawGrid. Canvas. Brush. Color := clWhite;

DrawGrid. Canvas. FillRect (Rect)

end

else begin

DrawGrid. Canvas. StretchDraw (Rect, Images[ImageOfCell[index]]. Picture. Graphic);

end

end;

procedure TfrmMain. DrawGridSelectCell (Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean);

var

index: integer;

begin

index := LinearIndexOf (ARow, ACol);

if ModeOfCell[index] = ALREADY_MATCHED then

exit;

if NumberOfVisibleCells = 0 then

begin

FirstCell := index;

ModeOfCell[FirstCell] := CELL_VISIBLE;

RedrawCell (FirstCell);

inc (NumberOfVisibleCells)

end

else if (NumberOfVisibleCells = 1) and (FirstCell < > index) then

begin

SecondCell := index;

ModeOfCell[SecondCell] := CELL_VISIBLE;

RedrawCell (SecondCell);

if PartnerOf[SecondCell] = FirstCell then

begin

Sleep (100);

ModeOfCell[FirstCell] := ALREADY_MATCHED;

RedrawCell (FirstCell);

ModeOfCell[SecondCell] := ALREADY_MATCHED;

RedrawCell (SecondCell);

NumberOfVisibleCells := 0

end

else

inc (NumberOfVisibleCells)

end

else begin

if (FirstCell < > index) and (SecondCell < > index) then

begin

ModeOfCell[index] := CELL_VISIBLE;

RedrawCell (index);

end;

if FirstCell < > index then

begin

ModeOfCell[FirstCell] := CELL_INVISIBLE;

RedrawCell (FirstCell);

end;

if SecondCell < > index then

begin

ModeOfCell[SecondCell] := CELL_INVISIBLE;

RedrawCell (SecondCell);

end;

FirstCell := index;

NumberOfVisibleCells := 1

end

end;

procedure TfrmMain. Timer1Timer (Sender: TObject);

var

i: integer;

begin

n := 0;

tick: =tick-1;

edit1. text:=inttostr (tick);

if edit1. text='0' then

begin

timer1. Enabled:=false;

Showmessage ('GAME OVER');

end;

for i := 0 to 19 do

begin

if ModeOfCell[i] = ALREADY_MATCHED then

n := n + 1;

end;

if n = 20 then

begin

timer1. Enabled:=false;

Showmessage ('You Win');

end;

end;

procedure TfrmMain. Exit1Click (Sender: TObject);

begin

close;

end;

end.

Unit2:

unit Unit2;

interface

uses

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

Dialogs, StdCtrls, ExtCtrls, MainUnit, Spin;

type

TForm2 = class (TForm)

RadioGroup1: TRadioGroup;

SpinEdit1: TSpinEdit;

Button1: TButton;

procedure RadioGroup1Click (Sender: TObject);

procedure Button1Click (Sender: TObject);

procedure SpinEdit1KeyPress (Sender: TObject; var Key: Char);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form2: TForm2;

i: integer;

implementation

{$R *. dfm}

procedure TForm2. RadioGroup1Click (Sender: TObject);

begin

{case RadioGroup1. ItemIndex of

0:

tick := 60;

1:

tick := 45;

2:

tick := 30;

3:

if SpinEdit1. Value < > 0 then

tick := SpinEdit1. Value;

end;

Form2. Hide;

Application. ProcessMessages;

frmMain. Timer1. Enabled := true;

frmMain. RandomizeThePermutationArray;

frmMain. AssignPartnerships;

frmMain. AssignImagesToCells;

frmMain. InitializeCellModes;

NumberOfVisibleCells := 0;

for i := 0 to 19 do

frmMain. RedrawCell (i);}

end;

procedure TForm2. Button1Click (Sender: TObject);

begin

case RadioGroup1. ItemIndex of

0:

tick := 60;

1:

tick := 45;

2:

tick := 30;

3:

if SpinEdit1. Value < > 0 then

tick := SpinEdit1. Value;

end;

Form2. Hide;

Application. ProcessMessages;

frmMain. Timer1. Enabled := true;

frmMain. RandomizeThePermutationArray;

frmMain. AssignPartnerships;

frmMain. AssignImagesToCells;

frmMain. InitializeCellModes;

NumberOfVisibleCells := 0;

for i := 0 to 19 do

frmMain. RedrawCell (i);

end;

procedure TForm2. SpinEdit1KeyPress (Sender: TObject; var Key: Char);

begin

if (key = '-') then

Key := #0;

end;

end.

Unit3:

unit Unit3;

interface

uses

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

Dialogs, StdCtrls, ExtCtrls, XPMan;

type

TForm3 = class (TForm)

Button1: TButton;

Image1: TImage;

XPManifest1: TXPManifest;

procedure Button1Click (Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form3: TForm3;

implementation

{$R *. dfm}

procedure TForm3. Button1Click (Sender: TObject);

begin

form3. Close;

end;

end.

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