Главная Учебники - Разные Лекции (разные) - часть 32
|
МИНИСТЕРСТВО
ОБРАЗОВАНИЯ
РОСИЙСКОЙ
ФЕДЕРАЦИИ
Таганрогский
государственный
радиотехнический
университет
2000 – 2001 учебный
год
по курсу Студента
группы ВД – 49 Каретина
Флориана Викторовича Задание
выполнил
________________ _____________________
подпись
студента
дата
выполнения
задания
Задание
проверил
________________ _____________________
оценка
подпись преподавателя
_______________________
дата
проверки задания
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
ОГЛАВЛЕНИЕ 1. Постановка
задачи 3 стр. 2. Входные
данные 3 стр. 3. Выходные
данные 3 стр. 4. Текст
программы 4
стр.
1. Постановка
задачи. Необходимо
разработать
игровую программу
«Арканоид».
Дощечки для
отбивания
шарика надо
разместить
слева и справа.
Правая дощечка
должна управляться
клавишами «A»
и «Z»
(вверх и
вниз соответственно),
а правая дощечка
должна управляться
клавишами «L»
и «<» (вверх
и вниз соответственно).
Так же должен
быть предусмотрен
режим игры за
компьютер
(автоматическое
отбивание
дощечками
шарика). По нажатию
клавиши «1» -
включение/выключение
игры за компьютер
левой дощечки,
по нажатию
клавиши «2» -
включение/выключение
игры за компьютер
правой дощечки.
Программа
должна иметь
дружественный
интерфейс,
работать на
компьютере
с процессором
486DX-66. 2. Входные
данные. 1. Управление
дощечками
пользователем. 2.
Положение
дощечек при
приближении
шарика к краям
экрана. 3. Выходные
данные. Перемещение
дощечки по
экрану при
нажатии определенных
клавиш. Отталкивание/непопадание
шарика от дощечки. Выдача
очков играющих. Звуковое
сопровождение
при попадании
или непопадании
шарика по дощечке,
или отскакивания
его от стенки. Текст
программы program
Game_Tenis; uses
DOS, Crt2, Graph; var CK,
StopRun, Up1, Down1, Up2, Down2, Auto1, Auto2 :Boolean; R1,
R2, oR1, oR2, BX, BY, oBX, oBY, Step :Integer; kX,
kY, rBX, rBY :Real; MissCount1,
MissCount2 :Word; OldInt9:
procedure; {____________________________________________________________________________} {работа
с клавиатурой
по превываниям} procedure
UserInt9; interrupt; begin case
Port[$60] of $81:
StopRun:=True; {Esc - выход} $1E:
begin CK:=True; Up1:=True; end; {вверх
первая дощечка} $9E:
begin CK:=True; Up1:=False; end; $2C:
begin CK:=True; Down1:=True; end; {вниз
первая дощечка} $AC:
begin CK:=True; Down1:=False; end; $25:
begin CK:=True; Up2:=True; end; {вверх
вторая дощечка} $A5:
begin CK:=True; Up2:=False; end; $32:
begin CK:=True; Down2:=True; end; {вниз
вторая дощечка} $B2:
begin CK:=True; Down2:=False; end; $02:
Auto1:=not Auto1; {включение/выключение
авто-режима}
{для
игрока 1} $03:
Auto2:=not Auto2; {включение/выключение
авто-режима}
{для
игрока 2} end; Inline
($E4/$61/$8A/$E0/$0C/$80/ {вставка
в машинных
кодах}
$E6/$61/$86/$E0/$E6/$61/
{для правильной
работы}
$B0/$20/$E6/$20);
{обработчика
прерывания} end; {----------------------------------------------------------------------------} {процедура
установки
пользовательского
прерывания} procedure
SetUserInt; begin
GetIntVec($09,@OldInt9);
{сохранение
старого вектора}
SetIntVec($09,Addr(UserInt9));
{установка
нового} end; {----------------------------------------------------------------------------} {восстановление
старого вектора} procedure
SetOldInt; begin
SetIntVec($09,@OldInt9); end; {----------------------------------------------------------------------------} {процедура
инициализации
графического
режима} procedure
InitScreen; var GrMode,
GrDriver :Integer; GrPath
:String; begin GrDriver:=VGA; GrMode:=VGAHi;
GrPath:='E:\pl\bp\bgi'; InitGraph(GrDriver,
GrMode, GrPath); SetTextStyle(2,
0, 6); end; {----------------------------------------------------------------------------} {процедура
обновления
количества
очков игроков} procedure
RefrCount; var s1
:String; begin SetFillStyle(1,0); Bar(610,
230, 639, 250); Str(MissCount1,
s1); OutTextXY(614,232,
s1); Bar(0,
0, 29, 479); Str(MissCount2,
s1); OutTextXY(5,232,
s1); Bar(0,
230, 29, 250); Str(MissCount2,
s1); OutTextXY(4,232,
s1); Bar(610,
0, 639, 479); Str(MissCount1,
s1); OutTextXY(615,232,
s1); end; {----------------------------------------------------------------------------} procedure
Game; var t1
:Integer; ChC
:Boolean; begin {прорисовка
игрового поля} SetColor(12); Rectangle(30,0,
609, 479); SetFillStyle(1,
1); Bar(31,1,
608, 478); {первоначальная
установка
переменых} kX:=0.8; kY:=0.3; Step:=10; rBX:=320; rBY:=240; oBX:=320; oBY:=240; R1:=240; R2:=240; oR1:=240; oR2:=240; repeat {если
нажата клавиша
вверх и не нажата
клавиша вниз} {для
игрока 1} if
Up1 and not Down1 then begin
{перемещение
дощечки вверх} R1:=R1-10; if
R1<50 then R1:=50; {не пропускать
выше положенной}
SetColor(1);
{координаты} Line(50,
oR1-48, 50, oR1+48);
SetColor(11); Line(50,
R1-48, 50, R1+48); oR1:=R1; end; {если
нажата клавиша
вниз и не нажата
клавиша вверх} {для
игрока 1} if
Down1 and not Up1 then begin
{перемещение
дощечки вниз} R1:=R1+10; if
R1>430 then R1:=430;{не пропускать
ниже положенной}
SetColor(1);
{координаты} Line(50,
oR1-48, 50, oR1+48);
SetColor(11); Line(50,
R1-48, 50, R1+48); oR1:=R1; end; {если
нажата клавиша
вверх и не нажата
клавиша вниз} {для
игрока 2} if
Up2 and not Down2 then begin
{перемещение
дощечки вверх} R2:=R2-10; if
R2<50 then R2:=50; {не пропускать
выше положенной}
SetColor(1);
{координаты} Line(590,
oR2-48, 590, oR2+48);
SetColor(10); Line(590,
R2-48, 590, R2+48); oR2:=R2; end; {если
нажата клавиша
вниз и не нажата
клавиша вверх} {для
игрока 2} if
Down2 and not Up2 then begin
{перемещение
дощечки вниз} R2:=R2+10; if
R2>430 then R2:=430;{не пропускать
ниже положенной}
SetColor(1);
{координаты} Line(590,
oR2-48, 590, oR2+48);
SetColor(10); Line(590,
R2-48, 590, R2+48); oR2:=R2; end; {если
включен автоматический
режим для игрока
1} if
Auto1 then begin
{автоматическое
перемещение
дощечки} R1:=BY; if
R1<50 then R1:=50;{не пропускать
выше положенной}
{координаты} if
R1>430 then R1:=430;{не пропускать
ниже положенной}
{координаты}
SetColor(1); Line(50,
oR1-48, 50, oR1+48); oR1:=R1; end; SetColor(11); Line(50,
R1-48, 50, R1+48); {если
включен автоматический
режим для игрока
2} if
Auto2 then begin
{автоматическое
перемещение
дощечки} R2:=BY; if
R2<50 then R2:=50;{не пропускать
выше положенной}
{координаты} if
R2>430 then R2:=430;{не пропускать
ниже положенной}
{координаты}
SetColor(1); Line(590,
oR2-48, 590, oR2+48); oR2:=R2; end; {перерисовка
полета шарика} SetColor(10); Line(590,
R2-48, 590, R2+48); SetColor(12); Rectangle(30,0,
609,479); SetFillStyle(1,
1); SetColor(1);
FillEllipse(oBX,
oBY, 10, 10);
rBX:=rBX+kX*Step;
rBY:=rBY+kY*Step; BX:=Round(rBX); BY:=Round(rBY); SetFillStyle(1,
15); SetColor(7); FillEllipse(BX,
BY, 10, 10); {если
дощечка не
попала} if
ChC then begin
ChC:=False; RefrCount;
{обновить очки
игроков} end; {столкновение
шарика с дощечкой
слева} if
(BX<60) and (BY>(R1-55)) and (BY<(R1+55)) then begin kX:=-kX;
Sound(1000); Delay(10); NoSound; end; {не
попадание
дощечкой слева} if
(BX<40) then begin rBX:=580; rBY:=R2;
kX:=Abs(kX);
Sound(700);
Delay(500); NoSound;
Inc(MissCount1); ChC:=True; end; {столкновение
шарика с дощечкой
справа} if
(BX>580) and (BY>(R2-55)) and (BY<(R2+55)) then begin kX:=-kX;
Sound(1000); Delay(10); NoSound; end; {не
попадание
дощечкой справа} if
(BX>600) then begin rBX:=60; rBY:=R1;
kX:=-Abs(kX);
Sound(700);
Delay(500); NoSound;
Inc(MissCount2); ChC:=True; end; {удар
шарика об верхнюю
или нижнюю
стенку} if
(BY<10) or (BY>470) then kY:=-kY; oBX:=BX; oBY:=BY; Delay(10); until
StopRun; {выход если
нажата клавиша
Esc} end; {============================================================================} begin InitScreen;
{инициализация
графического
режима} SetUserInt;
{установка
пользовательского
прерывания} Game;
{непосредственно
вызов игры} SetOldInt;
{восстановления
старого вектора
прерывания} CloseGraph;
{закрытие
графического
режима} end.
МИНИСТЕРСТВО
ОБРАЗОВАНИЯ
РОСИЙСКОЙ
ФЕДЕРАЦИИ
Таганрогский
государственный
радиотехнический
университет
2000 – 2001 учебный
год
о выполнении
практических
заданий
по курсу Студента
группы ВД – 49 Каретина
Флориана Викторовича Задание
выполнил
________________ _____________________
подпись
студента
дата
выполнения
задания
Задание
проверил
________________ _____________________
оценка
подпись преподавателя
_______________________
дата
проверки задания
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
______________________________________________________________________
Описание программы
созданной с
помощью Turbo
Visual. Начинается
программа с
подключения
библиотек Turbo
Visual: uses App,
Objects, Menus, Drivers, Editors, Views; Основной
блок программы
состоит из трех
команд: Begin
MyApp.Init; {Подготовить
работу программы}
MyApp.Run; {Выполнить
необходимые
действия}
MyApp.Done; {Завершить
исполнение
программы} End. Для
создания собственной
строки статуса
вводим следующее
описание: type
TMyApp=object(TApplication) {Создаем
объект-потомок
от TApplication}
procedure InitStatusLine; virtual;
{Перекрываем
старый метод
InitStatusLine новым}
Описание нового
метода, с помощью
которого создается
строка статуса:
Procedure TMyApp.InitStatusLine;
Var R:TRect; {хранит границы
строки статуса}
Begin
GetExtent(R); {устанавливает
R в координаты
всего экрана}
R.A.Y:=R.B.Y-1; {передвигает
вершину выше
нижней на 1 строку}
StatusLine:=New(PStatusLine, Init(R, {создает
строку статуса}
NewStatusDef(0,$FFFF, {устанавливает
диапазон контекстного
Help}
NewStatusKey('~Alt-X~ Exit', kbAltX, cmQuit, {определяет
элемент}
NewStatusKey('~Alt-F3~ Close', kbAltF3, cmClose, {другой}
nil)), {больше нет
клавиш}
nil))) {больше нет
определений}
End;
Формирование
меню:
Описание в
разделе типов: TMyApp=object(TApplication)
{Создаем
объект-потомок
от TApplication}
procedure InitMenuBar; virtual; {Перекрываем
старый метод
InitMenuBar новым} Тело
процедуры: procedure
TMyApp.InitMenuBar; Var
R:TRect; Begin
GetExtent(R); {устанавливает
R в координаты
всего экрана}
R.B.Y:=R.A.Y+1;
MenuBar:=New(PMenuBar, Init(R, NewMenu( {создать
полосу меню}
NewSubMenu('~F~ile', hcNoContext, NewMenu( {определить
меню}
StdFileMenuItems(nil)), {стандратная
функция определения
элементов}
{меню
File}
NewSubMenu('~W~indow', hcNoContext, NewMenu( {определить
меню}
StdWindowMenuItems(nil)), {стандратная
функция определения
элементов}
{меню
Window}
nil) {больше нет
подменю}
)))); {конец полосы} End;
Создание окон
и манипуляции
с ними:
Описание:
procedure NewWindow; virtual;
procedure HandleEvent(var Event:TEvent); virtual;
end;
PDemoWindow=^TDemoWindow; {тип указателя
для нового
объектного
типа}
TDemoWindow=object(TWindow) {определение
нового типа
окна}
constructor Init(Bounds: TRect; WinTitle:String; WindowNo:
Integer);
end;
PInterior=^TInterior;
TInterior=object(TScroller)
constructor Init(var Bounds:TRect; HS, VS: PScrollBar);
procedure Draw; virtual;
procedure HandleEvent(var Event:TEvent); virtual;
end;
Описание тела
конструктора
инициализации
окна:
constructor TDemoWindow.Init(Bounds: TRect; WinTitle:String;
WindowNo: Integer);
var
S:String[3];
Interior:PInterior;
HS, VS: PScrollBar;
begin
Str(WindowNo,S); {устанавливает
номер окна в
заколовке}
TWindow.Init(Bounds, WinTitle+' '+S, wnNoNumber);
GetClipRect(Bounds);
Bounds.Grow(-1,-1); {интерьер
помещается
внутри рамки
окна}
VS:=StandardScrollBar(sbVertical+sbHandleKeyBoard); {разрешение
перемещения
вертикального
бегунка стрелками
на клавиатуре}
HS:=StandardScrollBar(sbHorizontal+sbHandleKeyBoard);
{разрешение
перемещения
горизонтального
бегунка стрелками
на клавиатуре}
Interior:=New(PInterior, Init(Bounds, HS, VS));
Insert(Interior); {добавляет
интерьер к
окну}
end;
Описание конструктора
инициализации
интерьера:
constructor TInterior.Init(var Bounds:TRect; HS, VS: PScrollBar);
begin
TScroller.Init(Bounds, HS, VS);
GrowMode:=gfGrowHiX+gfGrowHiY;
end;
Описание процедуры
прорисовки
интерьера окна:
procedure TInterior.Draw;
begin
TScroller.Draw; {Вызов
стандартной
прорисовки}
WriteStr(0,0,'Текст в
окне',1); {Вывод
текста в окно}
TScroller.ShowCursor; {Показать
курсор}
end;
Описание тела
процедуры
создания нового
окна:
procedure TMyApp.NewWindow;
var
Window:PDemoWindow;
R: TRect;
Begin
Inc(WinCount);
R.Assign(0,0,26,7); {установка
начального
размера и позиции}
R.Move(Random(58),Random(16)); {случайное
перемещение
по экрану}
Window:=New(PDemoWindow, Init(R, 'Demo Window', WinCount));
DeskTop^.Insert(Window); {вывести
окно на панель
экрана}
End; Описание
тела процедуры
обработки
команд среды procedure
TMyApp.HandleEvent(var Event:TEvent); Begin TApplication.HandleEvent(Event);
{действует как
предок} if
Event.What=evCommand Then Begin case
Event.Command of {но откликается
на дополнительные
команды} cmNew:
NewWindow; {определяет
действие для
команды cmNew} else Exit; End;
ClearEvent(Event); {очищает
событие после
обработки} end; End; Описание
тела процедуры
обработки
команд в окне procedure
TInterior.HandleEvent(var Event:TEvent); Begin TScroller.HandleEvent(Event);
{действует как
предок} case
Event.What of {проверка
события} evKeyDown:
{если
нажата клавиша} Begin
Case
Event.KeyCode of {проверка:
какая клавиша
нажата}
kbLeft:
{стрелка
влево}
begin
if
x>0 then {если
координата
по Х больше 0}
Begin
x:=x-1;
{то
уменьшить ее
на 1}
SetCursor(x,y);
{установить
на новую координату
курсор}
End
end;
kbRight:
{стрелка
вправо}
begin
x:=x+1;
{увеличить
координату
по Х на единицу}
SetCursor(x,y);
{установить
на новую координату
курсор} end;
kbUp:
{стрелка
вверх}
begin
if
y>0 then {если
координата
по Y
больше 0}
Begin
y:=y-1;
{то
уменьшить ее
на 1}
SetCursor(x,y);
{установить
на новую координату
курсор}
End
end;
kbDown:
{стрелка
вниз}
begin
y:=y+1;
{увеличить
координату
по Y
на 1}
SetCursor(x,y);
{установить
на новую координату
курсор}
end;
end; Case
Event.ScanCode of {проверка
скан-кода клавиатуры} 57:
{если
пробел} begin
If
GetState(sfCursorVis) Then {если
курсор виден}
TScroller.HideCursor
{то
скрыть его}
Else
TScroller.ShowCursor;
{иначе
показать его} end; end; End; end; End;
Описание игровой
программы
«Стрельба по
мишени». Игровая
программа
состоит из трех
процедур (minv —
уменьшение
кол-ва патронов,
intro — заставка,
go — конец игры)
и основного
блока программы. Процедура
minv (уменьшение
количества
патронов). kv:=kv-1;
{уменьшение
значение переменной
kv (в основной
программе она
фигурирует
как количество
патронов)
} setfillstyle(1,9);
{установка
стиля заполнения
фона} bar((20-kv)*10+415,4,(20-kv)*10+425,12);
{стирание
одного патрона
с экрана} Процедура
intro; {Заставка} Выводит
заставку игры. settextstyle(0,0,15);
{установка
стиля текста} setcolor(12);
{установка
цвета} outtextxy(140,100,'ТИР');
{вывод
текста} settextstyle(0,0,2); setcolor(10); outtextxy(130,290,'ESC
- '); setcolor(14); outtextxy(220,290,'Выход
из программы'); settextstyle(0,0,1); tp:='НАЖМИТЕ
ЛЮБУЮ КНОПКУ
ДЛЯ НАЧАЛА
ИГРЫ'; settextstyle(0,0,1); setcolor(11); outtextxy(320-trunc(length(tp)*4),340,tp);
{вывод текста
с расчетом по
центру} a:=readkey; if
ord(a)=27 then exi:=true; {если
нажата клавиша
Esc – выйти
из игры} setfillstyle(1,0); bar(100,30,600,350); Процедура
go – выводит
заставку конца
игры procedure
go; {Конец игры} begin settextstyle(0,0,5);
{установка
стиля вывода
текста} setcolor(2);
{установка
цвета} outtextxy(50,200,'ВСЕ,ДОИГРАЛИСЬ'); settextstyle(0,0,2); readkey; UROV:=1;MENU:=true;oko:=0; end; Основное
тело программы begin d:=vga;initgraph(d,r,'');
{инициализация
графики} setgraphmode(2);
{установка
графического
режима} randomize;
{вызов
генератора
случайных
чисел} urov:=1;oko:=0;
mus:=true; sou:=true;menu:=true; {первоначальная
установка
переменных} repeat
{начало
основного цикла
программы} {Cоздание
интерфейса} cleardevice;
{очистака
экрана} setfillstyle(1,1);
{установка
стиля заполнения
фона} bar(0,0,640,2);
{рисование
прямоугольников
вокруг рабочей
области} bar(0,0,2,480); bar(0,480,640,478); bar(640,480,638,0); setfillstyle(1,9); bar(2,2,638,17); bar(2,2,5,478); bar(2,478,638,475); bar(638,2,635,478); setfillstyle(1,3); bar(5,17,635,19); bar(5,17,7,475); bar(5,475,635,473); bar(635,17,633,475); setfillstyle(9,14); setcolor(14);
{установка
цвета рисования} moveto(7,460);
{перемещение
графического
курсора в указанные
координаты} for
i:=1 to 62 do {рисование
песка холмиками} lineto(i*10+7,460+random(10)); lineto(633,460); line(7,473,633,473); line(7,473,7,460); line(633,473,633,460); floodfill(9,469,14);
{заполнение
стилем области,
расположенной
либо внутри
замкнутого
контура, либо
вне его} setlinestyle(0,0,1);
{установка
стиля линий} setfillstyle(8,6);
{установка
стиля заполнения
фона} bar(260,408,380,470); setfillstyle(1,1); setcolor(14); line(260,408,260,470); line(260,408,380,408); line(380,408,380,470); fillellipse(320,408,23,15);
{вычерчивание
контура эллипса
текущим цветом
и заполнение
ограниченной
контуром области
экрана текущим
узором} setlinestyle(0,3,3); setcolor(11); line(320,391,320,376); fi:=pi;tzm:=40;tzs:=40; settextstyle(0,0,2); cou:=0;
kv:=20; ov:=1; ex:=0; setfillstyle(1,15);setcolor(7); bar(250,6,310,12); setfillstyle(1,0); bar(17,2,220,17); setcolor(12); outtextxy(20,3,'Cчет:'); setcolor(11); setfillstyle(1,11); for
i:=1 to kv do fillellipse(i*10+420,8,3,3); {рисование
патронов} if
menu then intro; {если
menu=true,
то
вызвать процедуру
intro
(заставка
игры)} menu:=false; if
exi then goto 1; {если
exi=true
(выход), то перейти
на метку 1} repeat if
keypressed then a:=readkey; settextstyle(0,0,1); outtextxy(280,280,'Нажмите
ENTER'); setcolor(random(16)); settextstyle(0,0,2); str(urov,em); outtextxy(270,200,concat('УРОВЕНЬ
',em)); {вывод
текста с помощью
процедуры
конкатенации} str(urov*1000,em); outtextxy(190,240,concat('Наберите
',em,' очков')); | |||||