Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
48
Добавлен:
10.12.2013
Размер:
211.46 Кб
Скачать

11

Министерство образования РФ

Пермский Государственный Технический Университет

Кафедра втау Курсовая работа

Игровая программа «Арканоид»

Выполнил:

студент гр. ЭВТ-00-1

Антипин Е. А.

Проверил:

старший преподаватель

Томко А. Н.

г. Пермь 2001 г.

  1. Описание работы программы

Вид игрового поля: в верхней части экрана расположены кирпичи, внизу – двигающаяся платформа – «телега».

Смысл игры – выбить мячом все кирпичи, используя «телегу». При этом если мяч не попадает в телегу то играющий проигрывает.

Подсчёт очков ведётся по количеству выбитых кирпичей.

Управлять телегой можно как с клавиатуры (клавиши «А» и «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 – видимый или нет

ype

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

Вывод на экран текущего счёта

str(sc,st);

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;

Задание начального положения кирпичей

K:=5+Random(20);

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;

Вывод кирпичей на экран

procedure DrawBricks;

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);

Закраска цветом фона поражённого кирпича

begin

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

Проверка на попадание в кирпич,

суммирование счёта

for i:=1 to n2 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

Вывод телеги на экран

SetWriteMode(1); SetColor(TC);

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;

Вывод мяча на экран

procedure Ball;

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;

Вывод игрового поля

begin

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);

Сдвиг телеги клавиатурой

begin

Сдвиг телеги мышкой

TX:=TX+s;

end;

procedure CheckRange;

Проверка текущих координат мяча и телеги на выход за границы поля,

begin

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;

Проверка на выигрыш

end;

function CheckLose: Boolean;

Проверка на промах

begin

CheckLose:=BY+BR>MaxY-5-y2;

end;

procedure ActiveBall;

begin

Сдвиг мяча

BX:=BX+BVx;

BY:=BY+BVy;

end;

procedure InitVars;

Присвоение начальных значений координат мяча и телеги

begin

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;