Реферат Создание игровой программы Pacman
Работа добавлена на сайт bukvasha.net: 2015-10-28Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
от 25%
договор
МИНИСТЕРСТВО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ
ХАКАССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
ИМ. Н.Ф. КАТАНОВА
Институт Информатики и Телематики
Кафедра Информационных Технологий и Систем
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
к курсовой работе на тему:
«Создание игровой программы “Pacman”»
Абакан 2007 г.
Содержание
Введение………………………………………………………3 стр.
1. Анализ предметной области………………………………4-5 стр.
2. Проектирование……………………………………………6-8 стр.
3. Реализация………………………………………………….9-12 стр.
Заключение……………………………………………………13 стр.
Список используемой литературы…………………….......14 стр.
Глоссарий……………………………………………………..15 стр.
Приложение……………………………………………….......16-24 стр.
ВВЕДЕНИЕ
В данной работе изложен материал по разработке программного продукта «Игровая программа “Pacman”», созданного для использования в операционных системах MS DOS, семейства MS Windows 9x, MS Windows XP. Данное приложение является игровым и предназначено для развлечения.
Всегда с момента появления первых ПЭВМ существовал интерес пользователей к каким-либо компьютерным играм. Существуют как сложные компьютерные игры, так и относительно простые.
Возникла потребность в создании относительно несложной компьютерной игры, тренирующей реакцию.
Основанием для разработки явилось выполнение курсовой работы
1. Анализ предметной области
В качестве объекта был выбран процесс и правила игры “Pacman”, позволяющей пользователю совершенствовать координацию движения
Созданное программное средство позволит пользователям развлекаться и тренировать логическое мышление.
Разработанное программное средство может работать на любом компьютере, где установлена ОС MS DOS, MS Windows, начиная с версии 9х. Разработанная программа может быть использована пользователями ЭВМ как средство развлечения, тренировки своей логики и реакции.
Цель работы.
Целью выполнения настоящей курсовой работы является создание программного продукта, предназначенного для развлечения пользователей, совершенствования их реакции. В рамках данной курсовой работы реализуется всем хорошо известная игра “Pacman”. Таким образом, задачей в данном случае является разработка и реализация алгоритма данной игры.
Для достижения поставленной цели были сформулированы и решены следующие задачи:
1. Изучить принципы и правила игры “Pacman”.
2. Выбрать технологии реализации создаваемой системы.
3. Реализовать основные модули системы.
4. Сформировать документацию.
Объект исследования.
В качестве объекта был выбран процесс и правила игры “Pacman”, позволяющей пользователю совершенствовать координацию движения.
Предмет исследования.
Предметом исследования является игровая программа “Pacman”.
Методы исследования.
Для решения поставленных задач были применены несколько общепринятых методов исследования:
1. теоретические (анализ различной литературы по проблеме исследования),
2. эмпирические (моделирование процесса игры).
Выводы
1. Исследована предметная область, выявлены ее недостатки.
2. Недостатков существующей ИС не выделено;
3. Намечена логика работы программы.
2. Проектирование
При разработке программного продукта для обеспечения его максимальной эффективности очень важно учитывать все особенности информационной среды, в которой будет происходить эксплуатация.
Описание предметной области
Предметной областью в рамках данного проекта является организация игрового процесса компьютерной игры “Pacman”. Эта область содержит решение таких задач как:
1. реализация методов, выбирающих где и как разместить яблоки;
2. реализация методов изменния направления движения ”pacman’a” по команде пользователя;
3. уничтожение “pacmaa’a” при встрече с охранниками;
В существующей информационной системе пользователю предлагаются похожие алгоритмы реализации.
Основные функциональные возможности и требования к программе
Можно выделить основные функциональные возможности и требования.
Функциональные возможности:
1. Отображение на экране игрового процесса;
2. Предоставление возможности пользователю изменять направление движения “pacman’a”;
Требования:
3. Автоматическая остановка игры при встрече ”pacman’a” с охранником;
4. Возможность изменения направления движения “pacman’a”;
5. Контроль выхода фигуры за установленные границы короба;
6. Использование небольшого объема оперативной памяти компьютера;
7. Возможность использования ПП на любой версии ОС MS DOS, MS Windows, начиная с версии 9х;
8. Удобный и интуитивно понятный интерфейс приложения
Разбиение программы на модули
Разрабатываемое программное средство физически состоит из 2 частей:
- исполняемый приложения (Pacman.pas) – собственно сама игровая программа;
- графический драйвер (Egavga.bgi), нужный для вывода графики на экран.
Исполняемый файл приложения можно условно разделить на несколько модулей:
- модуль формирования нового уровня;
- модуль обработки действий пользователя (пользователь оказывает воздействие на программу при помощи главного меню либо клавиатуры);
- модуль отображения игрового процесса на экране;
- модуль удаления яблок;
- модуль определения окончания игры;
Выводы
1. На основании исследования предметной области разработана схема архитектуры программы, программа разложена на отдельные функциональные модули. На основе построенных моделей будет реализована программа, отвечающая всем предъявленным ей требованиям;
2. На основе разложения программы на отдельные модули будет реализована программа, а также организованы необходимые наборы данных для каждого модуля;
Рис 2.1 Процесс игры
3. Реализация
Выбор языка и технологии разработки
В качестве языка программирования для реализации игровой программы “Pacman” выбран язык Borland Pascal 7.0, поскольку он позволяет полностью реализовать программу, удовлетворяя начальным условиям курсовой работы.
Описание алгоритма.
При выключении игры, сначала происходит инициализация графической системы и перевод видеокарты в графический режим. На экране появляется изображение, начинается игра. В начале игры Pacman не двигается, чтобы привести его в движение необходимо нажать клавиши управляющие Pacman’ом. Если нажата клавиша, содержащая символ «2» Pacman движется вниз, «4» - влево, «6» - вправо, «8» -вверх, при этом там, где он прошел исчезают точки, которые Pacman должен собрать. Вместе с этим количество точек, очков высчитывается и при их количестве равном 4000 добавляется одна жизнь. При столкновении Pacman’a с охранником, Pacman исчезает и теряется одна жизнь. Если же Pacman съедает «яблоко», находящееся в одном из углов изображения, он меняет свой цвет на оранжевый, охранники на зеленый и в момент когда охранники зеленого цвета и Pacman сталкивается с ними, охранники попадают в ловушку и меняют свой цвет на фиолетовый. При этом количество очков набранных пользователем увеличивается на 500. Если нажата клавиша, содержащая символ «I» игра приостанавливается, в нижней части экрана появляется информация о том какими клавишами можно управлять Pacman’ом, также предоставляется информация о том какой клавишей можно приостановить игру(«P»), возобновить её («S») и выйти из игры («Q»). Если собраны все точки, игра останавливается, на черном экране появляется Pacman и сообщение о том, что происходит переход на следующии уровень, после нажатия любой клавиши начинается игра в следующем уровне. Если все жизни закончились, игра останавливается, появляется соответствующее сообщение и выход из игры.
План развертывания
Для полнофункциональной работы программы необходимо наличие всего 2 файлов:
1. исполняемого файла приложения (Pacman.pas);
2. набора графических драйверов (Egavga.bgi);
Надежность и безопасность приложения зависит от надежности и безопасности программно-аппаратных средств компьютера и используемой операционной системы.
procedure infos;
var i,j,k: integer;
begin
for i:=1 to 2 do begin
if i=1 then
setcolor(3)
else setcolor(0);
outtextxy(180,15,'Infos:');
outtextxy(60,452,'Left: 4');
outtextxy(60,472,'Right: 6');
outtextxy(190,452,'Up: 8');
outtextxy(190,472,'Down: 2');
outtextxy(320,452,'Stop!: 5');
outtextxy(320,472,'Pause: P');
outtextxy(450,452,'Sound/Sil.:S');
outtextxy(450,472,'Exit :Q');
if i=1 then begin
repeat
for j:=1 to 20 do begin
for k:=1 to 2 do begin
if k=1 then setcolor(4) else setcolor(0);
outtextxy(380+1*j,15,'G');
outtextxy(390+2*j,15,'A');
outtextxy(400+3*j,15,'M');
outtextxy(410+4*j,15,'E');
if k=1 then delay(d500);
end;
end;
for j:=20 downto 1 do begin
for k:=1 to 2 do begin
if k=1 then setcolor(4) else setcolor(0);
outtextxy(380+1*j,15,'G');
outtextxy(390+2*j,15,'A');
outtextxy(400+3*j,15,'M');
outtextxy(410+4*j,15,'E');
if k=1 then delay(d500);
end;
end;
until keypressed;
end;
end;
end;
Данная процедура предоставляет информацию пользователю о
игре. Далее в программе 6улет описано, что при нажатии на клавишу, содержащую символ «I» вызывается процедура Infos, при этом игра приостанавливается и в нижней части экрана появляется информация о том какими клавишами можно управлять Pacman’ом, также предоставляется информация о том какой клавишей можно приостановить игру, возобновить её и выйти из игры.
Бонус
if bonus=true then begin
bonus:=false;
if son=true then begin
for a:=1 to 4 do begin
sound(440*a);
delay(d500*2);
end;
nosound;
end;
setcolor(0);
str(vies,s);
outtextxy(105,40,s);
vies:=vies+1;
setcolor(3);
str(vies,s);
outtextxy(105,40,s);
end;
Данная часть кода программы добавляет жизнь Pacman’ ну, и в верхней части экрана, к количеству жизней прибавляет еще одну, ранее в программе описано, что bonus=true, тогда, когда количество очков , набранных игроком, которые выводятся в верхней части, экрана равно 4000.
Выводы
1. В качестве языка программирования выбран язык Borland Pascal 7.0.
2. Описан алгоритм;
3. Разработан и описан пользовательский интерфейс игровой программы “Pacman” с интуитивно-понятным управлением приложением.
4. Составлен план развертывания программы.
ЗАКЛЮЧЕНИЕ
1. Результатом данной работы является созданная игровая программа «Pacman». Разработанный продукт является полностью функциональным (все необходимые функции в нем реализованы). Несмотря на это, допускается его дальнейшая модернизация, как в плане интерфейса, так и в плане функциональных и алгоритмических возможностей.
2. Программа реализована на языке - Borland Pascal 7.0.
3. В последующих версиях приложения предполагается усовершенствование пользовательского интерфейса и механизмов функционирования
Список используемой литературы.
1. Семенов А.И., Семенова О.В. Программирование. Учебное пособие. – Абакан: Издательство Хакасского государственного университета им. Н.Ф. Катанова, 2005. - 156 с.: ил.
2. Петзолд Ч. Программирование для Windows 95 в двух томах – Спб.: «BHV-Санкт Петербург», 2000.
3. Окулов С.М. Основы программирования. В 3-х ч. – Киров: Изд-во ВГПУ, 2000.
Глоссарий
Игровая программа - компьютерная программа, предназначенная для развлечения пользователей.
Информационная система - это взаимосвязанная совокупность средств, методов и персонала, используемых для хранения, обработки и выдачи информации, необходимой в процессе принятия решений задач из любой области.
Предметная область - часть реального мира, подлежащего автоматизации в ходе ее изучения.
Система - совокупность взаимосвязанных элементов, выступающая как единое целое и имеющая общее назначение, цель.
ПРИЛОЖЕНИЕ
П.1. Листинг
Pacman.pas
Program pacman;
uses crt, graph;
const
d500=50; {short delay}
d1500=1000; {long delay}
type point=^element;
element=record
im: pointer;
nxt: point;
end;
fx=^coord;
coord=record
fa, fo, rf, delais: integer;
nxt: fx;
end;
tableau=array[1..3]of integer;
procedure infos;
var i,j,k: integer;
begin
for i:=1 to 2 do begin
if i=1 then
setcolor(3)
else setcolor(0);
outtextxy(180,15,'Infos:');
outtextxy(60,452,'Left: 4');
outtextxy(60,472,'Right: 6');
outtextxy(190,452,'Up: 8');
outtextxy(190,472,'Down: 2');
outtextxy(320,452,'Stop!: 5');
outtextxy(320,472,'Pause: P');
outtextxy(450,452,'Sound/Sil.:S');
outtextxy(450,472,'Exit :Q');
if i=1 then begin
repeat
for j:=1 to 20 do begin
for k:=1 to 2 do begin
if k=1 then setcolor(4) else setcolor(0);
outtextxy(380+1*j,15,'G');
outtextxy(390+2*j,15,'A');
outtextxy(400+3*j,15,'M');
outtextxy(410+4*j,15,'E');
if k=1 then delay(d500);
end;
end;
for j:=20 downto 1 do begin
for k:=1 to 2 do begin
if k=1 then setcolor(4) else setcolor(0);
outtextxy(380+1*j,15,'G');
outtextxy(390+2*j,15,'A');
outtextxy(400+3*j,15,'M');
outtextxy(410+4*j,15,'E');
if k=1 then delay(d500);
end;
end;
until keypressed;
end;
end;
end;
procedure route(var t: tableau;x,y,fa,fo: integer);
var coef: real;
begin
coef:=(x-fa)/(y-fo+0.1);
if ((coef)>=1)or((coef)<=-1) then begin
if fa>=x then t[1]:=4 else t[1]:=6;
if fo>y then begin t[2]:=8; t[3]:=2; end else begin t[2]:=2; t[3]:=8; end;
end else begin
if fo>=y then t[1]:=8 else t[1]:=2;
if fa>x then begin t[2]:=4; t[3]:=6; end else begin t[2]:=6; t[3]:=4; end;
end;
end;
label 1;
var a, b, c, d, i, j, k, rf, x, y, size, pilote, mode, vies, repas,
t1, t2, t3, t4, t5, t6, t7, t8, niveau: integer;
tar, perdu, son, f1, f2, f3, f4, bonus: boolean;
p, p2, p3, ec, ec2, ec3: point;
fantome, blank, fade, vdt, repos, fromage, barre: pointer;
t: tableau;
pf, pf2, pf3: fx;
temps, points: longint;
stock:Array[1..24] of integer;
s: string;
r:char;
err:integer;
begin
randomize;
pilote:=detect;
InitGraph(pilote,mode,'c:\lang\bp\units');
clearviewport;
size:=imagesize(7,7,33,7);
new(fade);
getmem(fade,size);
getimage(7,7,33,7,fade^);
size:=imagesize(7,7,33,33);
new(blank);
getmem(blank,size);
getimage(7,7,33,33,blank^);
for j:=1 to 2 do begin
if j=1 then setfillstyle(1,9) else setfillstyle(1,6);
for i:=1 to 4 do begin
cleardevice;
pieslice(20,20,5*i,360-5*i,10);
rectangle(19,14,20,15);
size:=imagesize(7,7,33,33);
if j=1 then begin
new(p2);
getmem(p2^.im,size);
getimage(7,7,33,33,p2^.im);
if i=1 then begin
p:=p2;
p3:=p;
end else begin
p3^.nxt:=p2;
p3:=p2;
end;
end else begin
new(ec2);
getmem(ec2^.im,size);
getimage(7,7,33,33,ec2^.im);
if i=1 then begin
ec:=ec2;
ec3:=ec;
end else begin
ec3^.nxt:=ec2;
ec3:=ec2;
end;
end;
end;
for i:=3 downto 2 do begin
cleardevice;
pieslice(20,20,5*i,360-5*i,10);
rectangle(19,14,20,15);
size:=imagesize(7,7,33,33);
if j=1 then begin
new(p2);
getmem(p2^.im,size);
getimage(7,7,33,33,p2^.im);
p3^.nxt:=p2;
p3:=p2;
end else begin
new(ec2);
getmem(ec2^.im,size);
getimage(7,7,33,33,ec2^.im);
ec3^.nxt:=ec2;
ec3:=ec2;
end;
end;
p2^.nxt:=p;
ec2^.nxt:=ec;
end;
cleardevice;
setcolor(4);
rectangle(20,20,100,21);
size:=imagesize(20,20,100,21);
new(barre);
getmem(barre,size);
getimage(20,20,100,21,barre^);
cleardevice;
setcolor(4);
line(20,10,30,30);
line(20,10,10,30);
line(10,30,30,30);
line(16,20,20,20);
line(20,20,18,25);
line(18,25,16,20);
line(20,20,24,20);
line(24,20,22,25);
line(22,25,20,20);
setfillstyle(1,4);
floodfill(20,15,4);
floodfill(20,27,4);
setcolor(0);
line(17,27,23,27);
size:=imagesize(7,7,33,33);
new(fantome);
getmem(fantome,size);
getimage(7,7,33,33,fantome^);
setfillstyle(1,10);
floodfill(20,28,0);
size:=imagesize(7,7,33,33);
new(vdt);
getmem(vdt,size);
getimage(7,7,33,33,vdt^);
setfillstyle(1,5);
floodfill(20,28,0);
size:=imagesize(7,7,33,33);
new(repos);
getmem(repos,size);
getimage(7,7,33,33,repos^);
cleardevice;
setcolor(14);
rectangle(9,9,10,10);
size:=imagesize(9,9,10,10);
new(fromage);
getmem(fromage,size);
getimage(9,9,10,10,fromage^);
niveau:=0;
points:=0;
vies:=3;
son:=true;
b:=400;
repeat
cleardevice;
for i:=1 to 19 do
for j:=1 to 13 do
putimage(i*28+36,j*28+45,fromage^,normalput);
setcolor(1);
{bordure}
rectangle(50,60,582,424);
rectangle(49,59,583,425);
{motifs}
rectangle(78,88,161,144);
rectangle(471,88,554,144);
rectangle(78,340,161,396);
rectangle(471,340,554,396);
rectangle(189,60,218,144);
rectangle(414,60,443,144);
rectangle(189,340,218,424);
rectangle(414,340,443,424);
rectangle(246,88,386,144);
rectangle(246,340,386,396);
rectangle(50,172,161,228);
rectangle(471,172,582,228);
rectangle(50,256,161,312);
rectangle(471,256,582,312);
rectangle(189,172,443,312);
rectangle(190,173,442,311);
{Anti-fromages}
setfillstyle(1,0);
floodfill(300,200,1);
{passage secret}
setcolor(0);
rectangle(582,229,583,255);
rectangle(49,229,50,255);
rectangle(304,172,330,173);
{Remplissage}
setfillstyle(1,1);
floodfill(80,90,1);
floodfill(80,350,1);
floodfill(500,350,1);
floodfill(500,90,1);
floodfill(200,90,1);
floodfill(420,90,1);
floodfill(200,400,1);
floodfill(420,400,1);
floodfill(250,100,1);
floodfill(250,350,1);
floodfill(100,200,1);
floodfill(500,200,1);
floodfill(100,300,1);
floodfill(500,300,1);
{camemberts}
setfillstyle(1,2);
setcolor(2);
circle(65,75,5);
floodfill(65,75,2);
circle(65,409,5);
floodfill(67,409,2);
circle(566,75,5);
floodfill(566,75,2);
circle(566,409,5);
floodfill(566,409,2);
setcolor(3);
outtextxy(50,40,'lifes:');
outtextxy(156,40,'points: Energy: Level:');
outtextxy(290,435,'Infos:I');
setcolor(0);
str(niveau,s);
outtextxy(540,40,s);
niveau:=niveau+1;
setcolor(3);
str(niveau,s);
outtextxy(540,40,s);
str(vies,s);
outtextxy(105,40,s);
f1:=true;
f2:=true;
f3:=true;
f4:=true;
repas:=0;
for j:=1 to 16 do
stock[j]:=0;
1:
p2:=p;
ec2:=ec;
temps:=0;
perdu:=false;
new(pf);
pf^.fa:=304;
pf^.fo:=174;
pf^.rf:=4;
pf^.delais:=0;
new(pf2);
pf2^.fa:=304;
pf2^.fo:=210;
pf2^.rf:=8;
pf2^.delais:=0;
pf^.nxt:=pf2;
new(pf3);
pf3^.fa:=304;
pf3^.fo:=240;
pf3^.rf:=8;
pf3^.delais:=0;
pf2^.nxt:=pf3;
pf2:=pf3;
new(pf3);
pf3^.fa:=304;
pf3^.fo:=275;
pf3^.rf:=8;
pf3^.delais:=0;
pf3^.nxt:=nil;
pf2^.nxt:=pf3;
x:=303;
y:=313;
r:='5';
i:=1;
b:=b-20;
c:=b+30;
bonus:=false;
repeat
i:=i+1;
if keypressed then r:=upcase(readkey);
if r='S' then son:=(son=false);
if r='P' then repeat until keypressed;
if r='I' then infos;
if i mod 4000=0 then if temps=0 then p2:=p2^.nxt else ec2:=ec2^.nxt;
if i mod b=0 then begin
if r='6' then if (getpixel(x+27,y)<>1)and(getpixel(x+27,y+26)<>1) then val(r,d,err);
if r='4' then if (getpixel(x-1,y)<>1)and(getpixel(x-1,y+26)<>1) then val(r,d,err);
if r='2' then if (getpixel(x,y+27)<>1)and(getpixel(x+26,y+27)<>1)and((x<>304)or(y<>145)) then val(r,d,err);
if r='8' then if (getpixel(x,y-1)<>1)and(getpixel(x+26,y-1)<>1) then val(r,d,err);
if r='5' then d:=0;
if d=6 then if (getpixel(x+27,y)<>1)and(getpixel(x+27,y+26)<>1) then x:=x+1 else d:=0;
if d=4 then if (getpixel(x-1,y)<>1)and(getpixel(x-1,y+26)<>1) then x:=x-1 else d:=0;
if d=2 then if (getpixel(x,y+27)<>1)and(getpixel(x+26,y+27)<>1) then y:=y+1 else d:=0;
if d=8 then if (getpixel(x,y-1)<>1)and(getpixel(x+26,y-1)<>1) then y:=y-1 else d:=0;
if ((d=6)and((getpixel(x+27,y+12)=14)or(getpixel(x+27,y+14)=14))
or((d=4)and((getpixel(x-1,y+12)=14)) or(getpixel(x-1,y+14)=14))
or((d=2)and((getpixel(x+12,y+27)=14))or(getpixel(x+14,y+27)=14))
or((d=8)and(getpixel(x+12,y-1)=14)or(getpixel(x+14,y-1)=14))) then begin
setcolor(0);
str(points,s);
outtextxy(220,40,s);
points:=points+10;
if points mod 4000=0 then bonus:=true;
repas:=repas+1;
setcolor(3);
str(points,s);
outtextxy(220,40,s);
end;
if temps>0 then begin
putimage(x,y,ec2^.im,normalput);
temps:=temps-1;
putimage(360+trunc(80*temps/(60*(10-niveau div 2))),20,blank^,normalput);
end else
putimage(x,y,p2^.im,normalput);
if (x=51)and(y=61)and(f1=true) then begin
f1:=false;
temps:=60*(10-niveau div 2);
putimage(360,43,barre^,normalput);
end;
if (x=555)and(y=61)and(f2=true) then begin
f2:=false;
temps:=60*(10-niveau div 2);
putimage(360,43,barre^,normalput);
end;
if (x=51)and(y=397)and(f3=true) then begin
f3:=false;
temps:=60*(10-niveau div 2);
putimage(360,43,barre^,normalput);
end;
if (x=555)and(y=397)and(f4=true) then begin
f4:=false;
temps:=60*(10-niveau div 2);
putimage(360,43,barre^,normalput);
end;
end;
tar:=false;
k:=1;
if i mod c=0 then begin
pf2:=pf;
repeat
randomize;
repeat
if (tar=true)or((pf2^.fa=162)and(pf2^.fo=145))or((pf2^.fa=219)and(pf2^.fo=145))
or((pf2^.fa=387)and(pf2^.fo=145))or((pf2^.fa=444)and(pf2^.fo=145))or((pf2^.fa=444)and(pf2^.fo=229))
or((pf2^.fa=444)and(pf2^.fo=313))or((pf2^.fa=387)and(pf2^.fo=313))or((pf2^.fa=162)and(pf2^.fo=313))
or((pf2^.fa=219)and(pf2^.fo=313))or((pf2^.fa=162)and(pf2^.fo=229)) then begin
if (k<3)and(temps=0)and(random(10)>2+(niveau div 2)) then begin
route(t,x,y,pf2^.fa,pf2^.fo);
pf2^.rf:=t[k];
k:=k+1;
end else pf2^.rf:=random(4)*2+2;
end;
if (pf2^.fa=304)and(pf2^.fo=174)and(pf2^.delais=0) then pf2^.rf:=8;
if (pf2^.fa=304)and(pf2^.fo=145)and(pf2^.rf=2) then pf2^.rf:=random(2)*2+4;;
if pf2^.rf=6 then if (getpixel(pf2^.fa+27,pf2^.fo)<>1)and(getpixel(pf2^.fa+27,pf2^.fo+26)<>1) then begin
pf2^.fa:=pf2^.fa+1; tar:=false; end else tar:=true;
if pf2^.rf=4 then if (getpixel(pf2^.fa-1,pf2^.fo)<>1)and(getpixel(pf2^.fa-1,pf2^.fo+26)<>1) then begin
pf2^.fa:=pf2^.fa-1; tar:=false; end else tar:=true;
if pf2^.rf=2 then if (getpixel(pf2^.fa,pf2^.fo+27)<>1)and(getpixel(pf2^.fa+26,pf2^.fo+27)<>1) then begin
pf2^.fo:=pf2^.fo+1; tar:=false; end else tar:=true;
if pf2^.rf=8 then if (getpixel(pf2^.fa,pf2^.fo-1)<>1)and(getpixel(pf2^.fa+26,pf2^.fo-1)<>1) then begin
pf2^.fo:=pf2^.fo-1; tar:=false; end else tar:=true;
until tar=false;
if (pf2^.fa=51)and(pf2^.fo=61) then
f1:=false;
if (pf2^.fa=555)and(pf2^.fo=61) then
f2:=false;
if (pf2^.fa=51)and(pf2^.fo=397) then
f3:=false;
if (pf2^.fa=555)and(pf2^.fo=397) then
f4:=false;
if pf2^.fa>570 then begin pf2^.fa:=35; putimage(570,229,blank^,normalput); end;
if pf2^.fa<35 then begin pf2^.fa:=570; putimage(35,229,blank^,normalput); end;
j:=1;
while (stock[j]<>0)and(j<24) do
j:=j+2;
if (pf2^.rf=6)and((getpixel(pf2^.fa+27,pf2^.fo+12)=14)
or(getpixel(pf2^.fa+27,pf2^.fo+14)=14))and(odd(pf2^.fa))
then begin
stock[j]:=pf2^.fa+27;
stock[j+1]:=pf2^.fo+13;
end;
if (pf2^.rf=4)and((getpixel(pf2^.fa-1,pf2^.fo+12)=14)or
(getpixel(pf2^.fa-1,pf2^.fo+14)=14))and(odd(pf2^.fa))
then begin
stock[j]:=pf2^.fa-2;
stock[j+1]:=pf2^.fo+13;
end;
if (pf2^.rf=2)and((getpixel(pf2^.fa+14,pf2^.fo+27)=14)or
(getpixel(pf2^.fa+12,pf2^.fo+27)=14))and(odd(pf2^.fo))
then begin
stock[j]:=pf2^.fa+13;
stock[j+1]:=pf2^.fo+27;
end;
if (pf2^.rf=8)and((getpixel(pf2^.fa+14,pf2^.fo-1)=14)
or(getpixel(pf2^.fa+12,pf2^.fo-1)=14))and(odd(pf2^.fo))
then begin
stock[j]:=pf2^.fa+13;
stock[j+1]:=pf2^.fo-1;
end;
pf3:=pf;
t1:=pf3^.fa;
t2:=pf3^.fo;
pf3:=pf3^.nxt;
t3:=pf3^.fa;
t4:=pf3^.fo;
pf3:=pf3^.nxt;
t5:=pf3^.fa;
t6:=pf3^.fo;
pf3:=pf3^.nxt;
t7:=pf3^.fa;
t8:=pf3^.fo;
for a:=1 to 6 do begin
j:=2*a-1;
if (stock[j]<>0)
and((t1>stock[j]+3)or(t1<stock[j]-32)
or(t2>stock[j+1]+3)or(t2<stock[j+1]-32))
and((t3>stock[j]+3)or(t3<stock[j]-32)
or(t4>stock[j+1]+3)or(t4<stock[j+1]-32))
and((t5>stock[j]+3)or(t5<stock[j]-32)
or(t6>stock[j+1]+3)or(t6<stock[j+1]-32))
and((t7>stock[j]+3)or(t7<stock[j]-32)
or(t8>stock[j+1]+3)or(t8<stock[j+1]-32))
then begin
putimage(stock[j],stock[j+1],fromage^,normalput);
stock[j]:=0;
end;
end;
if (temps=0)and(pf2^.delais=0) then putimage (pf2^.fa,pf2^.fo,fantome^,normalput);
if (pf2^.delais=0)and(temps>0) then putimage (pf2^.fa,pf2^.fo,vdt^,normalput);
if pf2^.delais>0 then begin
putimage(pf2^.fa,pf2^.fo,repos^,normalput);
pf2^.delais:=pf2^.delais-1;
end;
{Fantome bouff‚?}
if (getpixel(pf2^.fa+30,pf2^.fo+10)=6)or(getpixel(pf2^.fa-3,pf2^.fo+10)=6)
or(getpixel(pf2^.fa+15,pf2^.fo-3)=6)or(getpixel(pf2^.fa+15,pf2^.fo+30)=6) then begin
for j:=1 to 26 do begin
putimage(pf2^.fa,pf2^.fo+j,fade^,normalput);
if son=true then sound(j*100);
delay(d500);
end;
nosound;
setcolor(0);
str(points,s);
outtextxy(220,40,s);
points:=points+500;
if (points div 4000)<>((points-500) div 4000) then bonus:=true;
setcolor(3);
str(points,s);
outtextxy(220,40,s);
pf2^.fa:=350;
pf2^.fo:=250;
pf2^.delais:=(10-niveau)*100;
end;
{bonus?}
if bonus=true then begin
bonus:=false;
if son=true then begin
for a:=1 to 4 do begin
sound(440*a);
delay(d500*2);
end;
nosound;
end;
setcolor(0);
str(vies,s);
outtextxy(105,40,s);
vies:=vies+1;
setcolor(3);
str(vies,s);
outtextxy(105,40,s);
end;
{fin?}
if (getpixel(pf2^.fa+30,pf2^.fo+10)=9)or(getpixel(pf2^.fa-3,pf2^.fo+10)=9)
or(getpixel(pf2^.fa+15,pf2^.fo-3)=9)or(getpixel(pf2^.fa+15,pf2^.fo+30)=9) then begin
setcolor(0);
str(vies,s);
outtextxy(105,40,s);
vies:=vies-1;
setcolor(3);
str(vies,s);
outtextxy(105,40,s);
pf2:=pf^.nxt;
for j:=1 to 26 do begin
putimage(x,y+j,fade^,normalput);
if son=true then sound(3000-j*100);
delay(d500);
end;
nosound;
pf2:=pf;
repeat
putimage(pf2^.fa,pf2^.fo,blank^,normalput);
pf2:=pf2^.nxt;
until pf2=nil;
delay(d500*3);
if vies=0 then
perdu:=true;
if vies>0 then goto 1;
tar:=false;
end;
pf2:=pf2^.nxt;
until (pf2=nil)or(perdu=true);
end;
{Passage secret}
if x>570 then begin x:=35; putimage(570,229,blank^,normalput); end;
if x<35 then begin x:=570; putimage(35,229,blank^,normalput); end;
until (r='Q')or(perdu=true)or(repas>214);
if repas>214 then begin
cleardevice;
outtextxy(220,30,'Prepare to next level');
while not(keypressed) do begin
delay(d500*2);
putimage(x,y,p2^.im,normalput);
p2:=p2^.nxt;
end;
if son=true then begin
for i:=1 to 3 do begin
sound(2000);
delay(300);
nosound;
delay(d500);
end;
sound(2000);
delay(d500);
nosound;
end;
end;
until (perdu=true)or(r='Q');
repeat
for j:=1 to 25 do begin
for k:=1 to 2 do begin
if k=1 then setcolor(4) else setcolor(0);
outtextxy(290-3*j,20,'L');
outtextxy(300-j,20,'O');
outtextxy(310+j,20,'S');
outtextxy(320+3*j,20,'T');
if k=1 then delay(d500);
end;
end;
for j:=25 downto 1 do begin
for k:=1 to 2 do begin
if (k=1) then setcolor(4) else setcolor(0);
outtextxy(290-3*j,20,'L');
outtextxy(300-j,20,'O');
outtextxy(310+j,20,'S');
outtextxy(320+3*j,20,'T');
if k=1 then delay(d500);
end;
end;
until keypressed;
closegraph;
end.
pf3:=pf3^.nxt;
t3:=pf3^.fa;
t4:=pf3^.fo;
pf3:=pf3^.nxt;
t5:=pf3^.fa;
t6:=pf3^.fo;
pf3:=pf3^.nxt;
t7:=pf3^.fa;
t8:=pf3^.fo;
for a:=1 to 6 do begin
j:=2*a-1;
if (stock[j]<>0)
and((t1>stock[j]+3)or(t1<stock[j]-32)
or(t2>stock[j+1]+3)or(t2<stock[j+1]-32))
and((t3>stock[j]+3)or(t3<stock[j]-32)
or(t4>stock[j+1]+3)or(t4<stock[j+1]-32))
and((t5>stock[j]+3)or(t5<stock[j]-32)
or(t6>stock[j+1]+3)or(t6<stock[j+1]-32))
and((t7>stock[j]+3)or(t7<stock[j]-32)
or(t8>stock[j+1]+3)or(t8<stock[j+1]-32))
then begin
putimage(stock[j],stock[j+1],fromage^,normalput);
stock[j]:=0;
end;
end;
if (temps=0)and(pf2^.delais=0) then putimage (pf2^.fa,pf2^.fo,fantome^,normalput);
if (pf2^.delais=0)and(temps>0) then putimage (pf2^.fa,pf2^.fo,vdt^,normalput);
if pf2^.delais>0 then begin
putimage(pf2^.fa,pf2^.fo,repos^,normalput);
pf2^.delais:=pf2^.delais-1;
end;
{Fantome bouff‚?}
if (getpixel(pf2^.fa+30,pf2^.fo+10)=6)or(getpixel(pf2^.fa-3,pf2^.fo+10)=6)
or(getpixel(pf2^.fa+15,pf2^.fo-3)=6)or(getpixel(pf2^.fa+15,pf2^.fo+30)=6) then begin
for j:=1 to 26 do begin
putimage(pf2^.fa,pf2^.fo+j,fade^,normalput);
if son=true then sound(j*100);
delay(d500);
end;
nosound;
setcolor(0);
str(points,s);
outtextxy(220,40,s);
points:=points+500;
if (points div 4000)<>((points-500) div 4000) then bonus:=true;
setcolor(3);
str(points,s);
outtextxy(220,40,s);
pf2^.fa:=350;
pf2^.fo:=250;
pf2^.delais:=(10-niveau)*100;
end;
{bonus?}
if bonus=true then begin
bonus:=false;
if son=true then begin
for a:=1 to 4 do begin
sound(440*a);
delay(d500*2);
end;
nosound;
end;
setcolor(0);
str(vies,s);
outtextxy(105,40,s);
vies:=vies+1;
setcolor(3);
str(vies,s);
outtextxy(105,40,s);
end;
{fin?}
if (getpixel(pf2^.fa+30,pf2^.fo+10)=9)or(getpixel(pf2^.fa-3,pf2^.fo+10)=9)
or(getpixel(pf2^.fa+15,pf2^.fo-3)=9)or(getpixel(pf2^.fa+15,pf2^.fo+30)=9) then begin
setcolor(0);
str(vies,s);
outtextxy(105,40,s);
vies:=vies-1;
setcolor(3);
str(vies,s);
outtextxy(105,40,s);
pf2:=pf^.nxt;
for j:=1 to 26 do begin
putimage(x,y+j,fade^,normalput);
if son=true then sound(3000-j*100);
delay(d500);
end;
nosound;
pf2:=pf;
repeat
putimage(pf2^.fa,pf2^.fo,blank^,normalput);
pf2:=pf2^.nxt;
until pf2=nil;
delay(d500*3);
if vies=0 then
perdu:=true;
if vies>0 then goto 1;
tar:=false;
end;
pf2:=pf2^.nxt;
until (pf2=nil)or(perdu=true);
end;
{Passage secret}
if x>570 then begin x:=35; putimage(570,229,blank^,normalput); end;
if x<35 then begin x:=570; putimage(35,229,blank^,normalput); end;
until (r='Q')or(perdu=true)or(repas>214);
if repas>214 then begin
cleardevice;
outtextxy(220,30,'Prepare to next level');
while not(keypressed) do begin
delay(d500*2);
putimage(x,y,p2^.im,normalput);
p2:=p2^.nxt;
end;
if son=true then begin
for i:=1 to 3 do begin
sound(2000);
delay(300);
nosound;
delay(d500);
end;
sound(2000);
delay(d500);
nosound;
end;
end;
until (perdu=true)or(r='Q');
repeat
for j:=1 to 25 do begin
for k:=1 to 2 do begin
if k=1 then setcolor(4) else setcolor(0);
outtextxy(290-3*j,20,'L');
outtextxy(300-j,20,'O');
outtextxy(310+j,20,'S');
outtextxy(320+3*j,20,'T');
if k=1 then delay(d500);
end;
end;
for j:=25 downto 1 do begin
for k:=1 to 2 do begin
if (k=1) then setcolor(4) else setcolor(0);
outtextxy(290-3*j,20,'L');
outtextxy(300-j,20,'O');
outtextxy(310+j,20,'S');
outtextxy(320+3*j,20,'T');
if k=1 then delay(d500);
end;
end;
until keypressed;
closegraph;
end.