- •Кафедра втау Курсовая работа
- •Описание работы программы
- •2. Текст программы с комментариями
- •Тело игры
- •Завершение игры
- •Основной модуль
- •Interface
- •Implementation
- •Модуль управления клавиатурой
- •Interface
- •Implementation
- •Модуль управления мышью
- •Interface
- •Модуль звуков
- •Interface
- •Implementation
Министерство образования РФ
Пермский Государственный Технический Университет
Кафедра втау Курсовая работа
Игровая программа «Арканоид»
Выполнил:
студент гр. ЭВТ-00-1
Антипин Е. А.
Проверил:
старший преподаватель
Томко А. Н.
г. Пермь 2001 г.
Описание работы программы
Вид игрового поля: в верхней части экрана расположены кирпичи, внизу – двигающаяся платформа – «телега».
Смысл игры – выбить мячом все кирпичи, используя «телегу». При этом если мяч не попадает в телегу то играющий проигрывает.
Подсчёт очков ведётся по количеству выбитых кирпичей.
Управлять телегой можно как с клавиатуры (клавиши «А» и «D» соответственно «влево» и «вправо») так и мышью (двигая в соответствующую сторону).
Программа использует как стандартные модули Паскаля CRT иGRAPH, так и свои: ArcUnit – основной, ArcUnitK – поддержка клавиатуры, ArcUnitM – поддержка мыши, ArcSound – работа сPC-speaker.
Главное меню:
F1 - помощь (по управлению игрой и навигации по программе);
F2 – выбор управляющего устройства (клавиатура или мышь);
Esc –начать игру;
Выход из игры – клавиша Esc.
2. Текст программы с комментариями
uses ArcUnit,ArcUnitK,ArcUnitM,ArcSound,Graph,Crt;
const
TC = 2;
TL = 70;
TH = 20;{h telegi nad MaxY}
BC = 6;
TS = 3;
BR = 3;
BrW = 30;
BrH = 15;
x1 = 40;
x2 = 40;
y1 = 40;
y2 = 40;
n1 = 10;
n2 = 15;
t
Организация
кирпича. Каждому
кирпичу соответствует переменная типа
запись: поля
X
и
Y – текущие
координаты Color
– цвет
заливки Life
– видимый
или нет
TBrick = record
x,y: Integer;
Color: Byte;
Life: Boolean;
end;
var
ButtonC,EC:byte; LB,RB,TB:boolean;
MaxX,MaxY: Integer;
TX: Integer;
BX,BY: Integer;
BVx,BVy: Integer;
dPause:real;
xmouse,ymouse:integer;
sc:longint;
label Fin;
procedure Score(sc:longint; col:word);
var st:string;
begin
Вывод
на экран текущего счёта
SetColor(col);
OutTextXY(x1+5,y1+5,'Очки');
OutTextXY(x1+75,y1+5,st);
end;
{- Bricks -----------------}
var
Brk: array[1..n1,1..n2] of TBrick;
procedure InitBricks;
var i,j: Byte;
K: Integer;
begin
Randomize;
Задание
начального положения кирпичей
for j:=1 to n1 do
for i:=1 to n2 do
with Brk[j,i] do
begin
Color:=4{Random(15)+1};
Life:=True;
x:=i*(BrW+1)+12+x1;
y:=j*(BrH+1)+y1+K;
end;
end;
Вывод
кирпичей на экран
var i,j: Byte;
begin
for j:=1 to n1 do
for i:=1 to n2 do
with Brk[j,i] do
begin
SetFillStyle(1,Random(Color)+2);
Bar(x,y,x+BrW-1,y+BrH-1);
end;
end;
procedure ClB(i,j: Byte);
Закраска
цветом фона поражённого кирпича
with Brk[j,i] do
begin
SetFillStyle(1,0);
Bar(x,y,x+BrW-1,y+BrH-1);
Life:=False;
end;
end;
procedure CheckBricks;
var i,j: Byte;
begin
for j:=1 to n1 do
Проверка
на попадание в кирпич, суммирование
счёта
with Brk[j,i] do
if Life then
begin
if (BX+BR>x)and(BX-BR<x+BrW) then
begin
if (BY=y-BR)or(BY=y+BrH+BR) then begin BVy:=-BVy; Score(sc,0); sc:=sc+10;
Score(sc,7); Beep1; ClB(i,j) end;
end else
if (BY+BR>y)and(BY-BR<y+BrH) then
begin
if (BX=x-BR)or(BX=x+BrW+BR) then begin BVx:=-BVx; Score(sc,0); sc:=sc+10;
Score(sc,7); Beep1; ClB(i,j) end;
end;
end;
end;
procedure Telega;
begin
Вывод
телеги на экран
Rectangle(TX,MaxY-TH-y2,TX+TL,MaxY-TH+5-y2);
Rectangle(TX-2,MaxY-TH-y2+2,TX+TL-2,MaxY-TH+3-y2);
end;
Вывод
мяча на экран
begin
SetWriteMode(1); SetColor(BC);
Rectangle(BX-BR,BY-BR,BX+BR,BY+BR);
Line(BX-BR+1,BY-BR+1,BX+BR-1,BY+BR-1);
Line(BX+BR-1,BY-BR+1,BX-BR+1,BY+BR-1);
Line(BX+(BR div 2)-1,BY-BR+1,BX+(BR div 2)-1,BY+BR-1);
Line(BX+BR-1,BY+(BR div 2)-1,BX-BR+1,BY+(BR div 2)-1);
end;
procedure Pole;
Вывод
игрового поля
SetColor(1); Rectangle(x1,y1,MaxX-x2,MaxY-y2);
end;
procedure MoveM(s: ShortInt);
begin
GetMouseXY(xmouse,ymouse,LB,RB,TB);
TX:=xmouse;
end;
procedure MoveK(s: ShortInt);
Сдвиг
телеги клавиатурой
Сдвиг
телеги мышкой
end;
procedure CheckRange;
Проверка
текущих координат мяча и телеги на
выход за границы поля,
if TX<x1 then TX:=x1;
if TX+TL>MaxX-x2 then TX:=MaxX-TL-x2;
if (BX-BR=x1)or(BX+BR=MaxX-x2) then BVx:=-BVx;
if BY-BR=y1 then BVy:=-BVy;
if (BX+BR>TX)and(BX-BR<TX+TL) then
if BY+BR=MaxY-TH-y2 then begin
BVy:=-BVy; Beep2;
if BX>TX+TL/2 then
BVx:=-Round(1*(cos((BX-TX+TL/2)/(TL/2)))) else
BVx:=-Round(1*(cos((BX-TX)/(TL/2)))) end;
end;
function CheckWin: Boolean;
var i,j: Byte;
W: Boolean;
begin W:=True;
for j:=1 to n1 do for i:=1 to n2 do W:=W and not Brk[j,i].Life;
CheckWin:=W;
Проверка
на выигрыш
function CheckLose: Boolean;
Проверка
на промах
CheckLose:=BY+BR>MaxY-5-y2;
end;
procedure ActiveBall;
begin
Сдвиг
мяча
BY:=BY+BVy;
end;
procedure InitVars;
Присвоение начальных
значений координат мяча и телеги
TX:=MaxX div 2 - TL div 2;
BX:=TX + TL - BR;
BY:=MaxY - TH - BR - y2;
BVx:=-1; BVy:=-1;
end;
procedure InitGame;
var drv,mode: Integer;
begin drv:=Vga; mode:=2;
InitGraph(drv,mode,'c:\progra~1\borland\tp\bgi');HighVideo;
Init(ButtonC,EC); ClearDevice;
MaxX:=GetMaxX; MaxY:=GetMaxY; dPause:=0.1;
InitVars; InitBricks; DrawBricks;
end;
procedure GameRun;