Программирование и комп-ры

Помощь в обучении программированию


Наше предложение для тех, кто хочет научиться программировать на Delphi,
изучая исходники других программ!
Вы можете бесплатно скачать саму игру (ТЕТРИС), но обязаны заплатить 5
долларов за исходник программы. Вы получаете полный текст программы на
Delphi и комментарии к ней! Всего за 5 долларов вы сможете изучить текст
самой известной программы и понять, как создаются игры, такие как Tetris!
Мы дадим вам математический алгоритм программы! Теперь вы станете намного
опытнее и сможете самостоятельно создавать программы и зарабатывать на этом
деньги как в реальной жизни, так и в интернете!
Избегайте своих ошибок, мы научились правильно программировать и поможем

научить этому вас!
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     |список действий     |Содержит перечень действий (actXXXX)      |
|                   |(TActionList*)      |используемый программой                   |
|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  |Установка в ячейку (x,y) значения Cell. Т.е.        |
|Cell:TFieldCell)              |логическое получение занятой ячейки                 |
|GetAtCell (x,y:integer)       |Получение значения из ячейки (x,y)                  |
|ClearAt                       |Определяет свободна ли ячейка (x,y) логически и если|
|(x,y:integer;CurCell:PFieldCel|указан CurCell то ячейка считается свободной даже   |
|l=nil)                        |когда там находится значения совпадающее с CurCell. |
|DelFullLine                   |Удаление одной из полностью занятых строк.          |
|IsOverflow                    |Проверка на переполнение. Переполненным полем       |
|                              |считается поле для которого хотя бы одна ячейка     |
|                              |верхних ReservedLines занята                        |
|DeleteFigure(FigureNum:integer|Удаление с поля фигуры с номером FigureNum.         |
|)                             |Используется при падении Бомбы-2                    |
|DrawToImage                   |Прорисовка текущего состояния поля                  |

Игра может находится в одном из логических состояний:
|gmNothing   |Игра не начата                                                        |
|gmActive=1  |Игра идет                                                             |
|gmSuspend=2 |Игра приостановлена                                                   |
|gmEnded=3   |Игра завершена                                                        |
|gmAborted=4 |Игра прервана пользователем                                           |
|gmGraphicErr|Игра завершена с ошибкой во время рисования                           |
|or          |                                                                      |
|gmCreateFigu|Игра завершена с ошибкой создания фигуры                              |
|reError     |                                                                      |

TTetrisGame -  класс  реализующий  алгоритм  игры.  Включает  в  себя  такие
объекты, как:
|fFiguresEnum       |управление набором  |Реализует хранение и доступ к массиву     |
|                   |фигур               |существующих фигур                        |
|                   |(TFigureEnumManager)|                                          |
|fField             |игровое поле        |Предназначено для хранения указателя на   |
|                   |(TField)            |объект игровое поле                       |
|fCurrentFigure     |текущая фигура      |Предназначено для хранения указателя на   |
|                   |(TBaseFigure)       |текущую фигуру и проведения с ней всяких  |
|                   |                    |операций типа вращения                    |
|fTimer             |таймер (TTimer*)    |Предназначен для появления событий в      |
|                   |                    |программе через определенный промежуток   |
|                   |                    |времени, чтобы реализовывать перемещение  |
|                   |                    |фигуры                                    |


поля:
|fQuickCoef         |коэффициент         |Предназначено для хранения коэффициента,  |
|                   |ускорения (integer) |который используется при ускоренном       |
|                   |                    |падении фигуры при нажатии клавиши        |
|fInProcess         |статус игры (byte)  |Предназначено для хранения статуса игры   |
|fFigNum            |количество фигур    |Предназначено для хранения числа          |
|                   |(integer)           |выпущенных фигур и отображении в          |
|                   |                    |статистике                                |
|fTimerClicks       |время игры (integer)|Предназначено для хранения времени игры и |
|                   |                    |отображении в статистике                  |
|fDeletedLines      |число удаленных     |Предназначено для хранения числа удаленных|
|                   |линий (integer)     |линий и отображении в статистике          |
|fOldTimer          |интервал таймера    |Интервал таймера до ускорения или 0 если  |
|                   |(integer)           |таймер находится не в ускоренном режиме   |


события:
|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=t|Если Quick то установка режима ускоренного падения, |
|rue)                          |нет возврат к обычному                              |


* Основными процедурами являются: 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: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

смотреть на рефераты похожие на "Помощь в обучении программированию "