Реферат: Помощь в обучении программированию
Наше предложение для тех, кто хочет научитьсяпрограммировать на Delphi, изучая исходники других программ!
<span Times New Roman",«serif»">Выможете бесплатно скачать саму игру (ТЕТРИС), но обязаны заплатить 5 долларов заисходник программы. Вы получаете полный текст программы на Delphi и комментариик ней! Всего за 5 долларов вы сможете изучить текст самой известной программы ипонять, как создаются игры, такие как Tetris!
<span Times New Roman",«serif»">Мы дадим вамматематический алгоритм программы! Теперь вы станете намного опытнее и сможетесамостоятельно создавать программы и зарабатывать на этом деньги как в реальнойжизни, так и в интернете!
<span Times New Roman",«serif»">Избегайтесвоих ошибок, мы научились правильно программировать и поможем
научить этому вас!
<span Times New Roman",«serif»; mso-ansi-language:EN-US">www.tetriswithsource.com
Описание модулей
TetrisP — Основной файл проекта
Tetris00 — Модуль содержит основную форму проекта (TMainForm).Производит связку между нажатиями горячих клавиш и кнопок панели управления свызовом процедур обработки соответствующих событий находящихся в модуле Tetris02 ивызовам процедур прорисовки поля.
Tetris01 — Модуль содержит определение ячейки поля (TFieldCell), какзаписи о цвете и номере отображаемой в ячейке текстуры. А также реализациюигрового поля (класс TField) — позволяющего проводить отрисовку и простейшиеоперации над игровым полем.
Tetris02 — Модульсодержит реализацию алгоритма игры (класс TTetrisGame),обрабатывает события от таймера, ведет статистику (время игры, количествовыпущенных фигур, удаленных линий). Создает фигуру случайным образом фигурукоторая будет активной в течении следующего промежутка времени и производит сней непосредственное взаимодействие. Отлавливает все логические ошибкипроисходящие во время игры и связанные например с попыткой запустить ужеактивную игру.
Tetris03 — Модуль содержит методы по работе со всеми фигурами используемыми в проекте иучитывает все их особенности реализации. (классы фигур TXXXXFigure).
Tetris04 — Модуль содержит определение констант используемых в программе и процедуругенерации цвета случайным образом с учетом того что цвет не должен будет сливатьсяс пустой ячейкой поля.
Tetris05 — Модуль содержит форму настроек (TOptionsForm) позволяющую отображать списоксуществующих фигур читать и устанавливать их свойство Enabled.
Tetris06 — Модуль содержит определение структуры (TFigureInfo) дляхранения необходимой информации о существующей фигуре, массив записей этоготипа с описанием всех фигур проекта (для возможности отображения в форменастроек и выбора фигуры случайным образом), а также методы по доступу к этимданным
Tetris07 — Модуль обеспечивает многоязыковую поддержку. Он содержит в себе определениевсех строковых констант используемых в сообщениях проекта и позволяет создаватьисполнимый файл с сообщениями как на английском так и на русском языке.
Описание классов
TMainForm — классосновной формы проекта. Включает в себя такие объекты, как
MainToolBar
панель инструментов (TToolBar*)
Расположена на форме в правой части и содержит в себе набор кнопок (btnXXXX)
btnXXXX
кнопки (TButton*)
Расположены на панели инструментов и предназначены для удобного вызова заданных процедур
MainImageList
списокизображений(TImageList*)
Содержит изображения иконок используемых кнопками (btnXXXX)
MainActionList
списокдействий(TActionList*)
Содержит перечень действий (actXXXX) используемый программой
actXXXX
действия (TAction*)
Предназначена связи кнопок (btnXXXX), горячих клавиш и вызова заданных процедур
MainPanel
панель(TPanel*)
Расположена в верхней части формы и предназначена для выводы статистической инфорамции (время, количество фигур, количество удаленных линий)в процессе игры
MainImage
изображение(TImage)*
Расположено в центральной части формы и предназначена для показа игрового поля на экране. (Но не его прорисовку!)
MainStatusBar
строкасостояния(TStatusBar)*
Расположена в нижней части основной формы, предназначена для отображения статуса игры (активна, приостановлена, закончена и т.д.) и подсказки для кнопок над которыми находится манипулятор мышь
fReg
реестр(TRegistryDef*)
Предназначена для работы с реестром — сохранением настроек программы между сеансами работы
fField
игровое поле (TField)
Реализует хранение логической информации о состоянии поля и его прорисовку т.е. вывод в изображение (TImage)
fOptionsForm
форманастроек(TOptionsForm)
Предназначена для возможности выбора фигур используемых в программе
fGame
игра(TTetrisGame)
Реализует алгоритм игры
(* — помечены стандартныеобъекты Delphi)
TFieldCell — запись содержащая информацию об каждой ячейке игрового поля.
Color
longint
Цвет в ячейке если не используется текстура
FigureNum
integer
Номер фигуры которая попадает в данную ячейку. 0 — если фигуры нет
TextureNum
smallint
Номер текстуры в ячейке. Отрицательные числа соответствуют текстурам бомб
TField — классигровое поле. Включает в себя такие объекты, как
fBomb
Список объектов (TObjectList)
Предназначен для хранения списка текстур бомб
fTexture
Список объектов (TObjectList)
Предназначен для хранения списка текстур непустых клеток
fImage
Изображение (TImage)
Предназначено для хранения указателя на изображение основной формы
fFieldMatrix
Матрица(TFieldMatrix)
Предназначена для хранения массива с данными типа TFieldCellо клетках.
поля:
fFieldSize
Размер ячейки (integer)
Хранит размер ячейки поля в пикселах
свойства:
FieldCountX
ЧислоячеекпоX (integer)
Позволяет определить размер поля в количестве ячеек вдоль X
FieldCountY
Число ячеек по Y(integer)
Позволяет определить размер поля приспособленный для игры в количестве ячеек вдоль Y*
FieldRealCountY
Число ячеек по Y(integer)
Позволяет определить фактический размер поля в количестве ячеек вдоль Y
FieldVisibleCountY
Число ячеек по Y(integer)
Позволяет определить видимый размер поля в количестве ячеек вдоль Y
* Фактически размерностьмассива по Xсовпадает с тем что отображается на экране, по Yситуация другая. Фактически в памяти поле представлено по Yсбольшим размером (+ReservedLines). Это вызвано необходимостью хранить данные офигуре которая только начала падать и находится вне пределов видимости в вернихстроках и тем что именно по занятости хотя бы одной ячейки верхних ReservedLinesстрокопределяется окончена игра или нет. Фактический размер определяется FieldRealCountY,допустимый для нахождения фигур FieldCountY. В то же время на экране можетотображаться любое число строк от 1 до FieldRealCountY.Поэтому присутствует еще одно свойство FieldVisibleCountY,которое как раз и определяет сколько строк видно пользователю. В частности этотмомент использовался при отладке — когда на экране было все поле целиком,фигура начинала падать не с самого верха и игра заканчивалась когда фигуразастревала на верхних ReservedLinesстроках, а не обязательнодостигнув верхней границы.
методы:
ClearAll
Очистка игрового поля, путем занесения 0 во все ячейки
ClearCell (x,y:integer)
Очистка ячейки (x,y) путем занесения 0 в эту ячейку
SetAtCell (x,y:integer;const Cell:TFieldCell)
Установка в ячейку (x,y) значения Cell. Т.е. логическое получение занятой ячейки
GetAtCell (x,y:integer)
Получение значения из ячейки (x,y)
ClearAt (x,y:integer;CurCell:PFieldCell=nil)
Определяет свободна ли ячейка (x,y) логически и если указан CurCellто ячейка считается свободной даже когда там находится значения совпадающее с CurCell.
DelFullLine
Удаление одной из полностью занятых строк.
IsOverflow
Проверка на переполнение. Переполненным полем считается поле для которого хотя бы одна ячейка верхних ReservedLinesзанята
DeleteFigure(FigureNum:integer)
Удаление с поля фигуры с номером FigureNum. Используется при падении Бомбы-2
DrawToImage
Прорисовка текущего состояния поля
Игра может находится в одном излогических состояний:
gmNothing
Игра не начата
gmActive=1
Игра идет
gmSuspend=2
Игра приостановлена
gmEnded=3
Игра завершена
gmAborted=4
Игра прервана пользователем
gmGraphicError
Игра завершена с ошибкой во время рисования
gmCreateFigureError
Игра завершена с ошибкой создания фигуры
TTetrisGame — класс реализующий алгоритм игры. Включает в себя такиеобъекты, как:
fFiguresEnum
управление набором фигур (TFigureEnumManager)
Реализует хранение и доступ к массиву существующих фигур
fField
игровое поле (TField)
Предназначено для хранения указателя на объект игровое поле
fCurrentFigure
текущая фигура (TBaseFigure)
Предназначено для хранения указателя на текущую фигуру и проведения с ней всяких операций типа вращения
fTimer
таймер (TTimer*)
Предназначен для появления событий в программе через определенный промежуток времени, чтобы реализовывать перемещение фигуры
поля:
fQuickCoef
коэффициент ускорения (integer)
Предназначено для хранения коэффициента, который используется при ускоренном падении фигуры при нажатии клавиши
fInProcess
статус игры (byte)
Предназначено для хранения статуса игры
fFigNum
количество фигур (integer)
Предназначено для хранения числа выпущенных фигур и отображении в статистике
fTimerClicks
времяигры(integer)
Предназначено для хранения времени игры и отображении в статистике
fDeletedLines
число удаленных линий (integer)
Предназначено для хранения числа удаленных линий и отображении в статистике
fOldTimer
интервал таймера (integer)
Интервал таймера до ускорения или 0 если таймер находится не в ускоренном режиме
события:
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
Реакцию на событие от пользователя «поворот фигуры» можно представить следующим образом:
Проверить идет ли игра и есть текущая фигура IsGoingandAssigned(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
<img src="/cache/referats/9553/image002.gif" align=«left» hspace=«12» v:shapes="_x0000_s1026"><div v:shape="_x0000_s1027">
Базовая точка
Перекрытие виртуальных методовдля реализации конкретной фигуры (например TThreeCellFigure23) осуществляетсяследующим образом:
AfterInit
LeftLimit:=1
DownLimit:=1
Установка значений отступов для данной фигуры. влево на единицу и вниз на единицу
CheckEach
Proc(Xabs,Yabs-1)and Proc(Xabs,Yabs)and
Proc(Xabs-1,Yabs)
Вызов процедуры Procдля конретных ячеек. Обычно вызываются процедуры для этих ячеек по рисованию, стиранию, проверки отсутствия в данной ячейке другой фигуры.
Для данной фигуры ячейками относящимися к данной фигуре являются ячейки расположенные относительно базовой
1) на одну ниже по Y,
2) в том же месте что и базовая
3) на одну левее по X
GetTwinFigure
if AlongClock then
GetTwinFigure:=TThreeCellFigure30
else
GetTwinFigure:=TThreeCellFigure12
Если вращение вдоль часовой стрелки то фигурой-близнецом будет TThreeCellFigure30 <img src="/cache/referats/9553/image004.jpg" v:shapes="_x0000_i1025">
Если против часовой то TThreeCellFigure12 <img src="/cache/referats/9553/image006.jpg" v:shapes="_x0000_i1026">
SetBaseCell
Cell.Color:=RandomColors[25];
Cell.TextureNum:=26
Установка определенных значений для текста и текстуры фигуры данного типа
Для остальных фигур перекрытиеосуществляется аналогично.
TOptionsForm — классформы настроек. Включает в себя такие объекты как:
MainPageControl;
Закладки(TPageControl*)
Расположен на форме настроек, включает в себя закладки (tabFigures)
tabFigures
Закладка (TTabSheet*)
Расположена на MainPageControl, содержит на себе (FiguresListView)
FiguresListView
Просмотр списков (TListView*)
Предназначен для отображения списка фигур используемых в проекте и расстановки им свойства разрешения использования при генерации
FiguresImageList
списокизображений(TImageList*)
Содержит список изображений используемый списком (FiguresListView) для отображения пиктограмм фигур
(* — помечены стандартныеобъекты Delphi)
методы:
InitData
Помещает данные о разрешенных фигурах в список, отображаемый на форме
DoneData
Берет данные о разрешенных фигурах из списка, отображаемого на форме
TFigureInfo — запись содержащая информацию о фигуре используемой при случайной генерации
Fig
TFigure
Тип одной из существующих фигур
Enabled
Boolean
Определяет разрешено ли создание данной фигуры
FigureHint
string
Наименование фигуры, для отображения в форме настроек. Если пусто фигура самостоятельно не отображется, а считается что она является близнецом для описанной выше
Icon
integer
Индекс иконки в списке иконок для отображения в форме настроек
TFigureEnumManager — классуправляющий массивом записей типа TFigureInfo. Включает в себя следующиеметоды:
GetExistingFigure(Index:integer)
Получение информации об определенной фигуре
LoadFiguresInfo(Reg:TRegistryDef)
Запись в реестр (registry) для сохранения настроек между сеансами работы
SaveFiguresInfo(Reg:TRegistryDef)
Чтение из реестра
GetIndexByName(const Name:ShortString)
Получение индекса фигуры в массиве по ее имени
GetAmount
Получение общего числа фигур в массиве
CreateRandomFigure
Получение фигуры случайным образом