МИНИСТЕРСТВО ОБРАЗОВАНИЯ РФ
АРХАНГЕЛЬСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
КУРСОВАЯ РАБОТА
Тема: «Игровая программа <15> »
2008
Оглавление.
1.Задание
Введение
3.Анализ и математическая постановка задачи
4.Разработка схемы алгоритма и её описание
4.1 Описание алгоритма работы основной программы
4.2 Детализация отдельных участков программы
4.3 Графический интерфейс программы <15>
5.Разработка программы
5.1 Текст программы
5.2 Описания используемых типов, глобальных переменных, процедур и функций.
5.3 Назначение и область применения программы
5.4 Входные и выходные данные
5.5 Используемые технические и программные средства
6.Описание процесса отладки
7.Инструкция пользователя
8.Заключение
9.Список литературы
Задание.
Смоделировать логическую игру «Пятнашки».
Программа случайным образом располагает на игровом поле фишки с пятнадцатью цифрами и одну пустую клеточку.
Играющий, используя резервную клеточку, с помощью функциональных клавиш перемещает фишки с цифрами таким образом, чтобы расположить их по порядку.
Программа фиксирует количество перемещений. Лучшим считается тот игрок, который упорядочит все фишки за наименьшее число ходов.
Введение
Массовое производство персональных компьютеров, периферийных устройств и соответствующего прикладного и системного программного обеспечения обеспечило доступ к вычислительной технике сотням миллионов людей и ее внедрение практически во все сферы деятельности человека.
Широкое и многообразное применение ЭВМ предъявляет все более высокие требования к их программному обеспечению. В настоящее время насчитываются десятки языков программирования, c помощью которых можно общаться с вычислительной машиной.
Решение задачи на том или ином языке программирования зависит от характера задачи, конструкции и возможностей вычислительной машины, ресурса времени, на ее решение, квалификации программиста и т.д.
Среди используемых в настоящее время языков программирования большое распространение получил язык Паскаль.
Язык Паскаль имеет уже двадцатилетнюю историю. Первая версия языка, предложенного его автором — профессором кафедры вычислительной техники Швейцарского федерального института технологии — Никласом Виртом, появилась еще в 1968 г. как альтернатива существующим и все усложняющимся языкам программирования, таким, как ПЛ/1, АЛГОЛ и ФОРТРАН, призванная облегчить изучение и использование языков программирования при сохранении их инструментальных средств.
В начале 80-х годов ПАСКАЛЬ еще более упрочил свои позиции с появлением трансляторов MS PASCAL и Turbo PASCAL для персональных ЭВМ. С этого времени язык Паскаль становится одним из наиболее важных и широко используемых языков программирования.
По своей идеологии Паскаль более близок к современной методике и технологии программирования. В частности, этот язык весьма полно отражает идеи структурного программирования, что отчетливо проявляется в основных управляющих структурах, предусмотренных в языке. Паскаль широко приспособлен для применения общепризнанной в настоящее время технологии нисходящего проектирования (пошаговой детализации). Это проявляется в том, что Паскаль может успешно использоваться для записи программы на разных уровнях ее детализации, не прибегая к помощи блок-схем или специального языка проектирования программ.
Паскаль предоставляет весьма гибкие возможности в отношении используемых структур данных. Как известно, простота алгоритмов, а значит трудоемкость их разработки и их надежность, существенно зависят от того, насколько удачно будут выбраны структуры данных, используемые при решении поставленной задачи.
Анализ и математическая постановка задачиЦелью курсовой работы является написание игровой программы “Пятнашки “. Программа располагает на экране игровое поле размером 4*4.На поле расположено 15 фишек с цифрами и одна пустая клеточка, которая будет использоваться для перемещения. Нумерация фишек происходит произвольным образом.
Фишка, которую пользователь собирается переместить на новое место, должна распологаться рядом с пустой клеточкой. Если данное условие выполняется, то игрок может переместить фишку на новое место, иначе игрок выбирает новую фишку. Игра продолжается до тех пор, пока игрок не расставит фишки по порядку (номера фишек должны располагаться по возрастанию слева-направо, сверху-вниз), либо не пожелает выйти из игры досрочно.
В процессе игры программа должна фиксировать число перемещений фишек сделанных игроком. После того, как фишки будут расположены по порядку, программа сравнивает результат с другими результатами и, если он превосходит один из рекордов, то сразу заносится в таблицу результатов. Рассмотрим, каким образом программа может быть построена с математической (логической) точки зрения. Для этого определимся с теми действиями, которые должна будет выполнять программа:1. Формирование одномерного массива содержащего 16 элементов 2. Заполнение массива числами 1, 2, 3, 4, ... 15 (один элемент массива остается пустым, он будет в дальнейшем представлять пустую клеточку) Элементы массива задаются случайным образом, с помощью генератора случайных чисел 3. Иизменение пользователем порядка расположения чисел в массиве4. Подсчет количества перемещений элементов в массиве5. Проверка расположения элементов в массиве.
6. Если элементы расположены по порядку, то программа фиксирует победу, в противном случае осуществляется переход к пункту №3
Повышенное внимание следует уделить пункту №3 {Иизменение пользователем порядка расположения чисел в массиве}. Программа должна предоставлять пользователю наглядную и удобную возможность перестановки элементов массива. Ввиду того, что игровое поле содержит всего одну пустую клетку, можно сформулировать простой принцип для каждой значащего элемента массива (здесь и далее условимся, что расположение фишек игрового поля будет полностью соответствовать расположению элементов в массиве на каждом этапе игры). Этот принцип заключается в том, что в случае, если возможность сдвига какой-либо фишки игрового поля существует, то она единственна. Сдвиг при этом происходит в сторону пустой клеточки.
Ввыделим основные этапы, которые должны будут реализовываться при выполнении пункта №3:
1. Пользователь выбирает одну из фишек игрового поля
2. Пользователь желает сдвинуть выбранную фишку
3. Происходит анализ возможности сдвига. Сдвиг возможен только в том случае, если активизированный элемент массива находится рядом с пустым элементом массива. Если условие не выполняется, то происходитпереход к пункту №1
4. Осуществляется сдвиг. В этом случае происходитследующая операция: активизированный элемент массиваоказывается на месте пустого элемента,а тот, в свою очередь, оказываетсянаместе активизированного
5. Число шагов сделанных пользователем увеличивается на единицу
После выполнения первых пяти пунктов происходит возвращение к пункту №1
На данном этапе детализации самых сложных, и в тоже время наиболее интересных, пунктов задачи можно прерваться и перейти к разработке алгоритма. Оставшиеся пункты не представляют из себя особой сложности и поэтому не нуждаются в столь подробной детализации.
Разработка схемы алгоритма и её описаниеОписание алгоритма работы основной программы
Логическая работа программы построена на цикле с постусловием. В теле цикла находится процедура, обеспечивающая работу пользователя с меню, и оператор варианта, который содержит три основных процедуры программы (в зависимости от того, какое значение имеет выражение селектор выполняется одна из процедур).
Структурограмма основной программы
Цикл с постусловием выполняется до тех пор, пока пользователь не выберет в меню команду {E x i t}. В этом случае происходит завершение работы в графическом режиме и осуществляется переход в текстовой режим, а затем происходит выход из основной программы.
Ррезультат выполнения оператора варианта зависит от того, какое значение будет иметь параметр – переменная (далее просто параметр) процедуры, которая обеспечивает работу с меню(далее в тексте просто процедура menu).Выражение селектор оператора варианта принимает те же значения, что и выходной параметр процедуры menu.Отметим то, что ветвь оператора else отсутствует. Таким образом, если значение выражения-селектор не совпадает ни с одной из меток варианта оператора case, то данный оператор считается пустым и пропускается.
Параметр процедуры menu может принимать одно из четырех значений: 0, 1, 2, 3.Оператор case, в свою очередь содержит три метки : 0, 1, 2. Когда параметр принимает значение равное 3 (что соответствует пункту меню {Exit}), то оператор case пропускается и происходит выход из цикла и завершение работы программы, о чем было сказано выше.
Таким образом структура основной программы достаточно проста и не вызывает особых сложностей в ее понимании. Далее будут рассмотрены более детально основные блоки алгоритма программы, что позволит разобраться в работе всей программы в целом.
Детализация отдельных участков программы
Итак, перейдем к более детальному рассмотрению отдельных участков алгоритма программы. Прежде всего, cкажу несколько слов о том, что представляет из себя процедура menu.
В первую очередь она обеспечивает интерфейс меню программы <15> и работу с ним пользователя. На экране игрок наблюдает меню, состоящее из 4-x пунктов. Выбор того или иного пункта осуществляется с помощью стандартных клавиш (up,down), что не сомненно очень удобно для любого пользователя, работающего с данной программой. Перемещение по пунктам меню осуществляется посредством цикла с постусловием. В теле цикла располагается несколько операторов условного перехода. В зависимости от того, какая клавиша нажата(up или down), переменной присваивается некоторое значение. После этого координаты указателя изменяются, и он становится на соответствующий пункт (в качестве указателя выступает закрашенный прямоугольник, цвет которого отличается от цвета пунктов меню). Далее проверяется условие выхода из цикла. Если нажата клавиша Enter, то осуществляется выход из цикла, иначе пользователь выбирает другой пункт меню. Таким образом, перемещение по пунктам меню происходит до тех пор, пока не нажата клавиша ввода.
Когда пользователь нажимает ввод, то происходит выход из цикла и, то значение, которое имеет параметр-переменная процедуры menu передается в оператор варианта.Итак, если значение параметра 0,то начинается игра.
В этом случае осуществляется очистка экрана. Числу шагов, сделанных пользователем присваивается значение ноль. Далее следует создание интерфейсной части игры. В частности печать на
экране различных сообщений (как выйти из игры, число ходов, сделанных игроком), заливка фона экрана, рисование коробочки с последующей ее раскраской. До тех пор пока игрок не сделал ни одного перемещения число шагов равно нулю и на экране просто печатается значение 0.
Как только игрок поизведет первую перестановку, колличество шагов увеличивается на единицу и это сразу отображатся на экране. Для этого каждый раз приходится обновлять ту область экрана, где осуществляется печать результата. Это достигается путем рисования в это области каждый раз нового графического объекта, в данном случае прямоугольной области. Цвет последней на порядок светлее, чем цвет, которым выводится число перестановок. Так как колличество перемещений постоянно изменяется, то данная операция(обновление области) должна осуществляться циклически, Поэтому она находится в основном цикле с постусловием, который будет описан чуть позже. Отмечу еще одну не мало важную деталь, для того, что бы вывести результат на экран необходимо предварительно преобразовать число в последовательность символов.
После того как разработана интерфейсная часть игры(хотя по ходу будут некоторые дополнения) производится заполнение массива случайными числами. Для этого сначала осуществляется инициализация генератора случайных чисел. Непосредственно после этого происходит заполнение массива. Последний элемент массива задается равным 0.
Mas[16]:=0
Первый элемент массива задается до выполнения цикла следующим образом:
Mas[1]:=random[14]+1
Так как процедура random в данном случае выбирает целое число в интервале от 0 до 14, то необходимо добавление к этому числу 1, что бы избежать значение 0. Заполнение остальных элементов массива осуществляется посредством цикла с постусловием. В цикле происходит задание очередного элемента массива с помощью процедуры random и проверка не равен ли данный элемент предыдущим элементам. Если оказывается, что
последующий элемент равен одному из предыдущих, то он задается еще раз. Данная операция осуществляется в цикле с предусловием, который выполняется пока некоторая логическая переменная имеет значение истина. Значение фальш переменная принимает в том случае, если значения предыдущих элементов массива не совпадают со следующим.
ря работает до тех пор, пока не будет заполнен весь массив.
Цикл с параметром используется для того, чтобы перебрать все элементы массива до 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;
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
{Рисование двойной рамочки}
setcolor(1);
setlinestyle(0,0,1);
rectangle(243,183,417,257);
rectangle(248,188,412,252);
setfillstyle(1,14);{Орнамент и
цвет заполнения указателя}
{Указатель-выбор пункта}
bar(250,190+30*b3,410,220+30*b3);
setcolor(13);
settextstyle(8,0,1);
outtextxy(275,195,'Continue . .
.');
outtextxy(275,220,'Exit ');
b2:=readkey;
setfillstyle(1,0);
bar(250,190+30*b3,410,220+30*b3);
{Движение по пунктам меню}
if b2=up then b3:=0;
if b2=down then b3:=1;
if b3=0
then kl:='z'{Выбран пункт
Continue}
else kl:=Esc{Выбран пункт Exit}
until b2=Enter;
end; (*if*)
{Если выбран пункт Continue,то
страничка возвращается из буфера,а
затем буфер очищается}
if kl='z'
then
begin
cleardevice;
setbkcolor(7);
putimage(0,0,p^,normalput);
freemem(p,m);
putimage(320,0,p1^,normalput);
freemem(p1,m1);
putimage(0,240,p2^,normalput);
freemem(p2,m2);
putimage(320,240,p3^,normalput);
freemem(p3,m3);
settextstyle(7,0,5);
setfillstyle(1,11)
end
until (kl=Esc) or (pl=Esc) ;
{Демонстрация победы после завершения игры}
if vict then
begin(*vict*)
cleardevice;{Очистка экрана}
victory;{Процедура победы}
{Вывод на экран числа шагов,сделанных
пользователем, и поздравления}
setcolor(4);
settextstyle(7,0,5);
outtextxy(100,50,'You are win ! ! !');
str(steps,step);
outtextxy(100,100,'You made');
outtextxy(150,150,step);
outtextxy(250,150,'steps.');
repeat
until keypressed;
kl:=readkey;
i:=0;
{Сравнение результатов}
repeat
i:=i+1;
val(stroka[i*2],b,x);
until (b>steps) or (i=6);
{Если результат игрока превосходит один из
результатов в таблице,он заносится в
таблицу}
if i<6 then
begin(*Переформирование таблицы
рекордов*)
for j:=5 downto i do
begin(*Сдвиг рекордов*)
stroka[j*2+1]:=stroka[j*2-1];
stroka[j*2+2]:=stroka[j*2];
end;(*Сдвиг рекордов*)
{Преглашение игрока к вводу имени}
cleardevice;
setbkcolor(0);
outtextxy(10,130,'Please, enter your
name :');
{Создание рамочки}
setcolor(10);
rectangle(100,225,525,290);
rectangle(98,223,527,292);
{Ввод имени игрока}
kl:=readkey;
j:=1;
stroka[i*2-1]:='';
u:=not(kl=enter);
while u do
begin(*Чтение имени игрока*)
u:=(kl>' ') and (kl<'z') and (j<11);
if u
then
begin(*нц*)
stroka[i*2-1]:=stroka[i*2-1]+kl;
outtextxy(80+j*40,230,kl);{Печать
буквы на новой позиции}
j:=j+1;
end;(*кц*)
kl:=readkey;
u:=not(kl=Enter);
end;(*Чтение имени игрока*)
{Если игрок не ввел имя, то его имя
Noname}
if length(stroka[i*2-1])=0
then stroka[i*2-1]:='Noname';
stroka[i*2]:=step;
(*Запись рекорда в файл*)
rewrite(f02);
for i:=1 to 10 do
writeln(f02,stroka[i]);
close(f02);
end;(*Переф. табл. рекорд.*)
end;(*vict*)
end;(*game*)
(*Процедура вывода таблицы рекордов*)
procedure best;
begin(*best*)
cleardevice; {Очистка экрана}
{Рисование двойной рамочки}
setlinestyle(0,0,3);
setcolor(13);
rectangle(13,138,621,434);
rectangle(9,132,625,440);
setlinestyle(0,0,1);
{Задание параметров заполнения рамочки}
setfillstyle(1,14);
floodfill(24,140,13);
{Надпись лучшие игроки}
setcolor(10);
settextstyle(7,0,7);
outtextxy(30,45,'Best players are:');
{Печать таблицы результатов}
setcolor(13);
settextstyle(0,0,100);
for a02:=1 to 5 do
begin(*for a02*)
str(a02,stl2);{Преобразование числа в
посл-ть}
c02:=length(stroka[a02*2-1]);
stl2:=stl2+' '+stroka[a02*2-1];
for e02:=1 to 11-c02 do{Разделение имени
игрока и результата точками}
stl2:=stl2+'.';
for e02:=1 to 5-length(stroka[a02*2]) do
stl2:=stl2+'.';
stl2:=stl2+stroka[a02*2];
outtextxy(40,100+50*a02,stl2);
if a02<>0 then setcolor(9); {Выделение
лучшего игрока другим цветом}
end;(*for a02*)
repeat
until keypressed;
kl:=readkey;
setcolor(13);
end;(*best*)
(*Процедура вывода помощи*)
procedure help;
var
st3:string;
begin(*help*)
assign(f03,'pravila.dat');
reset(f03); {Открытие файла pravila.dat}
closegraph; {Выход из графического режима}
clrscr; {Очистка экрана}
kl:='n';
while not(eof(f03)) {Не конец файла} and
(kl<>Esc) {Не нажата кл. Esc} do
begin {нц1}
i:=1;
while (i<25) {Страница} and not(eof(f03)) do
begin {нц2}
i:=i+1;
readln(f03,st3); {Чтение из файла
элементов строки st3}
writeln('',st3); {Печать
содержимого строки st3 }
{Условие необходимое для того,
чтобы в конце не нажимать Enter 2 раза}
if eof(f03)
then kl:=enter
else kl:=#10
end;{кц2}
gotoxy(12,25);
repeat {Ожидание нажатия клавиши Enter
или Esc}
if keypressed then kl:=readkey;
until (kl=enter) or (kl=esc);
end;{кц1}
clrscr;
gotoxy(21,12);
writeln('Нажмите любую клавишу для выхода в
меню');
repeat
until keypressed;
kl:=readkey;
kl:='n';
{Инициализация графического режима и установка
прежних параметров}
InitGraph(grDriver, grMode,'');
setbkcolor(11);
setcolor(13);
setlinestyle(0,0,3);
end;(*help*)
END.
Описания используемых типов, глобальныхпеременных, процедур и функций.
В программе <15> были использованы следующие типы:
type
strok = string[10];
Данный тип используется в файле, который хранит результаты лучших игроков.
В программе <15> были использованы следующие глобальные переменные:
Stroka : array[1..12] of strok;
Массив, элементами которого являются строки длинною в десять символов, используется в файле, который хранит результаты лучших игроков.
f02,f03:text;
Текстовые переменные (файлов rezult.dat,pravila.dat)
st02:string[10];
Cтрока длинною в 10 символов,используется для работы с таблицей
stl2:string[20];
Строка длинною в 20 символов,используется для работы с таблицей
a,b2,pl,kl,o:char;
Переменные,которым присваиваются значения различных клавиш
st:string[5];
Номер фишки
st1,step:string[5];
Число ходов,преобразованных в последовательность символов
u:boolean;
Логическая переменная,принимающая значение true или false,используется при чтении имени игрока
vict:boolean;
Инициализирует процедуру победы,в случае если vict=true
mas:array [1..16] of integer;
Массив номеров фишек,элемент массива принимает случайное значение от 1 до 16
p,p1,p2,p3:pointer;
Переменная типа-указатель, в которую помещается адрес выделенной области
m,m1,m2,m3:integer;
Размер создаваемой переменной в байтах
Далее идет описание переменных типа integer:
grDriver-тип графического драйвера
ErrCode-значение ф-ии graphresult
i,j,n-параметры циклов
i1-номер пустой позиции
grMode-режим работы граф. адаптера
steps-текущее кол-во шагов
x,x1,y,y1-относительные координаты
st02-имя или кол-во очков игрока
a02-параметр цикла
c02-длина имени игрока
e02-параметр цикла
b- кол-во очков в табл. рекордов
men- положение курсора в меню
Процедуры
procedure recod;
Данная процедура осуществляет считывание данных из файла, содержащего имена и результаты лучших игроков
procedure zz1(a,b,c:integer;s:char);
Используется для перемещения заданной буквы по экрану
procedure victory;
Создает эффект осыпания букв на экран. В результате получается надпись Victory.
procedure nomer(xp,yp,ip:integer);
Преобразует номер пятнашки в последовательность символов, с последующей печатью на соответствующей фишке
procedure kv(xk,yk:integer);
Рисование параллелепипеда
Procedure tabl(xv,yv:integer;klv:char;var xv1,yv1:integer);
Процедура смены активной табличики. В зависимости от того, какая клавиша нажата UP,DOWN,LEFT,RIGHT соответствующим образом изменяются координаты таблички, и та фишка, которая была активизирована, рисуется таким же цветом, как и все остальные, а новая активизированная фишка прорисовывается другим цветом.
procedure menu(var ym:integer);
Обеспечивает работу пользователя с меню и создание интерфейсной части меню программы <15> (более подробно эта процедура описывается в разделе алгоритмизации)
procedure game;
Процедура начала игры, осуществляет подготовку к игре всех необходимых параметров и обеспечивает сам процесс игры
procedure best;-процедура вывода в графическом режиме таблицы с лучшими результатами
procedure help;-процедура вывода помощи в игре
Последние три процедуры подробно описываются в разделе алгоритмизации.
Назначение и область применения программы.
Цель создания данной программы - развлечение играющих, совершенствование их умственного и логического мышления. Программа может применяться в качестве игровой на разных типах персональных компьютеров и распространяется как freeware, при соблюдении условия as is.
Входные и выходные данные.
Входные данные - коды нажатых в режиме реального времени клавиш, а именно клавиши управления курсором UP, DOWN, LEFT, PIGHT, а так же ESC и ENTER.
Выходные данные - графическая информация на дисплее, файлы данных, содержащие список рекордов и помощь игроку.
Используемые технические и программные средства
Программа была написана и откомпилирована наPent 733/256/64mGF/40Gb под управлением операционной системы WinXp.
Техническая документация к игровой программе <15> была подготовлена с помощью Microsoft Word 2002 в операционной среде WINDOWS XP.
Текст программы написан в среде программирования Borland Pascal 7.0
Описание процесса отладки
После нескольких первоначальных попыток компиляции программы были получены сообщения об синтаксических ошибках. После выявления причин появления ошибок они были устранены, после чего программа компилировалась без ошибок.
Во время работы программы так же выявлены некоторые недочеты, которые были устранены после доработки программы.
Инструкция пользователя
Программа запускается под управлением операционной системы MS-DOS из каталога, в котором содержатся следующие файлы:
petnash.exe - выполняемый файл
rezult.dat - файл данных, содержащий список рекордов.
pravila.dat- файл, содержащий информацию об игре
tscr.chr, trip.chr, lcom.chr- файлы данных, содержащие шрифты
Для работы программы требуется от 50 килобайтов свободной оперативной памяти, видеоадаптер и процессор.
Для того, что бы запустить игру загрузите файл рetnach.exe,который находится в основном каталоге.
После небольшой заставки вы попадете в основное меню,содержащее следующие пункты :
1 Game
2 Best players
3 About this game
4 Exit
При выборе пункта :
Game - вы попадаете соответственно в игру
Best players - вам предоставляется список лучших игроков
About this game - вы получаете полную информацию об игре "15",то есть ту информацию, которую вы изучаете в данный момент
Exit - выход в DOS
ПРАВИЛА
Для начала игры, выберите в главном меню пункт Game и нажмите Enter. На экране Вашего компьютера появится коробочка с табличками пронумерованными от 1 до 15 и одна пустая фишка.
Например:
Ваша задача, передвигая пятнашки по дну коробочки, расположить их в порядке возрастания как это представленно на следующих рисунках :
Наилучшим результатом считается выполнение задания за наименьшее число ходов. Ходом считается передвижение одной пятнашки на одну позицию. Если вы собрали 'пятнашки' за наименьшее число ходов по сравнению с результатами предшествуюших игроков, то ваш результат заносится в список лучших игроков.
Для выбора пятнашки используйте следующие клавиши на
вашей клавиатуре:
UP
LEFTRIGHT
DOWN
Для того, что бы передвинуть пятнашку на свободное место
используйте клавишу пробел.
Заключение
При разработке курсовой работы мною были изучены многие аспекты программирования на языке Borland Pascal 7.0, такие как работа с динамическими данными, файлами, вывод информации в графических режимах, определение процедур и функций, использование параметров командной строки, организация модульной структуры программы.
При оформлении курсовой работы был получены навыки оформления программной документации, а также большой практический опыт работы в Microsoft Word 2002 и Borland Pascal 7.0.
Список литературы
Конструирование программ, Методические указания №2133 к курсовой работе, Рязань, РГРТА, 1993.
А.М. Епанешников, В.А. Епанешников, Программирование в среде Turbo Pascal 7.0, М, Диалог-Мифи, 1998
Новичков В. С., Парфилова Н. И., Пылькин А. Н., Паскаль,
М, Высшая школа, 1994
Питер Нортон, Персональный компьютер изнутри, М, Бином, 1995
http://pascal.dax.ru/ - Всё о Turbo Pascal
http://borlpasc.narod.ru/ - Информация о Turbo Pascal