Графический интерфейс программы <15>
Разработка программы
Программа состоит из двух файлов. Первый файл petnash.pas-это файл, содержащий основную программу. Второй файл petnash1.pas-это модуль, в котором находятся процедуры используемые, основной программой.
Текст основной программы
program petnash;
uses
crt,graph,
petnash1;{Модуль,содержащий основные подпрограммы}
Var
grDriver,grMode,ErrCode,men:integer;
Begin(*petnash*)
{Инициализация графического режима}
grDriver:=Detect;
InitGraph(grDriver, grMode,'');
ErrCode := GraphResult;
if ErrCode <> grOk
then
begin
Writeln('Graphics error:',GraphErrorMsg(ErrCode));
Writeln('Press - <ENTER>');
Readln;
Halt;
end;
{Установка текущих параметров цвета и линии}
setcolor( 6);
setlinestyle(0,0,1);
recod; {Считывание данных из файла с лучшими результатами}
repeat
menu(men);{Процедура,обеспечивающая работу с меню}
case men of
0:game; {ИГРА}
1:best; {ЛУЧШИЕ ИГРОКИ}
2:help; {ОБ ИГРЕ}
end;(*case*)
until men=3; {ВЫХОД ИЗ ИГРЫ}
closegraph {Выход из графического режима в текстовой}
END.(*petnash*)
Текст модуля
Unit petnash1;
(**************)Interface(*****************)
uses
crt,graph;
const
{Коды клавиш,используемых в программе }
Up=#72;
Down=#80;
Left=#75;
Right=#77;
Space=#32;
Esc=#27;
Enter=#13;
type
strok=string[10];
var
stroka:array[1..12] of strok;
f02,f03:text;
st02:string[10];
stl2:string[20];
a,b2,pl,kl,o:char;
st,st1:string[5];
step:string[5];
u,vict:boolean;
mas:array [1..16] of integer;
a02,b3,c02,b,b1,d,e,e02,i,i1,j,n,r,steps,x,
x1,y,y1,yme:integer;
grDriver,grMode:integer;
m,m1,m2,m3:integer;
p,p1,p2,p3:pointer;
procedure recod;
procedure buk(a,b,c:integer;s:char);
procedure victory;
procedure nomer(xp,yp,ip:integer);
procedure kv(xk,yk:integer);
procedure tabl(xv,yv:integer;klv:char;var xv1,yv1:integer);
procedure menu(var ym:integer);
procedure game;
procedure best;
procedure help;
(*************)Implementation(****************)
(*Процедура считывания таблицы рекордов*)
(*из файла 'rezult.dat'*)
procedure recod;
begin(*recod*)
assign(f02,'rezult.dat');
reset(f02);{Открытие файла с результатами}
for i:=1 to 10 do {Чтение из файла}
readln(f02,stroka[i]);
end;(*recod*)
(*Процедура движения заданной буквы по экрану *)
procedure buk(a,b,c:integer;s:char);
begin (*buk*)
for I:=a downto b do
begin
{Буква рисуется темным цветом}
setcolor(1);
settextstyle(1,0,10);{Параметры текста}
outtextxy(c,i,s);
{Буква рисуется таким же цветом,
что и фон экрана}
setcolor(14);
settextstyle(1,0,10);
outtextxy(c,i,s);
end;
{Рисование буквы по ее конечным координатам}
setcolor(1);
settextstyle(1,0,10);
outtextxy(c,b,s);
end;(*buk*)
(*Процедура победы*)
procedure victory;
begin (*victory*)
{Создание на желтом фоне надписи Victoty}
setbkcolor(14);
buk(480,220,100,'V');
buk(480,220,170,'i');
buk(480,220,205,'c');
buk(480,220,255,'t');
buk(480,220,300,'o');
buk(480,220,359,'r');
buk(480,220,410,'y');
{Очерчивние надписи 2 линиями}
setcolor(4);
setlinestyle(0,0,3);
for i:=115 to 405 do
begin
delay(3);
line(i,355,i+20,355);
line(i,240,i,240);
end;
for i:=455 to 470 do
begin
delay(3);
line(i,355,i+5,355)
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);
{Рисование пунктов меню,прямоугольники синего
цвета}
setcolor(1);
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*** печатается серым цветом,
тем самым создается эффект тени}
setcolor(8);
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;
{При переходе указателя на другой пункт,
возврашение пункту меню прежнего цвета}
setfillstyle(1,1);
bar(35,145+70*ym,605,195+70*ym);
{Изменение координат указателя, в
зависимости от нажатия пользователем
однойиз клавиш управления}
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);
setcolor(1);
rectangle(10,90,130,155);
rectangle(29,119,81,146);
setlinestyle(0,0,1);
{Печать надписи и кол-ва шагов,
пока число шагов просто 0}
setcolor(4);
settextstyle(0,0,1);
outtextxy(20,100,'Number steps ');
outtextxy(40,130,'0');
setcolor(13);
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');
{Задание прежних параметров}
settextstyle(7,0,5);
setfillstyle(1,11);
{Включение генератора случайных чисел}
randomize;
{Заполнение массива случайными числами
от 1 до 15}
mas[16]:=0;
mas[1]:=random(14)+1;
n:=2;
repeat
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);
{Разкраска коробки}
setfillstyle(1,8);
floodfill(157,90,13);
setfillstyle(1,3);
floodfill(168,82,13);
floodfill(513,90,13);
setfillstyle(1,11);
{Нумерация табличек}
n:=1;
for j:=0 to 3 do
for i:=0 to 3 do
if (i<>3) or (j<>3) then
begin
nomer(i,j,n);
n:=n+1;
end;
x1:=3;
y1:=3;
x:=3;
y:=3;
{Рисование таблички в нижнем правом
углу,пока не сделанно ни одного хода}
setcolor(1);
setfillstyle(1,11);
bar3d(418,358,493,433,7,true);
repeat
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);
setcolor(13);
nomer(x1,y1,i);
n:=mas[i1]; {Перестановка элементов
массива}
mas[i1]:=mas[i];
mas[i]:=n;
x1:=x;
y1:=y;
steps:=steps+1; {Увеличение числа
шагов на единицу}
{Вывод на экран числа шагов}
setfillstyle(1,7);
bar(30,120,80,145);{Рисование табл.}
setcolor(4);
str(steps,st1);
settextstyle(0,0,1);
outtextxy(40,130,st1);
setcolor(13);
settextstyle(7,0,5);
setfillstyle(1,11);
{Проверка следования чисел в массиве}
u:=true;
j:=0;
n:=0;
repeat
j:=j+1;
n:=n+1;
if (n<>mas[j]) and (n<>12)
then u:=false;
if (n=11) and (mas[12]=0)
then j:=j+1;
until mas[j]=15;
if u and ((mas[15]=15) or
(mas[16]=15))
then
begin(*if3*)
pl:=Esc;{Выход из цикла}
vict:=true;{Инициализация победы}
end;(*if3*)
end;(*if2*)
end;(*if1*)
{Игрок нажал клавишу Esc}
if kl=Esc
then
begin (*if*)
{Помещение странички в буфер
посредством разбиения
ее на 4 части}
m:=imagesize(0,0,320,240);
getmem(p,m);
getimage(0,0,320,240,p^);
m1:=imagesize(320,0,639,240);
getmem(p1,m1);
getimage(320,0,639,240,p1^);
m2:=imagesize(0,240,320,480);
getmem(p2,m2);
getimage(0,240,320,480,p2^);
m3:=imagesize(320,240,639,480);
getmem(p3,m3);
getimage(320,240,639,480,p3^);
{Вывод меню, после того как игрок
нажал Esc}
cleardevice;
setbkcolor(0);
b3:=0;
repeat
{Рисование двойной рамочки}