end
end;(*victory*)
(* Процедура рисования номера пятнашки*)
procedure nomer(xp,yp,ip:integer);
begin (*nomer*)
{Преобразование числа mas[ip] в
посл-ть символов}
str(mas[ip]:1,st);
{Вывод посл-ти символов st}
outtextxy(175+xp*86,120+yp*86,st);
end;(*nomer*)
(*Процедура рисования парал-да*)
procedure kv(xk,yk:integer);
begin(*kv*)
bar3d(160+xk*86,100+yk*86,235+xk*86,
175+yk*86,7,true);
end;(*kv*)
(*Процедура смены активной таблички*)
procedure tabl(xv,yv:integer;klv:char;var
xv1,yv1:integer);
begin(*tabl*)
{Фишка(табличка),которая была активизирована
рисуется таким же цветом, что и остальные
фишки}
setcolor(13);
kv(xv,yv);
{Надпись номера фишки}
if mas[4*yv+xv+1]<>0 then
nomer(xv,yv,4*yv+xv+1);
{Нажатие пользователем одной из клафиш case
управления}
klv of
Down :if yv<3 then yv:=yv+1;
Up :if yv>0 then yv:=yv-1;
Left :if xv>0 then xv:=xv-1;
Right :if xv<3 then xv:=xv+1;
end;(*case*)
xv1:=xv;
yv1:=yv;
{Фишка, которая становится активизированной,
рисуется темным цветом}
setcolor(1);
kv(x,y);
{Надпись номера активизированной фишки}
if mas[4*yv+xv+1]<>0
then nomer(x,y,4*y+x+1);
end;(*tabl*)
(*Процедура меню*)
procedure menu(var ym:integer);
var
om:char;
begin(*menu*)
ym:=0;
cleardevice; {Очистка графического экрана}
{Рисование тени пунктов меню,прямоугольники
серого цвета}
setcolor(8);
setfillstyle(1,8);
bar(45,152,615,202);
bar(45,222,615,272);
bar(45,292,615,342);
bar(45,362,615,412);
fillellipse(304,62,210,35);
{Рисование пунктов меню,прямоугольники синего
цвета}
setfillstyle(1,1);
bar(35,145,605,195);
bar(35,215,605,265);
bar(35,285,605,335);
bar(35,355,605,405);
{Рисование эллипса под надписью ***MENU***}
fillellipse(298,57,210,35);
{Надписи на экране об авторе прграммы}
setcolor(12);
settextstyle(1,0,1);
outtextxy(20,430,'Copyright Software 1998');
outtextxy(20,450,'Written by Volkov
Konstantin');
{Надпись ***MENU*** печатается серым цветом,
тем самым создается эффект тени}
settextstyle(1,0,6);
outtextxy(142,33,'*** MENU ***');
{Печать надписи ***MENU*** синим цветом}
setcolor(10);
outtextxy(140,30,'*** MENU ***');
setbkcolor(9); {Цвет фона экрана}
repeat
setfillstyle(1,5); {Орнамент и цвет
заполнения полоски-указателя}
{Полоска,передвигающаяся по пунктам меню}
bar(35,145+70*ym,605,195+70*ym);
{Печать пунктов меню}
outtextxy(50,135,'Game');
outtextxy(50,205,'Best players');
outtextxy(50,275,'About this game');
outtextxy(50,345,'Exit');
om:=readkey;
{При переходе указателя на другой пункт,
возврашение пункту меню прежнего цвета}
{Изменение координат указателя, в
зависимости от нажатия пользователем
однойиз клавиш управления}
if om=up then ym:=ym-1;
if om=down then ym:=ym+1;
if ym=-1 then ym:=3;
if ym=4 then ym:=0;
setcolor(10); {Цвет пунктов меню}
{Создание звукового эффекта при перемещении
по пунктам меню}
sound(300);
for i:=-maxint to maxint do
j:=j;
nosound;
until om=Enter ;
end;(*menu*)
(* Процедура начала игры *)
procedure game;
begin(*game*)
cleardevice; {Очистка экрана}
steps:=0;{Число шагов 0}
{Рисование области, на фоне которой будет
выводится кол-во шагов}
setfillstyle(1,3);
bar(10,90,130,155);
setfillstyle(1,7);
bar(30,120,80,145);
{Обведение области темными линиями}
setlinestyle(0,0,1);
rectangle(10,90,130,155);
rectangle(29,119,81,146);
{Печать надписи и кол-ва шагов,
пока число шагов просто 0}
setcolor(4);
settextstyle(0,0,1);
outtextxy(20,100,'Number steps ');
outtextxy(40,130,'0');
vict:=false; {Победа не инициализирована}
setfillstyle(1,14); {Параметры заполнения
кубика}
bar3d(152,86,509,445,10,true);{Рисование
коробки}
{Создание в верхней части экрана полоски и
надписи на ней}
bar(0,0,639,50);
settextstyle(7,0,5);
outtextxy(125,2,'* 15 *');
{Создание в нижней части экрана полоски и
bar(0,450,639,480);
settextstyle(7,0,3);
outtextxy(80,450,'Press Esc for quit to
main menu');
{Задание прежних параметров}
setfillstyle(1,11);
{Включение генератора случайных чисел}
randomize;
{Заполнение массива случайными числами
от 1 до 15}
mas[16]:=0;
mas[1]:=random(14)+1;
n:=2;
u:=true;
while u do
begin{Раскладывание пятнашек}
j:=random(15)+1;
u:=false;
for i:=1 to n-1 do
{Проверка элементов массива на
равенство друг другу}
if mas[i]=j then u:=true;
end;{Раскладывание пятнашек}
mas[n]:=j;
n:=n+1;
until n=16;{Условие выхода заполнение всего
массива}
{Рисование фишек игрового поля (табличек)}
for j:=0 to 3 do
for i:=0 to 3 do
kv(i,j);
{Рисование фона на котором расположена
коробка}
setbkcolor(7);
{Разкраска коробки}
floodfill(157,90,13);
floodfill(168,82,13);
floodfill(513,90,13);
{Нумерация табличек}
n:=1;
if (i<>3) or (j<>3) then
begin
nomer(i,j,n);
end;
x1:=3;
y1:=3;
x:=3;
y:=3;
{Рисование таблички в нижнем правом
углу,пока не сделанно ни одного хода}
bar3d(418,358,493,433,7,true);
kl:=readkey;
tabl(x,y,kl,x,y); {Cмены активной
таблички}
{Проверка условия нажатия клавиши пробел}
if kl=Space then
begin(*if1*)
u:=(abs(x1-x)=1) and (abs(y1-y)=0) or
(abs(x-x1)=0) and (abs(y1-y)=1);
{Условие перестановки элементов
if u then
begin(*if2*)
{Элементы массива, которые меняются
местами}
i:=4*y+x+1;
i1:=4*y1+x1+1;
setcolor(11);
nomer(x,y,i);
nomer(x1,y1,i);
n:=mas[i1]; {Перестановка элементов
mas[i1]:=mas[i];
mas[i]:=n;
x1:=x;
y1:=y;
steps:=steps+1; {Увеличение числа
шагов на единицу}
{Вывод на экран числа шагов}
bar(30,120,80,145);{Рисование табл.}
str(steps,st1);
outtextxy(40,130,st1);
{Проверка следования чисел в массиве}
Страницы: 1, 2, 3, 4