скачать рефераты
  RSS    

Меню

Быстрый поиск

скачать рефераты


Цикл с параметром используется для того, чтобы перебрать все элементы массива до n-1 и проверить, нет ли среди них элемента, значение которого совпадает со значением n-ого элемента. Если такового не оказывается, то n-ому элементу присваивается текущее значение.

 После того, как массив оказывается заполненным можно приступать к рисованию фишек игрового поля и их нумерации соответствующими числами из массива.

 В качестве фишки игрового поля используется параллелепипед, координаты которого меняются с помощью двух циклов с параметром. Таким образом, вырисовываются все 16 фишек.

 После того как оформлено‘ игровое поле, случайным образом сформирован массив чисел, следует этап, на котором происходит обработка результата нажатия пользователем клавиши. Игрок активизирует одну из фишек при помощи клавиш UP, DOWN, LEFT,

RIGHT. Коды соответствующих клавиш обрабатываются, и в зависимости от того какая клавиша нажата, происходит изменение координат курсора передвигающегося по фишкам игрового поля. Первоночально координаты курсора подобранны так, что бы он находился в правом нижнем углу.

 Как только пользователь попытается ‘сдвинуть‘ активизированную фишку на пустую клеточку (с помощью клавиши пробела), то здесь происходит обработка ситуации на возможность сдвига. Если фишка, которую выбрал пользователь, расположена рядом с пустой клеточкой, то происходит обмен. Элементы массива меняются местами.

 Если обмен произошел, то число шагов увеличивается на единицу и производится печать на экране нового числа (данная процедура была описана на начальной стадии алгоритмизации).

 Изменив положение чисел в массиве, следует проверить не расположились ли они по порядку. Если элементы действительно расположены по возрастанию, то происходит инициализация процедуры победы. Результат игрока сравнивается с лучшими результатами. В том случае, если он превосходит хотя бы один из рекордов, производится запрос имени игрока. После того, как игрок введет свое имя, происходит обновление файла, содержащего лучшие результаты.

Если элементы расположены не по порядку, то игрок продолжает перестановку.Пользователь может выйти из игры, нажав клавишу Esc. Для удобства предусмотрен выход из программы посредством меню. Для этого приходится сохранять видео страничку в буфере. Если пользователь подтверждает желание выйти, буфер очищается и потом игрок попадает в главное меню. В ином случае видео страница извлекается из буфера, а затем происходит его очистка. Тем самым пользователь застрахован от случайного нажатия клавиши Esc.

Вывод таблицы рекордов

 Прежде всего, осуществляется считывание результатов из файла.

После этого следует процедура очистки экрана. Затем происходит создание фона, на котором будут выводиться данные из файла. Распечатка осуществляется без выхода из графического режима, благодаря чему таблица получается красочной и приятной для восприятия. В текстовом режиме создать такой эффект невозможно. Имя игрока и его результат разделяются точками. Имя игрока, имеющего лучший результат, выделяется другим цветом.
 В принципе это основные действия, которые необходимо выполнить для того, что бы пользователь мог ознакомиться с лучшими результатами. В остальном все зависит от вкусов программиста и чаще всего состоит в непосредственной записи выполняемых действий с помощью операторов и стандартных процедур выбранного языка программирования.


Вывод помощи

 Вывод помощи в игре, так же как и таблицы рекордов, осуществляется посредством считывания из файла. Пожалуй, единственное и главное различие состоит в том, что здесь все действия производятся в текстовом режиме.

 Перед тем, как осуществлять печать данных из файла, происходит выход из графического режима и очистка экрана. Затем

данные распечатываются блоками по 24 строки. Каждый раз проверяется условие, закончен ли файл и не нажал ли игрок Esc.После каждого блока пользователь должен подтвердить продолжение вывода помощи, нажав клавишу Enter, либо прервать вывод, нажав клавишу Esc. И в первом и во втором случае игрок попадает в меню программы <15>.



 


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

Страницы: 1, 2, 3


Новости

Быстрый поиск

Группа вКонтакте: новости

Пока нет

Новости в Twitter и Facebook

  скачать рефераты              скачать рефераты

Новости

скачать рефераты

Обратная связь

Поиск
Обратная связь
Реклама и размещение статей на сайте
© 2010.