Помощь в обучении программированию
| |InitCurrentFigure |
|DoFall |Реакцию на событие от пользователя "отпускание |
| |фигуры" можно представить следующим образом: |
| |Проверить есть текущая фигура |
| |Assigned(fCurrentFigure) |
| |Если есть то пока она может сдвигаться вниз |
| |(fCurrentFigure.CanDown) |
| |сдвигать ее вниз (fCurrentFigure.Down) |
| |обрабатываем ситуацию упал (для бомб падение |
| |предполагает очистку других ячеек поля) |
| |fCurrentFigure.Falled |
|RotateAgainst, RotateAlong |Реакцию на событие от пользователя "поворот фигуры" |
| |можно представить следующим образом: |
| |Проверить идет ли игра и есть текущая фигура IsGoing|
| |and Assigned(fCurrentFigure) |
| |Если есть то повернуть фигуру |
| |fCurrentFigure:=fCurrentFigure.Rotate |
При выполнении перечисленных операций с фигурой совершенно не важно какая
она на самом деле. Операции проводятся с базовой фигурой, которая имеет
лишь методы по своему повороту, сдвигу. Реализация всех этих действий
выполняется в потомках объекта базовая фигура (TBaseFigure), перечисленных
ниже. В потомках даже приходиться лишь правильно определить координаты
относительно базовой точки, остальное сделает TBaseFigure!
TBaseFigure - класс базовая фигура позволяющий задать очертания фигуры и
методы по ее перемещению, повороту. Включает в себя следующие поля
|Cell |ячейка (TFieldCell) |Описание основной ячейки - цвет, текстура,|
| | |номер находящийся в ней. |
|Xbase |координата по X |Координаты базовой точки фигуры на поле |
| |(integer) | |
|Ybase |координата по Y | |
| |(integer) | |
|DownLimit |отступ снизу |Отступы вниз, влево, вправо от базовой |
| |(integer) |точки до границ фигуры, чтобы не вылазить |
| | |за границы поля при перемещении. Т.е. |
| | |общие очертания фигуры всегда |
| | |прямоугольник. Конкретно какие ячейки она |
| | |занимает в этом пространстве опредялются |
| | |для потомков индивидуально |
|RightLimit |отступ справа | |
| |(integer) | |
|LeftLimit |отступ слева | |
| |(integer) | |
методы:
|Rotate(AlongClock:boolean) |Реализует поворот фигуры по или против часовой |
| |стрелки |
|CanDown |Определяет - может ли фигура упасть на одну клетку |
| |вниз |
|Down |Реализует фактического падения фигуры |
|Move(Left:boolean;AField:TFiel|Реализует фактическое перемещение фигуры вправо или |
|d) |влево. |
|Falled |Реализует реакцию после того как фигура упала. |
| |Перекрыто в бомбе и очищает клетку под ней |
|MakeCurrent |Реализует фактическое рисование фигуры на поле |
|IsEmptyCell |Определяет свободна ли клетка (i,j) на поле |
|IsEmptyAndOnFieldCell |Определяет входит ли клетка (i,j) на поле и свободна|
| |ли она. При таком подходе работает быстрей чем два |
| |вызова - отдельная процедура "входит ли на поле" и |
| |"свободная ли она" |
|ClearCell(i,j:integer) |Реализует очистку одной клетки (i,j)принадлежащей |
| |фигуре |
|FillCell(i,j:integer) |Реализует рисование в определенную клетку (i,j) |
|AfterInit |Обеспечивает возможность изменения полей наследуемой|
| |фигуры |
|CheckEach(Proc:TCheckProc;Xabs|Конкретно определяет какие ячейки используются |
|,Yabs:integer) |фигурой. Процедура обязательно перекрывается в |
| |потомках. |
|ClearCurrent |Обеспечивает стирание фигуры с поля (перед шагом |
| |вниз/влево/вправо/падения) |
|GetTwinFigure(AlongClock:boole|Обеспечивает получение фигуры-близнеца. Т.е той |
|an) |фигуры, которая получается после поворота данной под|
| |углом 90 или -90 градусов. Перекрыто в конкретных |
| |потомках. Если нет, то поворот не осуществляется. |
| |Например для квадрата. |
|SetBaseCell |Обеспечивает установку конкретного номера текстуры в|
| |потомке, таким образом обеспечивается одна фигура, |
| |один цвет. |
Основными методами являются
|Rotate |Получить фигуру близнец. (GetTwinFigure) |
| |Если фигура близнец есть (TwinConstructor<>nil) |
| |то создаем фигуру близнец на основе своих параметров|
| |TwinConstructor.CreateTwin |
| |проверяем не залазит ли созданная фигура на клетки |
| |занятые другими фигурами Twin.CheckEach |
| |Если не залазит то |
| |Очистить все клетки занятые текущей фигурой |
| |(ClearCurrent) |
| |Нарисовать во все клетки фигуры близнеца |
| |(Twin.MakeCurrent) |
| |Возвратить как результат выполнения функции |
| |созданного близнеца (Rotate:=Twin) |
| |Освободить ресурсы занятые текущей фигурой (Free) |
| |Иначе если залазит то удалить созданного близнеца |
| |(Twin.Free) |
| |Возвратить как результат выполнения функции себя, |
| |так поворот не удался и фигура падает в прежнем виде|
| |(Rotate:=self) |
|CanDown |Проверить не выходит ли нижняя граница фигуры за |
| |пределы поля (Ybase>DownLimit) и проверить не |
| |попадают ли в случае перемещения вниз клетки данной |
| |фигуры на клетки другой фигуры |
| |CheckEach(IsEmptyCell,Xbase,Ybase-1) |
|Down |Очистить все клетки занятые фигурой (ClearCurrent) |
| |Уменьшить координату по Y базовой точки |
| |Нарисовать во все клетки фигуры (MakeCurrent) |
|Move |Если движение фигуры налево |
| |Проверить не выходит ли левая граница фигуры за |
| |пределы поля (Xbase>LeftLimit) и проверить не |
| |попадают ли в случае перемещения клетки данной |
| |фигуры на клетки другой фигуры |
| |CheckEach(IsEmptyCell,Xbase-1,Ybase) |
| |Если не попадает то |
| |Очистить все клетки занятые фигурой (ClearCurrent) |
| |Уменьшить координату по X базовой точки |
| |Нарисовать во все клетки фигуры (MakeCurrent) |
| |Если движение фигуры направо |
| |Проверить не выходит ли правая граница фигуры за |
| |пределы поля (Xbase
| |и проверить не попадают ли в случае перемещения |
| |клетки данной фигуры на клетки другой фигуры |
| |CheckEach(IsEmptyCell,Xbase+1,Ybase) |
| |Если не попадает то |
| |Очистить все клетки занятые фигурой (ClearCurrent) |
| |Увеличить координату по X базовой точки |
| |Нарисовать во все клетки фигуры (MakeCurrent) |
|MakeCurrent |Для всех клеток принадлежащих фигуре вызвать метод |
| |по рисованию ячейки (FillCell) |
|ClearCurrent |Для всех клеток принадлежащих фигуре вызвать метод |
| |по стиранию ячейки (ClearCell) |
Используются следующие потомки класса TBaseFigure
|TOneCellFigure |Одноклеточная фигура |
|TBombFigure |Бомба |
|TBombFigureExtra |Бомба-2 |
|TTwoCellFigureH |Двухклеточная фигура расположенная горизонтально |
|TTwoCellFigureV |Двухклеточная фигура расположенная вертикально |
|TThreeCellFigure13 |Трехклеточная прямая фигура расположенная |
| |горизонтально |
|TThreeCellFigure20 |Трехклеточная прямая фигура расположенная |
| |вертикально |
|TThreeCellFigure12 |Трехклеточный уголок. Соответствие цифр расположению|
| |фигуры на площади следующее: |
| |0 |
| |3 1 |
| |2 |
|TThreeCellFigure23 | |
|TThreeCellFigure30 | |
|TThreeCellFigure01 | |
|TFourCellBend0145 |Четырехклеточный изгиб извилистая дорога. |
| |Соответствие цифр расположению фигуры на площади |
| |следующее: 0 1 2 |
| |3 4 5 |
| |6 7 8 |
|TFourCellBend1436 | |
|TFourCellBend0347 | |
|TFourCellBend3412 | |
|TFourCellG1036 |Четырехлеточная фигура типа буквы L или Г. |
| |Соответствие цифр расположению фигуры на площади |
| |следующее: 0 1 2 |
| |3 4 5 |
| |6 7 8 |
|TFourCellG1476 | |
|TFourCellG0125 | |
|TFourCellG0345 | |
|TFourCellG0147 | |
|TFourCellG0367 | |
|TFourCellG3012 | |
|TFourCellG3452 | |
|TFourCellT0 |Четырехлеточная фигура типа буквы Т. Соответствие |
| |цифр расположению выпирающей клетки фигуры на |
| |площади следующее:0 |
| |3 1 |
| |2 |
|TFourCellT1 | |
|TFourCellT2 | |
|TFourCellT3 | |
|TFourCellFigureH |Четырехклеточная прямая фигура расположенная |
| |горизонтально |
|TFourCellFigureV |Четырехклеточная прямая фигура расположенная |
| |вертикально |
|TFourCellBox |Квадрат 2х2 |
Перекрытие виртуальных методов для реализации конкретной фигуры (например
TThreeCellFigure23) осуществляется следующим образом:
|AfterIni|LeftLimit:=1 |Установка значений отступов для данной фигуры. влево|
|t |DownLimit:=1 |на единицу и вниз на единицу |
|CheckEac|Proc(Xabs,Yabs-1)and |Вызов процедуры Proc для конретных ячеек. Обычно |
|h |Proc(Xabs,Yabs)and |вызываются процедуры для этих ячеек по рисованию, |
| |Proc(Xabs-1,Yabs) |стиранию, проверки отсутствия в данной ячейке другой|
| | |фигуры. |
| | |Для данной фигуры ячейками относящимися к данной |
| | |фигуре являются ячейки расположенные относительно |
| | |базовой |
| | |1) на одну ниже по Y, |
| | |2) в том же месте что и базовая |
| | |3) на одну левее по X |
|GetTwinF|if AlongClock then |Если вращение вдоль часовой стрелки то |
|igure |GetTwinFigure:=TThree|фигурой-близнецом будет TThreeCellFigure30 [pic] |
| |CellFigure30 |Если против часовой то TThreeCellFigure12 [pic] |
| |else | |
| |GetTwinFigure:=TThree| |
| |CellFigure12 | |
|SetBaseC|Cell.Color:=RandomCol|Установка определенных значений для текста и |
|ell |ors[25]; |текстуры фигуры данного типа |
| |Cell.TextureNum:=26 | |
Для остальных фигур перекрытие осуществляется аналогично.
TOptionsForm - класс формы настроек. Включает в себя такие объекты как:
|MainPageControl; |Закладки |Расположен на форме настроек, включает в |
| |(TPageControl*) |себя закладки (tabFigures) |
|tabFigures |Закладка |Расположена на MainPageControl, содержит |
| |(TTabSheet*) |на себе (FiguresListView) |
|FiguresListView |Просмотр списков |Предназначен для отображения списка фигур |
| |(TListView*) |используемых в проекте и расстановки им |
| | |свойства разрешения использования при |
| | |генерации |
|FiguresImageList |список изображений |Содержит список изображений используемый |
| |(TImageList*) |списком (FiguresListView) для отображения |
| | |пиктограмм фигур |
(* - помечены стандартные объекты Delphi)
методы:
|InitData |Помещает данные о разрешенных фигурах в список, |
| |отображаемый на форме |
|DoneData |Берет данные о разрешенных фигурах из списка, |
| |отображаемого на форме |
TFigureInfo - запись содержащая информацию о фигуре используемой при
случайной генерации
|Fig |TFigure |Тип одной из существующих фигур |
|Enabled |Boolean |Определяет разрешено ли создание данной |
| | |фигуры |
|FigureHint |string |Наименование фигуры, для отображения в |
| | |форме настроек. Если пусто фигура |
| | |самостоятельно не отображется, а считается|
| | |что она является близнецом для описанной |
| | |выше |
|Icon |integer |Индекс иконки в списке иконок для |
| | |отображения в форме настроек |
TFigureEnumManager - класс управляющий массивом записей типа TFigureInfo.
Включает в себя следующие методы:
|GetExistingFigure(Index:intege|Получение информации об определенной фигуре |
|r) | |
|LoadFiguresInfo(Reg:TRegistryD|Запись в реестр (registry) для сохранения настроек |
|ef) |между сеансами работы |
|SaveFiguresInfo(Reg:TRegistryD|Чтение из реестра |
|ef) | |
|GetIndexByName(const |Получение индекса фигуры в массиве по ее имени |
|Name:ShortString) | |
|GetAmount |Получение общего числа фигур в массиве |
|CreateRandomFigure |Получение фигуры случайным образом |
-----------------------
[pic]
Базовая точка
Страницы: 1, 2
|