Смекни!
smekni.com

Помощь в обучении программированию (стр. 2 из 3)

TimerTick(Sender:TObject) Событие от таймера. Происходит через заданный интервал времени

методы:

SetInProcess(AInProcess:byte) Установка статуса игры. Использование данного метода, а не непосредственный доступ к полю гарантирует установку только допустимых значений и своевременное изменение строки статуса в основной форме
LogicalError(ErrMsg:PChar) Вызывается при необходимости сообщить пользователю о произошедшей логической ошибке
InitCurrentFigure; Создание текущей фигуры случайным образом. Указатель на текущую фигуру остается в fCurrentFigure
Start Запуск игры или продолжение после приостановки
Stop Остановка игры
Pause Приостановка игры
NotActive:boolean Проверяет не находиться ли игра в состоянии игры, если да выдается сообщение
IsGoing(ShowMsg:boolean=true) Проверяет не активна ли игра. если нет и ShowMsg то выдается сообщение
ClearAll Вызов очистки игрового поля, обнуление fFigNum, fDeletedLines, fTimerClicks
GetTextStatus:string Получение статистики по игре в текстовом виде для вывода на экран
RotateAgainst Проверка активна ли игра и есть ли текущая фигура, если да то происходит поворот фигуры
RotateAlong
MoveLeft Проверка активна ли игра и есть ли текущая фигура, если да то происходит сдвиг фигуры
MoveRight
GetInfo Получения статуса игры в текстовом виде для отображения в строке статуса
DoFall Реализация метода падения (вызывается по клавиши вниз)
StartQuickFall(Quick:boolean=true) Если Quick то установка режима ускоренного падения, нет возврат к обычному

* Основными процедурами являются: TimerTick, DoFall

TimerTick Реакцию на событие от таймера можно представить следующим образом: Проверить есть текущая фигура Assigned(fCurrentFigure) Если есть проверить может ли она сдвинуться на клетку вниз fCurrentFigure.CanDown Если может, то сдвинуть fCurrentFigure.Down Иначе обрабатываем ситуацию упал (для бомб падение предполагает очистку других ячеек поля) fCurrentFigure.Falled Если нет, то проверяется заполненность хотя бы одной из линий поля полностью Если таковая находится то она удаляется fField.DelFullLine Иначе проверяется заполненность ячеек из вернего уровня fField.IsOverflow Если хотя бы одна занята - игра заканчивается Иначе создается очередная фигура случайным образом 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:TField) Реализует фактическое перемещение фигуры вправо или влево.
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:boolean) Обеспечивает получение фигуры-близнеца. Т.е той фигуры, которая получается после поворота данной под углом 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<AField.FieldCountX-RightLimit-1) и проверить не попадают ли в случае перемещения клетки данной фигуры на клетки другой фигуры 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