Смекни!
smekni.com

Игровая программа 15 (стр. 3 из 5)




Графический интерфейс программы <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

{Рисование двойной рамочки}