Код:
program darts;
uses graphabc;
var
//tochka,drotik,nzast,kzast,komnata,pic:integer;
mishen,tochka,drotik,nzast,kzast,komnata,pic:Picture;
xd,yd,sd,kd,ynd:integer;
xm,ym,vxm:integer;
xt,yt:array[1..10] of integer;
et,pt:array[1..10] of boolean;
i,j,kt,score:integer;
good:boolean;
r:real;
keypressed:boolean;
procedure KeyDown(Key: integer);
begin
keypressed:=true;
//При нажатии пробела,игрок кидает дротик в текущем направлении
//При нажатии стрелок дротик еще не кинутый перемещается
if sd=1 then
case Key of
//если появился 11 дротик, то конец игры
VK_Space: if sd=1 then
begin
sd:=2;
ynd:=yd;
end;
VK_Left: if (xd>=290) then xd:=xd-3;
VK_Right: if (xd<=1010) then xd:=xd+3;
VK_Up: if (yd>500) then yd:=yd-3;
VK_Down: if (yd<635) then yd:=yd+3;
end;
end;
procedure KeyUp(Key: integer);
begin
keypressed:=false;
end;
begin
keypressed:=false;
onkeydown:=keydown;
onkeyup:=keyup;
randomize;
//Настраиваем размеры и положения окна
setwindowsize(1338,696);
centerwindow;
setwindowcaption('Дартс');
//Загружаем отдельные картинки:нач.заставка,кон.заставка,мишень
mishen:=new Picture('мишень.bmp'); mishen.Transparent:=true;
drotik:=new Picture('дротик.bmp'); drotik.Transparent:=true;
nzast:=new Picture('н.заставка.bmp'); nzast.Transparent:=true;
kzast:=new Picture('к.заставка.bmp'); kzast.Transparent:=true;
//Загружаем помещение
komnata:=new Picture('помещение.bmp'); komnata.Transparent:=true;
//Загружаем след от попадания дротика
tochka:=new Picture('точка.bmp'); tochka.Transparent:=true;
//Размещаем мишень в начальную позицию,задаем направление смещения
xm:=330; ym:=255; vxm:=3;
//Размещаем дротик,а также состояние(стоит или летит)
xd:=300; yd:=635; sd:=1; score:=0;//1-стоит, 2-летит
//Имеется 10 дротиков
kd:=10;
//Следов от попадания дротика еще нет
kt:=0;
for i:=1 to 10 do et[i]:=false;
//Показываем начальную заставку и ждем нажатия любой клавиши
setbrushcolor(clblack);
fillrect(0,0,1338,696);
nzast.draw(0,0);
sleep(1000);
repeat
until KeyPressed;
sleep(1000);
//Включаем режим разделения видео страниц
lockdrawing;
repeat //==============================
//Показываем комнату
komnata.draw(0,0);
//Если есть точки на стенке, показываем их
for i:=1 to 10 do
if et[i] then
if not pt[i] then
tochka.draw(xt[i],yt[i]);
//Показываем остаток дротиков
setpencolor(clred); setbrushcolor(clgray);
rectangle(50,560,255,610);
for i:=1 to kd do
drotik.draw(30+i*20,556,20,50);
setbrushstyle(bsclear);
setfontcolor(clwhite);
setfontstyle(FSbold);
setfontsize(16);
textout(50,530,'Остаток:');
textout(500,50,'Очки: '+inttostr(score));
//Показываем мишень
mishen.draw(xm,ym);
//Если есть точки на мишени, показываем их
for i:=1 to 10 do
if et[i] then
if pt[i] then
tochka.draw(xm+xt[i],ym+yt[i]);
//Показываем дротик
drotik.draw(xd,yd);
//Готовый кадр выводим в окно
redraw;
//Если летящий дротик, то перемещаем его
//Долетев до мишени, он исчезает и оставляет точку
//при этом появляется новый, неброшенный
if sd=2 then
begin
yd:=yd-1;
if yd<=ynd-250 then
begin
kd:=kd-1;
sd:=1;
r:=sqrt(sqr(xd+17-xm-65)+sqr(yd-ym-65));
case round(r) of
0..13:score:=score+50;
14..27:score:=score+40;
28..40:score:=score+30;
41..53:score:=score+20;
54..65:score:=score+10;
end;
for i:=1 to 10 do
if et[i]=false then
begin
et[i]:=true;
if r<=65 then
begin
xt[i]:=xd+10-xm;
yt[i]:=yd-7-ym;
pt[i]:=true;
end
else
begin
xt[i]:=xd+10;
yt[i]:=yd-7;
pt[i]:=false;
end;
yd:=635;
break;
end;
end;
end;
//Мишень перемещается в тякущем направлении,а дойдя до стенок меняет его
xm:=xm+vxm;
if (xm<=330) or (xm>=915) then
vxm:=-vxm;
until kd=0;
//Показываем конечную заставку
setbrushcolor(clblack);
fillrect(0,0,1338,696);
kzast.draw(7,62);
redraw;
end.