МИНИСТЕРСТВООБРАЗОВАНИЯ РФ
АРХАНГЕЛЬСКИЙГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
КУРСОВАЯ РАБОТА
Тема: «Игроваяпрограмма »
2008
Оглавление.
1.Задание
2. Введение
3.Анализ и математическая постановказадачи
4.Разработка схемы алгоритма и еёописание
4.1 Описание алгоритма работыосновной программы
4.2 Детализация отдельных участковпрограммы
4.3 Графический интерфейс программы
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. Число шагов сделанных пользователемувеличивается на единицу
6. Послевыполнения первых пяти пунктов происходит возвращение к пункту №1
На данном этапедетализации самых сложных, и в тоже время наиболее интересных, пунктов задачиможно прерваться и перейти к разработке алгоритма. Оставшиеся пункты непредставляют из себя особой сложности и поэтому не нуждаются в столь подробнойдетализации.
Разработка схемыалгоритма и её описаниеОписание алгоритма работы основной программы
Логическая работа программы построена нацикле с постусловием. В теле цикла находится процедура, обеспечивающая работупользователя с меню, и оператор варианта, который содержит три основныхпроцедуры программы (в зависимости от того, какое значение имеет выражение селекторвыполняется одна из процедур).
Структурограмма основной программы/> /> /> /> /> /> Инициализация графического режима /> /> /> /> /> /> /> /> /> />
Цикл с постусловием выполняется до техпор, пока пользователь не выберет в меню команду {E x i t}. В этом случае происходитзавершение работы в графическом режиме и осуществляется переход в текстовойрежим, а затем происходит выход из основной программы.
Ррезультат выполненияоператора варианта зависит от того, какое значение будет иметь параметр –переменная (далее просто параметр) процедуры, которая обеспечивает работу сменю(далее в тексте просто процедура menu).Выражение селектор оператора варианта принимает те же значения, что ивыходной параметр процедуры menu.Отметимто, что ветвь оператора elseотсутствует. Таким образом, если значение выражения-селектор не совпадает ни содной из меток варианта оператора case, то данный оператор считается пустым и пропускается.
Параметр процедуры menu может принимать одно из четырехзначений: 0, 1, 2, 3.Оператор case,в свою очередь содержит три метки: 0, 1, 2. Когда параметр принимает значениеравное 3 (что соответствует пункту меню {Exit}), то оператор case пропускается и происходит выход из цикла и завершениеработы программы, о чем было сказано выше.
Таким образом структураосновной программы достаточно проста и не вызывает особых сложностей в еепонимании. Далее будут рассмотрены более детально основные блоки алгоритмапрограммы, что позволит разобраться в работе всей программы в целом.
Детализацияотдельных участков программы Итак, перейдем кболее детальному рассмотрению отдельных участков алгоритма программы. Преждевсего, cкажу несколько слов о том, что представляет из себяпроцедура menu.
В первую очередь онаобеспечивает интерфейс меню программы и работу с ним пользователя.На экране игрок наблюдает меню, состоящее из 4-x пунктов. Выбор того или иного пункта осуществляется спомощью стандартных клавиш (up,down), что не сомненно очень удобно длялюбого пользователя, работающего с данной программой. Перемещение по пунктамменю осуществляется посредством цикла с постусловием. В теле цикларасполагается несколько операторов условного перехода. В зависимости от того,какая клавиша нажата(up илиdown), переменной присваивается некотороезначение. После этого координаты указателя изменяются, и он становится насоответствующий пункт (в качестве указателя выступает закрашенныйпрямоугольник, цвет которого отличается от цвета пунктов меню). Далее проверяетсяусловие выхода из цикла. Если нажата клавиша Enter, то осуществляется выход из цикла, иначе пользовательвыбирает другой пункт меню. Таким образом, перемещение по пунктам менюпроисходит до тех пор, пока не нажата клавиша ввода.
Ym:=0
/>
Когда пользовательнажимает ввод, то происходит выход из цикла и, то значение, которое имеетпараметр-переменная процедуры menuпередается в оператор варианта.Итак, если значение параметра 0, то начинаетсяигра.
/>
В этом случаеосуществляется очистка экрана. Числу шагов, сделанных пользователем присваиваетсязначение ноль. Далее следует создание интерфейсной части игры. В частности печать на экране различныхсообщений (как выйти из игры, число ходов, сделанных игроком), заливка фонаэкрана, рисование коробочки с последующей ее раскраской. До тех пор пока игрок несделал ни одного перемещения число шагов равно нулю и на экране простопечатается значение 0. Как только игрокпоизведет первую перестановку, колличество шагов увеличивается на единицу и этосразу отображатся на экране. Для этого каждый раз приходится обновлять туобласть экрана, где осуществляется печать результата. Это достигается путемрисования в это области каждый раз нового графического объекта, в данном случаепрямоугольной области. Цвет последней на порядок светлее, чем цвет, которым выводитсячисло перестановок. Так как колличество перемещений постоянно изменяется, тоданная операция(обновление области) должна осуществляться циклически, Поэтомуона находится в основном цикле с постусловием, который будет описан чуть позже.Отмечу еще одну не мало важную деталь, для того, что бы вывести результат наэкран необходимо предварительно преобразовать число в последовательность символов.После того какразработана интерфейсная часть игры(хотя по ходу будут некоторые дополнения)производится заполнение массива случайными числами. Для этого сначалаосуществляется инициализация генератора случайных чисел. Непосредственно послеэтого происходит заполнение массива. Последний элемент массива задается равным0.Mas[16]:=0Первый элементмассива задается до выполнения цикла следующим образом:Mas[1]:=random[14]+1 Так как процедура random в данном случаевыбирает целое число в интервале от 0 до 14, то необходимо добавление к этомучислу 1, что бы избежать значение 0. Заполнение остальных элементов массиваосуществляется посредством цикла с постусловием. В цикле происходит заданиеочередного элемента массива с помощью процедуры random и проверка неравен ли данный элемент предыдущим элементам. Если оказывается, что
последующий элемент равенодному из предыдущих, то он задается еще раз. Данная операция осуществляется вцикле с предусловием, который выполняется пока некоторая логическая переменнаяимеет значение истина. Значение фальш переменная принимает в том случае, еслизначения предыдущих элементов массива не совпадают со следующим.
mas[16]:=0
mas[1]:=random[14]+1
n:=2 />/>/>/>/>/>/>/>/>/>/>/>/>/> ря работает до тех пор, пока не будетзаполнен весь массив.
u:=true
пока u истина выполнять
j:=random[15]+1
присвоить u значение false
i от 1 до n-1 делать
mas[i]=j
да нет
присвоить u
значение
истина
mas[n]:=j
n:=n+1
выполнять до тех пор, пока n не будет равно 16
Цикл с параметромиспользуется для того, чтобы перебрать все элементы массива до n-1 и проверить, нет ли среди нихэлемента, значение которого совпадает со значением n-ого элемента. Если такового не оказывается, то n-ому элементу присваивается текущеезначение.
После того, как массивоказывается заполненным можно приступать к рисованию фишек игрового поля и ихнумерации соответствующими числами из массива.
В качестве фишкиигрового поля используется параллелепипед, координаты которого меняются спомощью двух циклов с параметром. Таким образом, вырисовываются все 16 фишек.
После того как‘оформлено‘ игровое поле, случайным образом сформирован массив чисел, следуетэтап, на котором происходит обработка результата нажатия пользователем клавиши.Игрок активизирует одну из фишек при помощи клавиш UP, DOWN, LEFT,
RIGHT. Коды соответствующих клавишобрабатываются, и в зависимости от того какая клавиша нажата, происходитизменение координат курсора передвигающегося по фишкам игрового поля.Первоночально координаты курсора подобранны так, что бы он находился в правомнижнем углу.
Как только пользовательпопытается ‘сдвинуть‘ активизированную фишку на пустую клеточку (с помощьюклавиши пробела), то здесь происходит обработка ситуации на возможность сдвига.Если фишка, которую выбрал пользователь, расположена рядом с пустой клеточкой,то происходит обмен. Элементы массива меняются местами.
Если обмен произошел, точисло шагов увеличивается на единицу и производится печать на экране новогочисла (данная процедура была описана на начальной стадии алгоритмизации).
Изменив положение чиселв массиве, следует проверить не расположились ли они по порядку. Если элементыдействительно расположены по возрастанию, то происходит инициализация процедурыпобеды. Результат игрока сравнивается с лучшими результатами. В том случае,если он превосходит хотя бы один из рекордов, производится запрос имени игрока.После того, как игрок введет свое имя, происходит обновление файла, содержащеголучшие результаты.
Если элементы расположеныне по порядку, то игрок продолжает перестановку.Пользователь может выйти изигры, нажав клавишу Esc. Для удобствапредусмотрен выход из программы посредством меню. Для этого приходитсясохранять видео страничку в буфере. Если пользователь подтверждает желаниевыйти, буфер очищается и потом игрок попадает в главное меню. В ином случаевидео страница извлекается из буфера, а затем происходит его очистка. Тем самымпользователь застрахован от случайного нажатия клавиши Esc.
Вывод таблицы рекордов
Прежде всего,осуществляется считывание результатов из файла. После этого следует процедура очистки экрана. Затемпроисходит создание фона, на котором будут выводиться данные из файла.Распечатка осуществляется без выхода из графического режима, благодаря чемутаблица получается красочной и приятной для восприятия. В текстовом режимесоздать такой эффект невозможно. Имя игрока и его результат разделяютсяточками. Имя игрока, имеющего лучший результат, выделяется другим цветом. В принципе это основные действия, которые необходимовыполнить для того, что бы пользователь мог ознакомиться с лучшимирезультатами. В остальном все зависит от вкусов программиста и чаще всегосостоит в непосредственной записи выполняемых действий с помощью операторов истандартных процедур выбранного языка программирования.
/>
Вывод помощи
Вывод помощи в игре, также как и таблицы рекордов, осуществляется посредством считывания из файла. Пожалуй,единственное и главное различие состоит в том, что здесь все действияпроизводятся в текстовом режиме.
Перед тем, какосуществлять печать данных из файла, происходит выход из графического режима иочистка экрана. Затем
данные распечатываются блокамипо 24 строки. Каждый раз проверяется условие, закончен ли файл и не нажал лиигрок Esc.После каждого блока пользовательдолжен подтвердить продолжение вывода помощи, нажав клавишу Enter, либо прервать вывод, нажав клавишу Esc. И в первом и во втором случае игрокпопадает в меню программы .
/>
/> /> /> /> /> /> /> /> /> /> /> />
Графический интерфейспрограммы Сочетаниеподобранных цветов приятно для восприятия. При небольшом наборе цветов впалитре, отсутствуют те, что имеют ‘кислотные’ оттенки. Данный факт кому-томожет показаться не столь значимым, но очевидно то, что желание пользователяработать с той или иной программой, будь то игровая (или какая другаяпрограмма), зачастую определяется не только сюжетом, жанром, смыслом самойигры, но и тем интерфейсом, который предлагают пользователю автор (или авторы)программы.
Разработка программы
Программа состоит из двухфайлов. Первый файл petnash.pas-это файл, содержащий основнуюпрограмму. Второй файл petnash1.pas-это модуль, в котором находятсяпроцедуры используемые, основной программой.
Текст основной программы
programpetnash;
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 — ');
Readln;
Halt;
end;
{Установкатекущих параметров цвета и линии}
setcolor(6);
setlinestyle(0,0,1);
recod;{Считывание данных из файла с лучшими результатами}
repeat
menu(men);{Процедура, обеспечивающаяработу с меню}
casemen 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;varxv1,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);{Открытие файла срезультатами}
fori:=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*)
(*Процедурарисования парал-да*)
procedurekv(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
Up :if yv>0 then yv:=yv-1;
Left :if xv>0 then xv:=xv-1;
Right :if xv
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);
{Изменениекоординат указателя, в
зависимостиот нажатия пользователем
однойизклавиш управления}
ifom=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
mainmenu');
{Заданиепрежних параметров}
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
{Проверка элементов массива на
равенстводруг другу}
ifmas[i]=j then u:=true;
end;{Раскладывание пятнашек}
mas[n]:=j;
n:=n+1;
untiln=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 (i3) or (j3) 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мены активной
таблички}
{Проверкаусловия нажатия клавиши пробел}
ifkl=Space then
begin(*if1*)
u:=(abs(x1-x)=1) and (abs(y1-y)=0) or
(abs(x-x1)=0) and (abs(y1-y)=1);
{Условие перестановки элементов
массива}
ifu 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 (nmas[j]) and (n12)
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);
{Движение по пунктам меню}
ifb2=up then b3:=0;
ifb2=down then b3:=1;
if b3=0
then kl:='z'{Выбран пункт
Continue}
else kl:=Esc{ВыбранпунктExit}
until b2=Enter;
end; (*if*)
{Если выбран пункт Continue, то
страничкавозвращается из буфера, а
затембуфер очищается}
ifkl='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) ;
{Демонстрация победы послезавершения игры}
ifvict then
begin(*vict*)
cleardevice;{Очисткаэкрана}
victory;{Процедура победы}
{Вывод на экран числашагов, сделанных
пользователем,и поздравления}
setcolor(4);
settextstyle(7,0,5);
outtextxy(100,50,'Youare 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);
{Если результат игрока превосходитодин из
результатовв таблице, он заносится в
таблицу}
ifi
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
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+'.';
fore02:=1 to 5-length(stroka[a02*2]) do
stl2:=stl2+'.';
stl2:=stl2+stroka[a02*2];
outtextxy(40,100+50*a02,stl2);
if a020 then setcolor(9); {Выделение
лучшего игрока другим цветом}
end;(*fora02*)
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';
whilenot(eof(f03)) {Не конецфайла}and
(klEsc) {Не нажата кл. Esc}do
begin {нц1}
i:=1;
while (i
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}
ifkeypressed 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.
Описания используемыхтипов, глобальныхпеременных, процедур и функций.
В программе были использованы следующие типы:
type
strok = string[10];
Данный тип используется вфайле, который хранит результаты лучших игроков.
В программе были использованы следующие глобальные переменные:
Stroka: array[1..12] ofstrok;
Массив, элементамикоторого являются строки длинною в десять символов, используется в файле,который хранит результаты лучших игроков.
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-положение курсора в меню Процедуры
procedurerecod;
Даннаяпроцедура осуществляет считывание данных из файла, содержащего имена ирезультаты лучших игроков
procedure zz1(a,b,c:integer;s:char);
Используетсядля перемещения заданной буквы по экрану
procedurevictory;
Создаетэффект осыпания букв на экран. В результате получается надпись Victory.
procedure nomer(xp,yp,ip:integer);
Преобразуетномер пятнашки в последовательность символов, с последующей печатью насоответствующей фишке
procedure kv(xk,yk:integer);
Рисованиепараллелепипеда
Procedure tabl(xv,yv:integer;klv:char;varxv1,yv1:integer);
Процедурасмены активной табличики. В зависимости от того, какая клавиша нажата UP,DOWN,LEFT,RIGHTсоответствующим образом изменяются координаты таблички, и та фишка, котораябыла активизирована, рисуется таким же цветом, как и все остальные, а новаяактивизированная фишка прорисовывается другим цветом.
procedure menu(var ym:integer);
Обеспечиваетработу пользователя с меню и создание интерфейсной части меню программы (более подробно эта процедура описывается в разделе алгоритмизации)
proceduregame;
Процедураначала игры, осуществляет подготовку к игре всех необходимых параметров иобеспечивает сам процесс игры
procedurebest;-процедура вывода в графическом режиме таблицы с лучшими результатами
procedurehelp;-процедура вывода помощи в игре
Последниетри процедуры подробно описываются в разделе алгоритмизации.
Назначение и областьприменения программы.
Цель создания даннойпрограммы — развлечение играющих, совершенствование их умственного илогического мышления. Программа может применяться в качестве игровой на разныхтипах персональных компьютеров и распространяется как freeware, при соблюденииусловия as is.
Входные и выходные данные.
Входные данные — кодынажатых в режиме реального времени клавиш, а именно клавиши управления курсоромUP, DOWN, LEFT, PIGHT, а так же ESC и ENTER.
Выходные данные — графическая информация на дисплее, файлы данных, содержащие список рекордов ипомощь игроку.
Используемые технические и программные средства
Программа была написанаи откомпилирована наPent 733/256/64mGF/40Gb под управлением операционной системы WinXp.
Техническая документацияк игровой программе была подготовлена с помощью 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, который находится восновном каталоге.
Посленебольшой заставки вы попадете в основное меню, содержащее следующие пункты :
1Game
2 Best players
3 About this game
4 Exit
Привыборе пункта :
Game- вы попадаете соответственно в игру
Bestplayers — вам предоставляется список лучших игроков
Aboutthis game — вы получаете полную информацию об игре «15», то есть туинформацию, которую вы изучаете в данный момент
Exit — выход в DOS
ПРАВИЛА
Дляначала игры, выберите в главном меню пункт Game и нажмите Enter. На экранеВашего компьютера появится коробочка с табличками пронумерованными от 1 до 15 иодна пустая фишка.
Например:
4 6 1 7
5 2 11 14
3 15 13 12
8 10 9 />/>/>
/>
Вашазадача, передвигая пятнашки по дну коробочки, расположить их в порядкевозрастания как это представленно на следующих рисунках :
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 />/>/> /> /> /> /> /> /> /> /> /> /> /> />
Наилучшимрезультатом считается выполнение задания за наименьшее число ходов. Ходомсчитается передвижение одной пятнашки на одну позицию. Если вы собрали'пятнашки' за наименьшее число ходов по сравнению с результатами предшествуюшихигроков, то ваш результат заносится в список лучших игроков.
Длявыбора пятнашки используйте следующие клавиши на
вашейклавиатуре:
UP
LEFTRIGHT
DOWN
Для того, что бы передвинутьпятнашку на свободное место
используйтеклавишу пробел.
Заключение
При разработке курсовойработы мною были изучены многие аспекты программирования на языке Borland Pascal 7.0, такие как работа с динамическими данными,файлами, вывод информации в графических режимах, определение процедур ифункций, использование параметров командной строки, организация модульнойструктуры программы.
При оформлении курсовойработы был получены навыки оформления программной документации, а также большойпрактический опыт работы в Microsoft Word 2002 и Borland Pascal 7.0.
Списоклитературы
1. Конструирование программ,Методические указания №2133 к курсовой работе, Рязань, РГРТА, 1993.
2. А.М. Епанешников, В.А. Епанешников,Программирование в среде Turbo Pascal 7.0, М,Диалог-Мифи, 1998
3. Новичков В. С., Парфилова Н. И., Пылькин А. Н.,Паскаль,
М, Высшая школа, 1994
4. Питер Нортон, Персональный компьютер изнутри, М,Бином, 1995
5. http://pascal.dax.ru/ — Всёо Turbo Pascal
6. borlpasc.narod.ru/ — Информация о TurboPascal