Игра Tetris
Игра Tetris
МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ им. Н.Э. БАУМАНА КАЛУЖСКИЙ ФИЛИАЛ КАФЕДРА ЭИУ2-КФ «КОМПЬЮТЕРНЫЕ СИСТЕМЫ И СЕТИ» КУРСОВАЯ РАБОТА по курсу “Технология программирования” «Игра Tetris» ВведениеИгры - непременная составляющая любой человеческой культуры. Слово «игра» мы прилагаем почти ко всякому детскому занятию. Посредством игры наиболее интенсивно развивается целостное восприятие окружающего мира, наглядно-образное мышление, творческое воображение. Поэтому кроме программ, которые облегчают людям работу, программисты придумали увлекательное развлечение-компьютерные игры. Сначала в эти игры играли только они сами, но очень скоро их эстафету приняли дети и взрослые по всему миру. Сейчас уже трудно найти человека, имеющего компьютер и ни разу не игравшего в компьютерные игры. В 1977г. Atari выпустила 2600 VCS, первую игровую приставку с несколькими играми. Ее технические характеристики по нынешним временам могут вызвать только улыбку, но по тем временам два килобайта ПЗУ и 128 байт ОЗУ были вполне достаточны, чтобы обеспечить немалый коммерческий успех. А дальше все понеслось с невероятной скоростью, как лавина по склону горы. В 1977 году фирма Apple начала продажи Apple II, в 1978 знаменитейшая игра Space Invaders родилась все в той же японской фирме Taito, а в 1979 разработчиками из Atari основана фирма Activision. Тогда же появилась Atari 800, где впервые был задействован восьмибитный процессор.Восьмидесятые, а точнее, самое их начало, очень и очень быстро показали, что время компьютерных игр пришло всерьез и надолго. Phillips, подключившись ко всеобщей гонке, создает Odyssey2, Mattel выпускает Intellivision, хотя и с лучшей графиков, но весьма жутким устройством управления. Namco изобретает игру, дожившую до наших дней практически без изменений: великий Pac-Man, и по сей день регулярно реализуемый на разных платформах и в разных видах. Индустрия в эти годы благополучно взяла крупный рубеж: больше одного миллиарда долларов (а если пересчитать эту цифру на современные доллары, получится около двух с половиной миллиардов). Продано было около 300000 приставок и игральных автоматов. Atari не стояла на месте и изобрела Asteroids, да и в остальных жанрах застоя не намечалось: в приключенческих играх родился классический текстовый квест от Infocom под названием Zork (впоследствии переросший в серию), да и первая игра из серии Ultima вышла все в том же 1980... А на следующий год бум достиг вообще невообразимого размаха. Продаж уже больше шести миллиардов долларов, игры так и сыпались: Donkey Kong от Nintendo, Galaxian, Centipede, Tempest, сестричка Pac-Man'а по имени Ms.Pac-Man. И все в том же 1981 произошло не слишком заметное поначалу, зато впоследствии полностью перевернувшее мир, событие: IBM впервые представила публике IBM PC. И понеслось... Да как понеслось. Моментально стали образовываться фирмы, ориентированные исключительно на домашние компьютеры: Sierra On-Line, Broderbund, BudgeCo, Electronic Arts. А в 1983 году всех ждал суровейший кризис, продлившийся несколько лет. Фирма Mattel потеряла на Intellivision 225 миллионов долларов, столько, сколько ей удалось заработать за все предыдущие четыре года. Atari тоже столкнулась с серьезными финансовыми проблемами. Coleco вообще рухнула. К 1984 году общий объем игровой индустрии составлял всего около 800 миллионов долларов. Правда, несмотря на грустные условия, рождались и шедевры, ставшие чуть позднее основой для нового подъема. Например, Commodore 64, несложный домашний компьютер, проданный в количестве около 20 миллионов штук. А все в том же, богатом на сенсации, 1984 году Apple впервые представила народу Macintosh, и за первые шесть месяцев продала сто тысяч штук. Sierra On-Line выпустила первую игру из серии King's Quest, сохранившей популярность и до сих пор. 1986 год до сих пор многие вспоминают с теплым, хотя и грустным, чувством: именно тогда появилась "подружка" (Amiga на испанском языке), выпущенная фирмой Commodore. Замечательная машинка, разработанная инженером из Atari Джеем Майнером (Jay Miner), была удивительно мощной и напичканной новаторскими идеями, но неудачный маркетинг способен похоронить любой шедевр, и Amiga так и не осилила дорогу в широкие массы. Правда, в последнее время ходят слухи об оживлении этой марки, но получится ли что-нибудь - пока неясно. Время шло, компьютеры потихоньку становились все мощнее, игры все красивее, где-то года с 1987 на IBM PC стали появляться игры, похожие на сегодняшние, как раз тогда начал широко применяться видеоадаптер VGA, а потом и SVGA, и показ 256 цветов вместо 16 очень сильно поднял качество графики. Хорошо это было? Наверное, да, хотя, откровенно говоря, после выхода Тетриса в 1988 году погоня за интересностью игр явно ослабела, заменившись погоней за зрелищностью. Надо еще, пожалуй, упомянть выпуск в 1989 году карманной компьютерной игры Gameboy, и рассказ о древних годах, заложивших фундамент того, что мы сегодня зовем индустрией компьютерных игр, можно считать законченным, тем более, что с начала девяностых почти одновременно "пошел" бум и в играх для PC и в приставках. К примеру, одна только фирма Nintendo в 1992 году продала товара на 7 миллиардов долларов (из них 4,7 миллиардов только в США), и получила большую прибыль, чем все американские кино- и телестудии вместе взятые. Увы, не назвать и всех эпохальных игр, они, видимо, рано или поздно получат свои страницы на сервере музея игр, например, самая-самая-самая игра всех времен на PC - знаменитый Myst, да и шедевр под названием DOOM... Появился мультиплеер, поддержка Internet, онлайновые миры - столько всего, что в небольшое введение все не поместится. Да и не надо, наверное: дело все-таки не в том, во что именно мы играем, а в том, зачем и почему мы это делаем... В настоящее время существует несколько разновидностей компьютерных игр. Данная курсовая работа выполняется в рамках предмета «Технология программирования» и в связи с этим хотелось бы в нескольких словах (из-за ограничения по объему) отметить важность данного предмета в повседневной жизни. Если ещё в начале прошлого века присутствовали консерватизм и недоверие к техническим новшествам, то в наши дни мы только радуемся техническим новинкам, от мобильных телефонов до стиральных машин. Сейчас уже вовсю применяется «безлюдная технология»-замена живого труда и относительно простых механизмов сложнейшими автоматами. Сразу же хочется предостеречь от узкого толкования слова «технология» как способа организации производства на заводах. Конечно, прогресс в технологии производства облегчает труд и повышает его производительность. Но в рамках данной курсовой работы нас интересует технология научного поиска и эксперимента, технология проектирования и, естественно, проблема взаимодействия человека и ЭВМ. 1. Исследовательская часть1.1 Постановка задачиВ данной курсовой работе требуется написать программу, реализующую графическое решение логической задачи «Волк, Коза и капуста, которые должны переправиться на другой берег, а вплавь они этого сделать не могут, так как капуста может плыть только по течению, и они должны прибегнуть к помощи лодочника». 1.2 Обзор аналогичных продуктовТщательный анализ всемирной сети Internet на предмет обнаружения аналогичных продуктов не дал никаких результатов, то же самое показало исследование магазинов с компьютерными играми, что показывает уникальность и неоспоримое преимущество нашей игры перед другими программными продуктами. Ведь в настоящее время рынок компьютерных игр заполнен предложениями иностранных фирм, которые навязывают пользователям свою культуру и восприятие мира, поэтому родители всегда стараются найти продукт отечественного производства, желательно знакомый им с детства, и наша игра точно нашла бы отклик в их сердцах. 1.3 Описание игрыДанная игра графически реализует всем известную задачу по перемещению волка, козы и капусты с одного на другой берег. Её правила очень просты: одновременно на одном берегу без присмотра лодочника не может находиться волк с козой и коза с капустой. В лодке, не считая лодочника, может находиться только волк, коза или капуста. Как только волк, коза и капуста оказались на другом берегу, задача является выполненной. 1.4 Описание программы1. Общие сведения.Программа называется "TETRIS", является классической версией отечественной игры ТЕТРИС.[1] Программа написана в интегрированной среде Borland Delphi 7. Для её компиляции требуется транслятор с этого языка и ОС Windows 95/NT. Техническая документация написана с использованием программного продукта Microsoft Word XP. 2. Используемые технические средства. Программа была написана и откомпилирована на компьютере со следующей конфигурацией Pentim III 500/128Mb RAM/32Mb VRAM/MS Windows 98. 3. Входные данные. Клавиши: "RIGHT", "LEFT", "UP" или "ESC" - вводимые в процессе игры в режиме реального времени. Данные переменные организованы в виде символьных переменных. 4. Выходные данные. Информация, выводимая на экран в графическом режиме: рисунок стакана, падающие и лежащие на дне фигуры, поле с выводом следующей фигуры. Все организовано в виде двумерных массивов. 5.Выводы по задаче. В результате использования программы не было ошибок в работе программы. Это позволяет сделать вывод о соответствии алгоритма постановке задачи. Выдача информации наглядна: на экране постоянно отображена игровая ситуация. Текст программы удобочитаем, т.к. содержит комментарии, поясняющие суть той или иной ситуации. 2. Описание программы2.1 Решение поставленной задачиГлавной проблемой в решении этой задачи являлся вывод графики в Паскале. Для построения изображений на экране используется система координат. Отсчет начинается от верхнего левого угла экрана, который имеет координаты (0,0). Значение Х (столбец) увеличивается слева направо, значение Y (строка) увеличивается сверху вниз. Чтобы строить изображения, необходимо указывать точку начала вывода. В текстовых режимах эту точку указывает курсор, который присутствует на экране. В графических режимах видимого курсора нет, но есть невидимый текущий указатель CP (Current Pointer). Фактически это тот же курсор, но он невидим. Изображение фона мы получили из Bmp-файла, из таких же файлов взят, курсор мыши и элементы интерфейса. Теперь необходимо правильно считать Bmp-файлы и перевернуть картинку «с головы на ноги». По решению разработчиков формат Bmp-файла не привязан к конкретной аппаратной платформе. Этот файл состоит из четырех частей: заголовка, информационного заголовка, таблицы цветов (палитры) и данных изображения. Если в файле хранится изображение с глубиной цвета 24 бита (16 млн. цветов), то таблица цветов может отсутствовать, однако в нашем, 256-цветном случае она есть. Структура каждой из частей файла, хранящего 256-цветное изображение, дана в таблице 1. |
Структура Bmp-файла | | Имя | Длина | Смещение | Описание | | Заголовок файла (BitMapFileHeader) | | Type | 2 | 0 | Сигнатура "BM" | | Size | 4 | 2 | Размер файла | | Reserved 1 | 2 | 6 | Зарезервировано | | Reserved 2 | 2 | 8 | Зарезервировано | | OffsetBits | 4 | 10 | Смещение изображения от начала файла | | Информационный заголовок (BitMapInfoHeader) | | Size | 4 | 14 | Длина заголовка | | Width | 4 | 18 | Ширина изображения, точки | | Height | 4 | 22 | Высота изображения, точки | | Planes | 2 | 26 | Число плоскостей | | BitCount | 2 | 28 | Глубина цвета, бит на точку | | Compression | 4 | 30 | Тип компрессии (0 - несжатое изображение) | | SizeImage | 4 | 34 | Размер изображения, байт | | XpelsPerMeter | 4 | 38 | Горизонтальное разрешение, точки на метр | | YpelsPerMeter | 4 | 42 | Вертикальное разрешение, точки на метр | | ColorsUsed | 4 | 46 | Число используемых цветов (0 - максимально возможное для данной глубины цвета) | | ColorsImportant | 4 | 50 | Число основных цветов | | Таблица цветов (палитра) (ColorTable) | | | ColorTable | 1024 | 54 | 256 элементов по 4 байта | | Данные изображения (BitMap Array) | | | Image | Size | 1078 | Изображение, записанное по строкам слева направо и снизу вверх | | |
Заголовок файла начинается с сигнатуры «BM», а затем идет длина файла, выраженная в байтах. Следующие 4 байта зарезервированы для дальнейших расширений формата, а заканчивается этот заголовок смещением от начала файла до записанных в нем данных изображения. При 256 цветах это смещение составляет 1078. Информационный заголовок начинается с собственной длины (она может изменяться, но для 256-цветного файла составляет 40 байт) и содержит размеры изображения, разрешение, характеристики представления цвета и другие параметры. Ширина и высота изображения задаются в точках растра и пояснений, пожалуй, не требуют. Количество плоскостей могло применяться в файлах, имеющих небольшую глубину цвета. При числе цветов 256 и больше оно всегда равно 1. Глубина цвета считается важнейшей характеристикой способа представления цвета в файле и измеряется в битах на точку. В данном случае она равна 8. Компрессия. В Bmp-файлах обычно не используется, но поле в заголовке для нее предусмотрено. Обычно она равна 0, и это означает, что изображение не сжато. Размер изображения -- количество байт памяти, требующихся для хранения этого изображения, не считая данных палитры. Горизонтальное и вертикальное разрешения измеряются в точках растра на метр. Они особенно важны для сохранения масштаба отсканированных картинок. Изображения, созданные с помощью графических редакторов, как правило, имеют в этих полях нули. Число цветов позволяет сократить размер таблицы палитры, если в изображении реально присутствует меньше цветов, чем это допускает выбранная глубина цвета. Однако на практике такие файлы почти не встречаются. Если число цветов принимает значение, максимально допустимое глубиной цвета, например 256 цветов при 8 битах, поле обнуляют. Число основных цветов -- идет с начала палитры, и его желательно выводить без искажений. Данное поле бывает важно тогда, когда максимальное число цветов дисплея было меньше, чем в палитре Bmp-файла. При разработке формата, очевидно, принималось, что наиболее часто встречающиеся цвета будут располагаться в начале таблицы. Сейчас этого требования практически не придерживаются, т. е. цвета не упорядочиваются по частоте, с которой они встречаются в файле. Это очень важно, поскольку палитры двух разных файлов, даже составленных из одних и тех же цветов, содержали бы их (цвета) в разном порядке, что могло существенно осложнить одновременный вывод таких изображений на экран. За информационным заголовком следует таблица цветов, представляющая собой массив из 256 (по числу цветов) 4-байтовых полей. Каждое поле соответствует своему цвету в палитре, а три байта из четырех -- компонентам синей, зеленой и красной составляющих для этого цвета. Последний, самый старший байт каждого поля зарезервирован и равен 0. После таблицы цветов находятся данные изображения, которое по строкам растра записано снизу вверх, а внутри строки -- слева направо. Так как на некоторых платформах невозможно считать единицу данных, которая меньше 4 байт, длина каждой строки выровнена на границу в 4 байта, т. е. при длине строки, некратной четырем, она дополняется нулями. Это обстоятельство обязательно надо учитывать при считывании файла, хотя, возможно, лучше заранее позаботиться, чтобы горизонтальные размеры всех изображений были кратны 4. Как мы уже говорили, формат файла был разработан универсальным для различных платформ, поэтому нет ничего удивительного в том, что цвета палитры хранятся в нем иначе, чем принято для VGA. Во время выполнения процедуры чтения производится необходимая перекодировка. 2.2 Алгоритм решения задачи 2.3 Структура программыПрограмма состоит из 27 файлов. Основным файлом является файл Igra.pas к нему подключены остальные файлы, к которым в свою очередь подключены другие. Проще это подключение представить на графической схеме (рис.3). 2.4 Процедуры и функцииfunction Clock {время, прошедшее с запуска программы в 1/18 с}procedure ResetTime; {сброс всех показаний времени в 0}function GetFPS {текущее число кадров в секунду необходимо вызывать 1 раз в каждом кадре}function Clock {время, прошедшее с запуска программы в 1/18 c} procedure ResetTime; {сброс всех показаний времени в 0} function GetFPS : single; {текущее число кадров в секунду} procedure SetTextParm {установка параметров вывода текста} {color- цвет текста} {bkcolor- цвет фона} {typetext = 0 - прозрачный фон} {typetext = 1 - непрозрачный фон } procedure GetTextParm (var color,bkcolor,typetext:byte); { запрос текущих параметров } procedure PutText (x,y:word;text:string); {вывод текста по координатам x,y (верхний левый угол)} procedure PutChar (x,y:word;chr:char); {вывод символа по координатам x,y (верхний левый угол)} procedure PutPixel (x,y:word;c:byte); {вывод точки} functiongetpixel (x,y:word):byte; {запрос цвета точки} procedure PutPixel (x,y:word;c:byte); {вывод точки} function getpixel (x,y:word):byte; {запрос цвета точки} procedure PutPixel (x,y:word;c:byte); {вывод точки} function getpixel (x,y:word):byte; {запрос цвета точки} procedure GetBuffer (Sprite:SpriteType); {сохранение фона под спрайтом в буфере} procedure PutBuffer (Sprite:SpriteType); {восстановление фона} procedure PutSprite (Sprite:SpriteType); {вывод спрайта на экран} procedure CreateSprite (s:string; x,y,dx, dy:integer; var Sprite:SpriteType); {"создание" спрайта} procedure DestroySprite (Sprite:SpriteType); {"уничтожение" спрайта} procedure CalcSpritePosition (var Sprite:SpriteType); {вычисление новых координат спрайта} procedure PutBackground (s:string); {создание фона на экране} procedure CreateScreenBuffer; {создание экранного буфера} procedure DestroyScreenBuffer; {уничтожение экранного буфера} procedure ScreenBufferToScreen; {отображение буфера на экран} procedure CreateScreenBuffer; {создание экранного буфера} procedure DestroyScreenBuffer; {уничтожение экранного буфера} procedure ScreenBufferToScreen; {отображение буфера на экран} procedure GetBuffer (Sprite:SpriteType); {сохранение фона под спрайтом в буфере} procedure PutBuffer (Sprite:SpriteType); {восстановление фона} procedure PutSprite (Sprite:SpriteType); {вывод спрайта на экран} procedure CreateSprite {"создание" спрайта} procedure DestroySprite (Sprite:SpriteType); {"уничтожение" спрайта} procedure CalcSpritePosition (var Sprite:SpriteType); procedure PutBackground (s:string); {создание фона на экране} procedure SetPal (var pal:byte;nbegpal,lenpal:integer); {установка 256-цветной палитры} procedure GetPal (var pal:byte;nbegpal,lenpal:integer); {чтение 256-цветной палитры} procedure WaitVerticalRetrace; {ожидание вертикально обратного хода луча} procedure BlackPal; {установка "черной" палитры} procedure FadeOut (p:array of byte); {плавное гашение палитры} procedure FadeIn (p:array of byte); {плавная установка палитры} procedure SetPal (var pal:byte;nbegpal,lenpal:integer); {установка 256-цветной палитры} procedure GetPal (var pal:byte;nbegpal,lenpal:integer); {чтение 256-цветной палитры} procedure WaitVerticalRetrace; {ожидание вертикально обратного хода луча} procedure BlackPal; {установка "черной" палитры} procedure FadeIn (p:array of byte); {плавная установка палитры} procedure FadeOut (p:array of byte); {плавное гашение палитры} Function IsMouse: Boolean; {Возвращает TRUE, если мышь доступна} Function InitMouse: Boolean; {Инициация мыши} Procedure SetMousePage (Page: Byte); {Устанавливает страницу для указателя мыши} Function GetMousePage: Byte; {Возвращает номер страницы с указателем} Procedure SetStepToPixel (Hor,Ver: Integer); {Устанавливает чувствительность мыши} Procedure GetStepToPixel (var Hor,Ver: Integer); {Возвращает чувствительность мыши} Procedure SetDoubleSpeed (Speed: Word); {Устанавливает порог удвоения скорости перемещения указателя} Function GetDoubleSpeed: Word; {Возвращает порог удвоения скорости} Function MouseTextCooX (X: Integer): Byte; {Возвращает текстовую координату по заданной виртуальной} Function MouseTextCooY (Y: Integer): Byte; {Возвращает текстовую координату по заданной виртуальной} Function MouseGraphCooX (X: Byte): Integer; {Возвращает виртуальную координату по заданной текстовой} Function MouseGraphCooY (Y: Byte): Integer; {Возвращает виртуальную координату по заданной текстовой} Procedure MouseWhereXY (var X,Y: Integer); {Возвращает виртуальные координаты мыши} Procedure MouseGotoXY (X,Y: Integer); {Переводит указатель мыши в новое положение X,Y - виртуальные координаты} Function MouseWhereX: Byte; {Возвращает горизонтальную текстовую координату} Function MouseWhereY: Byte; {Возвращает вертикальную текстовую координату} Function MouseIn (X1,Y1,X2,Y2: Integer): Boolean; {Возвращает TRUE, если указатель находится в заданном прямоугольнике} Function NumButton: Byte; {Возвращает количество кнопок мыши} Procedure GetMouseState (var Butt,X,Y: Integer); {Возвращает текущее состояние мыши: BUTT - флаг состояния кнопок; X,Y- текущие виртуальные координаты} Function MousePressed: Boolean; {Возвращает TRUE, если нажата любая кнопка} Procedure MouseButtPressed (Butt: Integer; var Stat,Count,X,Y: Integer); {Возвращает информацию о нажатой клавише: BUTT - флаг выбора клавиши; STAT - состояние клавиш; COUNT - количество нажатий, X,Y - координаты} Procedure MouseButtReleased (Butt: Integer; var Stat,Count,X,Y: Integer); {Возвращает информацию об отпущенной клавише: BUTT - флаг выбора клавиши; STAT - состояние клавиш; COUNT - количество отпусканий; X,Y - координаты} Procedure MouseWindow (X1,Y1,X2,Y2: Integer); {Задает координаты области перемещения указателя. X1...Y2 - виртуальные координаты} Procedure MouseScreen; {Устанавливает окно во весь экран} Procedure ShowMouse; {Показать указатель мыши} Procedure HideMouse; {Убрать указатель мыши} Procedure MouseTextCursor (ScrMask,CurMask: Word); {Устанавливает новый вид текстового указателя} Procedure MouseBlink (YUp,YDn: Byte); {Задает аппаратный курсор нужного размера} Procedure MouseGraphCursor (var ScrCurMask;X,Y: Byte); {Задает вид графического указателя} Function MouseBuffSize: Word; {Возвращает длину буфера для сохранения параметров} Procedure SaveMouse (var Buff); {Сохраняет в буфере текущее состояние мыши} Procedure RestoreMouse (var Buff); {Восстанавливает сохраненное состояние мыши} Procedure SetMouseItem (NItem: Byte; var Items); {Устанавливает элементы для выбора мышью: NItem - количество элементов; Items - array [1..NItem] of MouseItemType; Старые установки сбрасываются} Procedure AddMouseItem (Item: MouseItemType); {Добавляет еще один элемент для выбора мышью. Старые установки сохраняются} Procedure ClearMouseItems; {Сбрасывает ранее установленные элементы} Procedure GetMouseItem (var NItem: Byte; var Items); {Возвращает установленные элементы} Function KeyOrMousePressed: Boolean; {Возвращает TRUE, если нажата клавиша или активна мышь} Function ReadKeyOrMouse: Char; {Возвращает символ нажатой клавиши или выбранной опции} Procedure SetMouseHandler (Mask: Word; Proc: MouseHandlerType); {Устанавливает адрес и условия вызова обработчика} Procedure ChangeMouseHandler (Mask: Word;Proc: MouseHandlerType; var OldMask: Word; var OldProc: Pointer); Procedure ClearMouseHandler; {Удаляет обработчик событий} Function IsMouse: Boolean; {Возвращает TRUE, если мышь доступна} Function InitMouse: Boolean; {Инициация мыши} Procedure SetMousePage (Page: Byte); {Устанавливает страницу для указателя мыши} Function GetMousePage: Byte; {Возвращает номер страницы с указателем} Procedure SetStepToPixel (Hor,Ver: Integer); {Устанавливает чувствительность мыши} Procedure GetStepToPixel (var Hor,Ver: Integer); {Возвращает чувствительность мыши} Procedure SetDoubleSpeed (Speed: Word); {Устанавливает порог удвоения скорости перемещения указателя} Function GetDoubleSpeed: Word; {Возвращает порог удвоения скорости} Function MouseTextCooX (X: Integer): Byte; {Возвращает текстовую координату по заданной виртуальной} Function MouseTextCooY (Y: Integer): Byte; {Возвращает текстовую координату по заданной виртуальной} Function MouseGraphCooX (X: Byte): Integer; {Возвращает виртуальную координату по заданной текстовой} Function MouseGraphCooY (Y: Byte): Integer; {Возвращает виртуальную координату по заданной текстовой} Procedure MouseWhereXY (var X,Y: Integer); {Возвращает виртуальные координаты мыши} Procedure MouseGotoXY (X,Y: Integer); {Переводит указатель мыши в новое положение X,Y - виртуальные координаты} Function MouseWhereX: Byte; {Возвращает горизонтальную текстовую координату} Function MouseWhereY: Byte; {Возвращает текстовую координату по вертикали} Function MouseIn (X1,Y1,X2,Y2: Integer): Boolean; {Возвращает TRUE, если указатель находится в заданном прямоугольнике} Function NumButton: Byte; {Возвращает количество кнопок мыши} Procedure GetMouseState (var Butt,X,Y: Integer); {Возвращает текущее состояние мыши: BUTT - флаг состояния кнопок; X,Y- текущие виртуальные координаты} Function MousePressed: Boolean; {Возвращает TRUE, если нажата любая кнопка} Procedure MouseButtPressed (Butt: Integer; var Stat,Count,X,Y: Integer); {Возвращает информацию о нажатой клавише: BUTT - флаг выбора клавиши; STAT - состояние клавиш; COUNT - количество нажатий, X,Y - координаты} Procedure MouseButtReleased (Butt: Integer; var Stat,Count,X,Y: Integer); {Возвращает информацию об отпущенной клавише: BUTT - флаг выбора клавиши; STAT - состояние клавиш; COUNT - количество отпусканий; X,Y - координаты} Procedure MouseWindow (X1,Y1,X2,Y2: Integer); {Задает координаты области перемещения указателя. X1...Y2 - виртуальные координаты} Procedure MouseScreen; {Устанавливает окно во весь экран} Procedure ShowMouse; {Показать указатель мыши} Procedure HideMouse; {Убрать указатель мыши} Procedure MouseTextCursor (ScrMask,CurMask: Word); {Устанавливает новый вид текстового указателя} Procedure MouseBlink (YUp,YDn: Byte); {Задает аппаратный курсор нужного размера} Procedure MouseGraphCursor (var ScrCurMask;X,Y: Byte); {Задает вид графического указателя} Function MouseBuffSize: Word; {Возвращает длину буфера для сохранения параметров} Procedure SaveMouse (var Buff); {Сохраняет в буфере текущее состояние мыши} Procedure RestoreMouse (var Buff); {Восстанавливает сохраненное состояние мыши} Procedure SetMouseItem (NItem: Byte; var Items); {Устанавливает элементы для выбора мышью: NItem - количество элементов; Items - array [1..NItem] of MouseItemType; Старые установки сбрасываются} Procedure AddMouseItem (Item: MouseItemType); {Добавляет еще один элемент для выбора мышью. Старые установки сохраняются} Procedure ClearMouseItems; {Сбрасывает ранее установленные элементы} Procedure GetMouseItem (var NItem: Byte; var Items); {Возвращает установленные элементы} Function KeyOrMousePressed: Boolean; {Возвращает TRUE, если нажата клавиша клавиатуры или кнопка мыши} Function ReadKeyOrMouse: Char; {Возвращает символ нажатой клавиши или выбранного элемента} Procedure MouseHandler; Far; Assembler; {Ассемблерный интерфейс для вызова обработчика} Procedure SetMouseHandler (Mask: Word; Proc: MouseHandlerType); {Устанавливает адрес и условия вызова обработчика} Procedure ChangeMouseHandler (Mask: Word; Proc: MouseHandlerType; var OldMask: Word; var OldProc: Pointer); {Заменяет старый обработчик новым} Procedure ClearMouseHandler; {Удаляет обработчик событий} function vihod:boolean; {проверка выбран или нет и клик мышки на надписи"ВЫХОД" } procedure ReadBMP {чтение изображения из Bmp-файла} procedure ReadBMPheader (header:bmhptr;filename:string); {чтение заголовка Bmp-файла} procedure ReadBMP (image:arptr; var xim,yim:word; pal:arptr; filename:string); {чтение изображения из Bmp-файла} procedure ReadBMPheader (header:bmhptr;filename:string); {чтение заголовка Bmp-файла} 3. Руководство пользователю3.1 Системные требованияПрограмма запускается под управлением операционной системы MS Windows, начиная с версии NT/95. Для её работы требуется от 16 мегабайт оперативной памяти, видеоадаптер SVGA и процессор Pentium 133 и выше.3.2 Назначение программыНазначение программы - приятное проведение досуга, без какой-либо видимой пользы для физического состояния и морального духа, совершенствование координации и логического мышления, возможно использование для демонстрации графических возможностей Паскаля.3.3 Выполнение программыЗапуск программы осуществляется при открытии файла igra.exe из каталога. При запуске игры появляется следующее меню: Управление игрой осуществляется при помощи мышки. При выборе пункта «Помощь» выдается краткая справка, объясняющая правила игры. С помощью пункта «Победители» вы можете изучить список победителей. Пункт «Старт игры осуществляет её запуск», и пользователь видит следующую картинку Для осуществления переправки волка, козы и капусты на другой берег необходимо навести курсор мышки на выбранный объект и нажать правую или левую клавишу, после чего процесс переправки осуществится автоматически. Для переправки волка, козы или капусты обратно необходимо проделать те же действия. Если вы совершили некорректное действие, противоречащее правилам игры (оставили волка с козой или козу с капустой) появится сообщение о проигрыше. Если все ваши действия были верны и вы переправили волка, козу и капусту на другой берег на экране появится предложение о внесении вашего имени в список победителя. По завершению ввода необходимо нажать клавишу ENTER. 3.4 Технико-экономические показателиОриентировочная экономическая эффективность, преимущества по сравнению с аналогами, т.к. разработана в современной среде программирования. 3.5 Настройка программыПрограмма готова к работе, настройки не требует. Заключение В данной работе были широко использованы методы ООП. Это позволило хорошо структурировать программу и облегчило ее написание. Используются все три свойства ООП - инкапсуляция, наследование, полиморфизм. Высокая структурированность программы сделала ее достаточно прозрачной для внесения изменений и дополнений, в нее легко добавить еще несколько процедур для улучшения интеллектуальности игры (сейчас на местах, где должны вызываться некоторые из этих процедур стоят программные заглушки, все они снабжены комментариями и при желании их можно снять и дописать соответствующие процедуры) В заключение следует сказать, что игра в шашки в общем - то легко поддается алгоритмизации в силу достаточно простых правил, хотя это не является очевидным, и на первый взгляд задача казалась неразрешимой. Список используемой литературыЗуев. Язык программирования Turbo Pascal 6.0.- М.: Унитех, 1992.- 298 с. Довгаль С.И., Сбитнев А.И. Персональные ЭВМ: Турбо - Паскаль V 7.0, Объектное программирование.- Киев: Довгаль,1995. - 320 с. Епаншенков А.М., Епаншенков В.А. Программирование в среде TURBO PASCAL 7.0.- М.: Диалог - МИФИ, 1996.- 288 с. Турбо Паскаль 7.0 - К.: Торгово - издательское бюро BHV, 1995 - 448 с. История компьютерных игр (internet версия).
|