Арканоид на Паскале
Министерство общего и профессионального образования РФ
Белгородская Государственная Технологическая Академия
Строительных Материалов.
Кафедра ПОВТиАС
Выполнил:
Студент факультета АПиИТ
Группы ПВ-22
Маркелов Денис
Руководитель:
Белгород – 2000.
СОДЕРЖАНИЕ
1. ПРЕДИСЛОВИЕ
2. ВВЕДЕНИЕ
3. ЗАДАНИЕ КУРСОВОЙ РАБОТЫ
4. ПРАВИЛА ПОЛЬЗОВАНИЯ ПРОГРАММОЙ «АРКАНОИД»
5. ИСПОЛЬЗУЕМЫЕ СТРУКТУРЫ ДАННЫХ
6. ИСПОЛЬЗУЕМЫЕ МОДУЛИ
7. СПЕЦИФИКАЦИЯ ПОДПРОГРАММ
8. ТЕКСТ ПРОГРАММЫ И СКОНСТРУИРОВАННЫХ МОДУЛЕЙ
9. правила пользования дополнительной программой для построения уровней «MARKEDIT»
10. СПЕЦИФИКАЦИЯ ПОДПРОГРАММ В ПРОГРАММЕ «MARKEDIT»
11. ТЕКСТ ПРОГРАММЫ «MARKEDIT” И СКОНСТРУИРОВАННЫХ МОДУЛЕЙ
12. СПИСОК ИСПОЛЬЗУЕМОЙ ЛИТЕРАТУРЫ
Предисловие
Язык Турбо Паскаль – это один из самых распространённых языков программирования микрокомпьютеров. Он разработан фирмой «Борланд» как диалект стандартного языка Паскаль, но благодаря своей популярности сам стал стандартом языка программирования 8- и 16-разрядных микрокомпьютеров.
К важнейшим достоинствам языка Турбо Паскаль относятся небольшой размер компилятора, высокая степень соответствия стандартному Паскалю, очень быстрая компиляция программ, объединение компилятора с интерактивным экранным редактором, предупреждение об ошибках на уровне исходной программы, обширная библиотека подпрограмм и полезные расширения, упрощающие системное программирование.
Введение
Одной из основных проблем, с которой сталкиваются в процессе программирования, является написание программы, не содержащей ошибок. Ошибку наиболее полно можно определить как расхождение поведения программы с ожиданиями пользователя. Сюда входит как несоответствие результатов исходным данным, так и другие, порой более опасные эффекты: зацикливание, аварийная остановка программ и т.п.
Наиболее явно наблюдаемыми историческими тенденциями в программировании являются непрерывный рост пользовательских требований, лавинообразное усложнение функциональности программы и, как следствие, - усложнение её разработки.В связи с увеличением трудоёмкости програмных средств возникла необходимость выработки интеллектуальных инструментов, позволяющих разработчикам справляться с возросшей сложностью своего труда.
В настоящий момент можно утверждать, что практически каждая программа составляется с применением той или иной технологии программирования.
«В связи с тем,что за последние десять или пятьнадцать лет производительность вычислительных машин увеличилась в тысячи раз, пользователи стали гораздо более бесцеремонными при выборе проблем, которые они считают «технически разрешимыми». Пользователи хотят, чтобы размеры, сложность и изощрённость программ увеличивалась исключительно быстрыми темпами, и в последние годы стало очевидным, что в целом наши программистские возможности не поспевают за этими неумеренными аппетитами».
По мере того, как мощь компьютеров росла, а область применения всё расширялась, увеличивались не только размеры, и сложность программ, но и количество ошибок в них.
Главной задачей современного программиста при написании программы является не подвегание её бесконечным тестированиям, а тщательный, полный анализ исходного текста программы, а также отладка программы с помощью дополнительных програмных средств.
Задание на проектирование
Разработать алгоритм игры «АРКАНОИД», цель которой заключается в наборе как можно большего количества очков, которые увеличиваются при выбивании очередного кубика.
При выбивании всех кубиков текущего уровня осуществляется переход на следующий уровень, количество которых – десять.
В конце игры в зависимости от количества набранных очков, введённое по запросу программы имя игрока должно быть занесено в десятку лучших и записано в файл.
Над рамкой, в течение игры должны отображаться:
1) № текущего этапа;
2) количество оставшихся жизней, первоначально которых – 10;
количество оставшихся кубиков;
количество набранных очков.
Правила пользования программой:
запустить MARKBALL.EXE
выбрать чем играть:
2a) мышь
2б) клавиатура
выбрать скорость шарика
выбрать размер планки
Используемые структуры данных:
type t_kubik=0..640;
t_dx_dy=-1..1;
t_arr=array[1..494] of t_kubik;
kol_kubik=0..247;
t_kubik – значения всех переменных, используемых в программе, заданы в этих пределах (и не более);
t_dx_dy – значение, которое принимает коэффициент, от которого зависит направление движения по оси ОХ или ОУ;
t_arr – значения координат, которые принимает кубик, в соответствии со своим отображением (изображением) на экране;
kol_kubik – максимальное количество кубиков;
Используемые модули:
Стандартные:
CRT;
GRAPH;
WINDOS – модуль требуемый сконструируемым модулем MYMOUSE;
STRINGS – модуль требуемый сконструируемым модулем MYMOUSE;
Сконструированные:
MARKEL – основные игровые подпрограммы;
MARK_ZAS – содержит инструментарий интерфейса (заставка, помощь, счёт лучших игроков в конце игры);
MYMOUSE – работа с мышью
Спецификация подпрограмм:
Модуль MARKEL
procedure livs(var liv:byte);
Назначение: считает оставшиеся жизни, если число жизней будет равно нулю, то выводит на экран мигающую надпись: «YOU HAVE LOST»;
Входные данные: liv – число жизней;
Выходные данные: liv – оставшиеся количество жизней;
2. procedure perehod_level(const numbering:byte);
Назначение: выводит по середине экрана надпись, соответствующую началу нового этапа;
Входные данные: numbering – номер нового этапа;
Выходные данные: нет;
3. procedure planka_sharik(koeff:byte);
Назначение: рисует планку, размером, определённым от значения koeff, посередине экрана и шарик над ней;
Входные данные: koeff – число определяющее размер планки;
Выходные данные: нет;
4. procedure musik;
Назначение: выдаёт звуковой сигнал, соответствующий какому-либо касанию шарика о что нибудь;
Входные данные: нет;
Выходные данные: нет;
5.procedure izchez_vv_niz(var dy:t_dx_dy;x,y,i:t_kubik;var a:t_arr;var kol_kub:kol_kubik);
Назначение: определяет коснулся ли шарик кубика о верхнюю или нижнюю грань;
Входные данные:
dy – направление движения шарика по оси Y;
x,y – текущие координаты центра шарика;
i – значение, от которого зависит какие кубики проверять на сбивание;
a – массив координат кубиков;
kol_kub – количество кубиков на данный момент;
Выходные данные:
dy – изменённое направление движения шарика по оси Y;
a – изменённый массив координат кубиков;
kol_kub – изменённое количество кубиков;
6. procedure bok_bok(var dx:t_dx_dy;x,y:t_kubik;var a:t_arr;var kol_kub:kol_kubik);
Назначение: определяет коснулся ли шарик кубика о левую или правую грань;
Входные данные:
dx – направление движения шарика по оси X;
x,y – текущие координаты центра шарика;
a – массив координат кубиков;
kol_kub – количество кубиков на данный момент;
Выходные данные:
dx – изменённое направление движения шарика по оси X;
a – изменённый массив координат кубиков;
kol_kub – изменённое количество кубиков;
7. procedure death;
Назначение: выдаёт звуковой сигнал, соответствующий проигрышу одной жизни;
Входные данные: нет;
Выходные данные: нет;
8. procedure ugolki(var dx,dy:t_dx_dy;x,y:t_kubik;var a:t_arr;var kol_kub:kol_kubik);
Назначение: определяет коснулся ли шарик кубика об углы;
Входные данные:
dx,dy – направление движения шарика по осям X и Y;
x,y – текущие координаты центра шарика;
a – массив координат кубиков;
kol_kub – количество кубиков на данный момент;
Выходные данные:
dx,dy – изменённое направление движения шарика по осям X и Y;
a – изменённый массив координат кубиков;
kol_kub – изменённое количество кубиков;
9. procedure pausing(var pause:word);
Назначение: определяет скорость движения шарика по выбору самим пользователем, с наглядным графическим интерфейсом;
Входные данные:
pause – предполагаемая пауза;
Выходные данные:
pause – уже определённая пауза;
10. procedure zapis(const xs,ys:t_kubik; i:t_kubik;var a:t_arr);
Назначение: определяет на какие места в массиве записывать координаты кубика;
Входные данные:
1) xs,ys – координаты шарика, которые и нужно записать в массив;
i – переменная от которой зависит с какого номера искать подходящее место для координат кубика;
a – массив координат кубиков;
Выходные данные: нет
11. procedure level(var a:t_arr;const numbering:byte;var kol_kub:kol_kubik);
Назначение: открывает файл и считывая с него координаты кубиков, рисует их;
Входные данные:
a – массив координат кубиков;
numbering – номер открываемого этапа;
kol_kub – количество кубиков;
Выходные данные:
a – массив координат кубиков;
2) kol_kub – количество нарисованных кубиков;
12. procedure left(const koeff:byte;var x1_dv,x2_dv:t_kubik);
Назначение: движение планки влево;
Входные данные:
1) koeff – коэффициент, от которого зависит размер планки;
x1_dv,x2_dv – координаты планки по оси Х;
Выходные данные:
x1_dv,x2_dv – изменившиеся координаты планки по оси Х;
13. procedure right(const koeff:byte;var x1_dv,x2_dv:t_kubik);
Назначение: движение планки вправо;
Входные данные:
1) koeff – коэффициент, от которого зависит размер планки;
x1_dv,x2_dv – координаты планки по оси Х;
Выходные данные:
x1_dv,x2_dv – изменившиеся координаты планки по оси Х;
14. procedure dviguna_keyboard(const koeff:byte;var x,x1_dv,x2_dv:t_kubik;var y:t_kubik);
Назначение: ожидание нажатия клавиши для начала нового этапа, если пользователь играет на клавиатуре;
Входные данные:
1) koeff – коэффициент, от которого зависит размер планки;
x,y – координаты шарика;
x1_dv,x2_dv – координаты планки по оси Х;
Выходные данные:
x,y – координаты шарика;
x1_dv,x2_dv – изменившиеся координаты планки по оси Х;
15. procedure dviguna_mouse(const koeff:byte;var x,x1_dv,x2_dv:t_kubik;var y:t_kubik);
Назначение: ожидание нажатия кнопки мыши для начала нового этапа, если пользователь играет мышью;
Входные данные:
1) koeff – коэффициент, от которого зависит размер планки;
2) x,y – координаты шарика;
x1_dv,x2_dv – координаты планки по оси Х;
Выходные данные:
x,y – координаты шарика;
x1_dv,x2_dv – изменившиеся координаты планки по оси Х;
16. procedure zar_nar(var x,y:t_kubik;const dx,dy:t_dx_dy);
Назначение: закраска уже нарисованного шарика и нарисование нового шарика с изменёнными координатами;
Входные данные:
1) x,y – координаты шарика;
2) dx,dy – от значения этих переменных зависит движение шарика в ту или иную сторону;
Выходные данные:
x,y – координаты шарика;
17. function chem_play:boolean;
Назначение: определение пользователем чем играть (клавиатурой или мышью), с наглядным графическим интерфейсом;
Входные данные:
Нет;
Выходные данные:
true – играем мышью;
false – играем на клавиатуре;
18. procedure razmer_planki(var koeff:byte);
Назначение: определение пользователем размера планки;
Входные данные:
Koeff – коэффициент, определяющий размер планки;
Выходные данные:
Koeff – коэффициент, определяющий размер планки; граем мышью;
19. procedure naverhu_liv(liv:byte);
Назначение: отображение над рамкой в течение игры количества оставшихся жизней;
Входные данные:
liv – число жизней;
Выходные данные:
нет;
20.procedure naverhu_number(numbering:byte);
Назначение: отображение над рамкой в течение игры номера текущего уровня;
Входные данные:
numbering – номер уровня;
Выходные данные:
нет;
21. procedure naverhu_kubiki(kol_kub:byte);
Назначение: отображение над рамкой в течение игры количества оставшихся кубиков;
Входные данные:
Kol_kub – число оставшихся кубиков;
Выходные данные:
нет;
Модуль MARK_ZAS
1. procedure zastavka(s2:string);
Назначение: в начале игры используется в качестве заставки с мигающей большой надписью «MARKBALL» и ниже мигающей надписью «Click to start» ,также используется при потере всех жизней , но при этом нижняя надпись будет «You have lost» , а при прохождении всех этапов нижняя надпись будет «The end of game»;
Входные данные:
S2 – нижняя мигающая надпись;
Выходные данные:
нет;
2. procedure text_na_ekran;
Назначение: используется как справка пока игра ещё не началась при нажатии клавиши «F1»;
Входные данные:
нет;
Выходные данные:
нет;
3. procedure ochki(score:word);
Назначение: в конце игры считает в соответствии с набранными очками: займёт ли данный игрок, который ввёл по запросу программы своё имя, какое-нибудь место среди представленных десяти мест; если количество набранных очков позволяет игроку занять некоторое место, то программа выводит на экран таблицу лидеров, включающую в себя имя данного игрока, в противном случае на экран всё же будет выведена таблица лидеров, но имени данного игрока содержаться там не будет;
Входные данные:
Score – количество набранных в течении игры очков;
Выходные данные:
нет;
Основная программа
1. Procedure initgr;
Назначение: инициализирует графику в режиме vgahi;
Входные данные: нет;
Выходные данные: нет;
2. Procedure vostanovka_colors;
Назначение: восстанавливает цвета со стандартными оттенками;
Входные данные: нет;
Выходные данные: нет;
Текст программы:
program mark_ball;
uses graph,crt,mymouse,markel,mark_zas;
procedure initgr;
var grdriver,grmode:integer;
begin
grdriver:=vga;
grmode:=vgahi;
initgraph(grdriver,grmode,'');
if GraphResult <> grOk then halt;
end;
procedure vostanovka_colors;
begin
setrgbpalette(black,0,0,0);
setrgbpalette(blue,0,0,40);
setrgbpalette(green,0,40,0);
setrgbpalette(cyan,0,40,40);
setrgbpalette(red,40,7,7);
setrgbpalette(magenta,40,0,40);
setrgbpalette(brown,40,30,0);
setrgbpalette(lightgray,49,49,49);
setrgbpalette(darkgray,26,26,26);
setrgbpalette(lightblue,0,0,63);
setrgbpalette(lightgreen,9,63,9);
setrgbpalette(lightcyan,0,63,63);
setrgbpalette(lightred,63,10,10);
setrgbpalette(lightmagenta,44,0,63);
setrgbpalette(yellow,63,63,18);
setrgbpalette(white,63,63,63);
end;
var y_planka,xmax,
x1_dv,x2_dv,x,y,i:t_kubik;
x_get,y_get,x_get_pred:word;
dx,dy:t_dx_dy;
a:t_arr;
numbering,liv:byte;
kol_kub:kol_kubik;
lb,rb,tb,dviguna:boolean;
buttoncount,errorcode,koeff:byte;
pause:word;
score:integer;
s2:string;
begin
s2:='Click to start';
initgr;
zastavka(s2);
vostanovka_colors;
setlinestyle(0,0,1);
randomize;
cleardevice;
xmax:=getmaxx-radius-1;
y:=getmaxy-shir-radius-1;
y_planka:=getmaxy-shir-radius-1;
liv:=10;
score:=-10;
dviguna:=chem_play;
pausing(pause);
razmer_planki(koeff);
for numbering:=1 to 10 do
begin
perehod_level(numbering);
cleardevice;
planka_sharik(koeff);
level(a,numbering,kol_kub);
naverhu_number(numbering);
naverhu_liv(liv);
naverhu_kubiki(kol_kub,score);
dx:=-1;
dy:=-1;
{а ¬Є }
setcolor(random(14)+1);
rectangle(0,21,getmaxx,getmaxy);
if dviguna then dviguna_mouse(koeff,x,x1_dv,x2_dv,y)
else dviguna_keyboard(koeff,x,x1_dv,x2_dv,y);
while kol_kub>0 do
begin
zar_nar(x,y,dx,dy);
delay(pause);
if (y=radius+1+21) or
((x1_dv<x) and (x<x2_dv) and (y=y_planka)) then
begin dy:=-dy; musik; end else
if (x=xmax) or (x=radius+1) then
begin dx:=-dx; musik; end else
if y=y_planka then
begin
setcolor(0);
circle(x,y,radius);
setfillstyle(0,0);
bar3d(x1_dv,y1_dv,x2_dv,y2_dv,0,false);
dy:=-1;
death;
livs(liv,score);
case dviguna of
true:dviguna_mouse(koeff,x,x1_dv,x2_dv,y);
false:dviguna_keyboard(koeff,x,x1_dv,x2_dv,y);
end;
end;
case x of
1..49: begin i:=37;izchez_vv_niz(dy,x,y,i,a,kol_kub,score); end;
50..99: begin i:=75;izchez_vv_niz(dy,x,y,i,a,kol_kub,score); end;
100..148:begin i:=113;izchez_vv_niz(dy,x,y,i,a,kol_kub,score); end;
149..197:begin i:=151;izchez_vv_niz(dy,x,y,i,a,kol_kub,score); end;
198..246:begin i:=189;izchez_vv_niz(dy,x,y,i,a,kol_kub,score); end;
247..295:begin i:=227;izchez_vv_niz(dy,x,y,i,a,kol_kub,score); end;
296..344:begin i:=265;izchez_vv_niz(dy,x,y,i,a,kol_kub,score); end;
345..393:begin i:=303;izchez_vv_niz(dy,x,y,i,a,kol_kub,score); end;
394..442:begin i:=341;izchez_vv_niz(dy,x,y,i,a,kol_kub,score); end;
443..491:begin i:=379;izchez_vv_niz(dy,x,y,i,a,kol_kub,score); end;
492..540:begin i:=417;izchez_vv_niz(dy,x,y,i,a,kol_kub,score); end;
541..588:begin i:=455;izchez_vv_niz(dy,x,y,i,a,kol_kub,score); end;
589..637:begin i:=493;izchez_vv_niz(dy,x,y,i,a,kol_kub,score); end;
end;
bok_bok(dx,x,y,a,kol_kub,score);
ugolki(dx,dy,x,y,a,kol_kub,score);
case dviguna of
false:
if keypressed then
case readkey of
#75: left(koeff,x1_dv,x2_dv);
#77: right(koeff,x1_dv,x2_dv);
#27:begin closegraph; halt; end;
end;
true:
begin
getmousexy(x_get,y_get,lb,rb,tb);
if x_get_pred<>x_get then begin
setcolor(0);
setfillstyle(0,0);
bar3d(x1_dv,y1_dv,x2_dv,y2_dv,0,false);
setfillstyle(6,13);
setcolor(13);
x1_dv:=x_get;
x2_dv:=x1_dv+koeff*shir;
bar3d(x1_dv,y1_dv,x2_dv,y2_dv,0,false);
x_get_pred:=x_get; end;
if rb then begin closegraph;halt;end;
end;
end;
end;
dec(score,10);
end;
inc(score,10);
ochki(score);
s2:='The end of game';
zastavka(s2);
closegraph;
end.
Текст сконструируемых модулей:
unit markel;
interface
uses crt,graph,mymouse,mark_zas;
var sverhu:string;
liv,numbering:byte;
const radius=7;
shir=15;
y1_dv=479-1;
y2_dv=479-shir;
type t_kubik=-10..640;
t_dx_dy=-1..1;
t_arr=array[1..494] of t_kubik;
kol_kubik=0..247;
procedure livs(var liv:byte;score:integer);
procedure perehod_level(const numbering:byte);
procedure planka_sharik(koeff:byte);
procedure musik;
procedure izchez_vv_niz(var dy:t_dx_dy;x,y,i:t_kubik;var a:t_arr;var kol_kub:kol_kubik;var score:integer);
procedure bok_bok(var dx:t_dx_dy;x,y:t_kubik;var a:t_arr;var kol_kub:kol_kubik;var score:integer);
procedure death;
procedure ugolki(var dx,dy:t_dx_dy;x,y:t_kubik;var a:t_arr;var kol_kub:kol_kubik;var score:integer);
procedure pausing(var pause:word);
procedure zapis(const xs,ys:t_kubik;i:t_kubik;var a:t_arr);
procedure level(var a:t_arr;const numbering:byte;var kol_kub:kol_kubik);
procedure left(const koeff:byte;var x1_dv,x2_dv:t_kubik);
procedure right(const koeff:byte;var x1_dv,x2_dv:t_kubik);
procedure dviguna_keyboard(const koeff:byte;var x,x1_dv,x2_dv:t_kubik;var y:t_kubik);
procedure dviguna_mouse(const koeff:byte;var x,x1_dv,x2_dv:t_kubik;var y:t_kubik);
procedure zar_nar(var x,y:t_kubik;const dx,dy:t_dx_dy);
function chem_play:boolean;
procedure razmer_planki(var koeff:byte);
procedure naverhu_liv(liv:byte);
procedure naverhu_number(numbering:byte);
procedure naverhu_kubiki(kol_kub:byte;var score:integer);
procedure naverhu_score(score:integer);
implementation
function chem_play:boolean;
var mask:boolean;
greenvalue,bluevalue:0..64;
i,j:-1..1;
begin
setcolor(blue);
settextstyle(4{GothicFont},horizdir,5);
settextjustify(1,1);
outtextxy(round(getmaxx / 3.3), round(getmaxy / 2.3),'Mouse');
setcolor(green);
outtextxy(round(getmaxx / 1.5), round(getmaxy / 2.3),'Keyboard');
i:=1;
j:=1;
greenvalue:=0;
bluevalue:=0;
while true do
begin
repeat
case mask of
true:begin
setRGBpalette(blue,0,0,bluevalue);
inc(bluevalue,i);
if (bluevalue = 63) or (bluevalue = 0) then
i:=-i;
end;
false:begin
setRGBpalette(green,0,greenvalue,0);
inc(greenvalue,j);
if (greenvalue = 63) or (greenvalue = 0) then
j:=-j;
end;
end;
until keypressed;
case readkey of
#75: mask:=true;
#77: mask:=false;
#13: begin chem_play:=mask; delay(5000); cleardevice; exit; end;
#27: begin closegraph; halt; end;
end;
end;
end;
procedure ugolki(var dx,dy:t_dx_dy;x,y:t_kubik;var a:t_arr;var kol_kub:kol_kubik;var score:integer);
procedure izchez(var dx,dy:t_dx_dy;var a:t_arr;var kol_kub:kol_kubik;i:word);
begin
setcolor(0);
setfillstyle(1,0);
bar3d(a[i],a[i+1],a[i]+48,a[i+1]-20,0,false);
musik;
a[i]:=0;
a[i+1]:=0;
dx:=-dx;
dy:=-dy;
dec(kol_kub);
musik;
naverhu_kubiki(kol_kub,score);
exit;
end;
var i:1..496;
begin
i:=1;
while i<=493 do
begin
if x-radius+1=a[i]+48 then
if (y-radius+1=a[i+1])or((y-radius+1<a[i+1])and(y-radius+1>a[i+1]-20))
or(y+radius-1=a[i+1]-20)or((y+radius-1<a[i+1])and(y+radius-1>a[i+1]-20))
then izchez(dx,dy,a,kol_kub,i);
if x+radius-1=a[i] then
if (y+radius-1=a[i+1]-20)or((y+radius-1<a[i+1])and(y+radius-1>a[i+1]-20))
or(y-radius+1=a[i+1])or((y-radius+1<a[i+1])and(y-radius+1>a[i+1]-20))
then izchez(dx,dy,a,kol_kub,i);
if y-radius+1=a[i+1] then
if (x-radius+1=a[i]+48)or((x-radius+1>a[i])and(x-radius+1<a[i]+48))
or(x+radius-1=a[i])or((x+radius-1>a[i])and(x+radius-1<a[i]+48))
then izchez(dx,dy,a,kol_kub,i);
if y+radius-1=a[i+1]-20 then
if (x+radius-1=a[i])or((x+radius-1>a[i])and(x+radius-1<a[i]+48))
or(x-radius+1=a[i]+48)or((x-radius+1>a[i])and(x-radius+1<a[i]+48))
then izchez(dx,dy,a,kol_kub,i);
inc(i,2);
end;
end;
procedure pausing(var pause:word);
var xmax,y_planka,x,y:t_kubik;
dx,dy:-1..1;
s:string;
redvalue,bluevalue:0..63;
i:-1..1;
begin
setcolor(lightgray);
s:='Adjust speed of a ball';{'отрегулируйте скорость шарика'}
settextstyle(4{GothicFont},horizdir,5);
settextjustify(1,1);
outtextxy(getmaxx div 2, getmaxy div 2,s);
i:=1;
redvalue:=0;
bluevalue:=0;
repeat
repeat
setRGBpalette(lightgray,redvalue,0,bluevalue);
inc(bluevalue,i);
inc(redvalue,i);
until keypressed or (bluevalue=63) or (bluevalue=0);
i:=-i;
until keypressed;
cleardevice;
{рамка}
setcolor(random(14)+1);
rectangle(0,0,getmaxx,getmaxy);
xmax:=getmaxx-radius-1;
y_planka:=getmaxy-shir-radius-1;
{планка на весь низ}
setcolor(13);
setfillstyle(6,13);
bar3d(1,getmaxy-1,getmaxx,getmaxy-shir,0,false);
{шарик над планкой}
x:=getmaxx div 2;
y:=getmaxy-shir-radius-1;
setcolor(10);
circle(x,y,radius);
dx:=1;
dy:=-1;
pause:=6;
repeat
while not(keypressed) do
begin
zar_nar(x,y,dx,dy);
delay(pause);
if y=radius+1 then
begin dy:=-dy; musik; end else
if x=xmax then
begin dx:=-dx; musik; end else
if y=y_planka then
begin dy:=-dy; musik; end else
if x=radius+1 then
begin dx:=-dx; musik; end;
end;
case readkey of
#45{'-'}:if pause<65535 then inc(pause);
#42{'*'}:if pause >2 then dec(pause);
#13:begin cleardevice; exit; end;
end;
until false;
end;
procedure razmer_planki(var koeff:byte);
var s:string;
x1,y1,x2,y2:integer;
i:-1..1;
redvalue,bluevalue:0..63;
begin
setcolor(red);
s:='Adjust the size of a rod'{'отрегулируйте размер планки'};
settextstyle(4{GothicFont},horizdir,5);
settextjustify(1,1);
outtextxy(getmaxx div 2, getmaxy div 2, s);
i:=1;
redvalue:=0;
bluevalue:=0;
repeat
repeat
setRGBpalette(red,redvalue,bluevalue,0);
inc(bluevalue,i);
inc(redvalue,i);
until keypressed or (redvalue=0) or (redvalue=63);
i:=-i;
until keypressed;
cleardevice;
{рамка}
setcolor(random(14)+1);
rectangle(0,0,getmaxx,getmaxy);
{планка посередине}
setcolor(13);
setfillstyle(6,13);
koeff:=4;
x1:=round(getmaxx/2-(koeff/2)*shir-1);
y1:=getmaxy-1;
x2:=round(getmaxx/2+(koeff/2)*shir);
y2:=getmaxy-shir;
bar3d(x1,y1,x2,y2,0,false);
repeat
if keypressed then
case readkey of
#42{'*'}:if koeff<42 then
begin
inc(koeff);
x1:=round(getmaxx/2-(koeff/2)*shir-1);
y1:=getmaxy-1;
x2:=round(getmaxx/2+(koeff/2)*shir);
y2:=getmaxy-shir;
bar3d(x1,y1,x2,y2,0,false);
end;
#45{-}:if koeff>2 then
begin
setcolor(0);
setfillstyle(0,0);
x1:=round(getmaxx/2-(koeff/2)*shir-1);
y1:=getmaxy-1;
x2:=round(getmaxx/2+(koeff/2)*shir);
y2:=getmaxy-shir;
bar3d(x1,y1,x2,y2,0,false);
dec(koeff);
setcolor(13);
setfillstyle(6,13);
x1:=round(getmaxx/2-(koeff/2)*shir-1);
y1:=getmaxy-1;
x2:=round(getmaxx/2+(koeff/2)*shir);
y2:=getmaxy-shir;
bar3d(x1,y1,x2,y2,0,false);
end;
#13:exit;
end;
until false;
end;
procedure livs(var liv:byte;score:integer);
var s2:string;
begin
dec(liv);
naverhu_liv(liv);
if liv=0 then
begin
ochki(score);
s2:='You have lost !';
zastavka(s2);
closegraph;
halt;
end;
end;
procedure perehod_level(const numbering:byte);
var i,j:30..330;
s:string;
begin
str(numbering,s);
s:='level '+s;
cleardevice;
setcolor(14);
settextstyle(4{GothicFont},horizdir,5);
settextjustify(1,1);
outtextxy(getmaxx div 2, getmaxy div 2, s);
i:=30;
j:=280;
{while (i<>330) and (j<>30) do
begin
sound(i);
delay(100);
sound(j);
delay(100);
inc(i);
dec(j);
end;
nosound;}
delay(5000);
end;
procedure planka_sharik(koeff:byte);
var x1,y1,x2,y2,x,y:integer;
begin
{планка посередине}
setcolor(13);
setfillstyle(6,13);
x1:=round(getmaxx/2-(koeff/2)*shir-1);
y1:=getmaxy-1;
x2:=round(getmaxx/2+(koeff/2)*shir);
y2:=getmaxy-shir;
bar3d(x1,y1,x2,y2,0,false);
{шарик над планкой}
x:=getmaxx div 2;
y:=getmaxy-shir-radius-1;
setcolor(10);
circle(x,y,radius);
end;
procedure musik;
begin
{sound(460);
delay(130);
nosound;}
end;
procedure izchez_vv_niz(var dy:t_dx_dy;x,y,i:t_kubik;var a:t_arr;var kol_kub:kol_kubik;var score:integer);
var p:-3..494;
begin
p:=i-36;
while (i>=p) and not((y-radius+1=a[i+1]) or (y+radius-1=a[i+1]-20)) do
dec(i,2);
if i<0 then inc(i,2);
if (y-radius+1=a[i+1]) or (y+radius-1=a[i+1]-20) then
begin
setcolor(0);
setfillstyle(1,0);
bar3d(a[i],a[i+1],a[i]+48,a[i+1]-20,0,false);
musik;
a[i]:=0;
a[i+1]:=0;
dy:=-dy;
dec(kol_kub);
naverhu_kubiki(kol_kub,score);
end;
end;
procedure bok_bok(var dx:t_dx_dy;x,y:t_kubik;var a:t_arr;var kol_kub:kol_kubik;var score:integer);
var i:1..496;
begin
i:=1;
while i<=493 do
begin
if ((x+radius-1=a[i]) and (y<a[i+1]) and (y>a[i+1]-20)) or
((x-radius+1=a[i]+48) and (y<a[i+1]) and (y>a[i+1]-20)) then
begin
setcolor(0);
setfillstyle(1,0);
bar3d(a[i],a[i+1],a[i]+48,a[i+1]-20,0,false);
musik;
a[i]:=0;
a[i+1]:=0;
dx:=-dx;
dec(kol_kub);
musik;
naverhu_kubiki(kol_kub,score);
exit;
end;
inc(i,2);
end;
end;
procedure death;
var i:30..800;
begin
i:=800;
{while i<>30 do
begin
sound(i);
delay(10);
dec(i);
end;
nosound;}
end;
procedure zapis(const xs,ys:t_kubik;i:t_kubik;var a:t_arr);
begin
while a[i]<>0 do
inc(i,2);
a[i]:=xs;
a[i+1]:=ys;
end;
procedure level(var a:t_arr;const numbering:byte;var kol_kub:kol_kubik);
var xs,ys,i:t_kubik;
f:text;
color,pattern:byte;
number:string;
begin
for i:=1 to 494 do
a[i]:=0;
str(numbering,number);
assign(f,'levels\level'+number+'.den');
reset(f);
while not eof(f) do
begin
readln(f,xs,ys);
color:=random(14)+1;
pattern:=random(11)+1;
setcolor(color);
setfillstyle(pattern,color);
bar3d(xs,ys,48+xs,ys-20,0,false);
end;
close(f);
kol_kub:=0;
reset(f);
while not eof(f) do
begin
readln(f,xs,ys);
if xs<>0 then inc(kol_kub);
case xs of
1: begin i:=1; zapis(xs,ys,i,a); end;
50: begin i:=39; zapis(xs,ys,i,a); end;
99: begin i:=77; zapis(xs,ys,i,a); end;
148: begin i:=115; zapis(xs,ys,i,a); end;
197: begin i:=153; zapis(xs,ys,i,a); end;
246: begin i:=191; zapis(xs,ys,i,a); end;
295: begin i:=229; zapis(xs,ys,i,a); end;
344: begin i:=267; zapis(xs,ys,i,a); end;
393: begin i:=305; zapis(xs,ys,i,a); end;
442: begin i:=343; zapis(xs,ys,i,a); end;
491: begin i:=381; zapis(xs,ys,i,a); end;
540: begin i:=419; zapis(xs,ys,i,a); end;
589: begin i:=457; zapis(xs,ys,i,a); end;
end;
end;
close(f);
end;
procedure left(const koeff:byte;var x1_dv,x2_dv:t_kubik);
begin
if x1_dv-8 <= 0 then
begin
musik;
setcolor(0);
setfillstyle(0,0);
bar3d(x1_dv,y1_dv,x2_dv,y2_dv,0,false);
setfillstyle(6,13);
setcolor(13);
x1_dv:=1;
x2_dv:=koeff*shir;
bar3d(x1_dv,y1_dv,x2_dv,y2_dv,0,false);
end else
begin
setcolor(0);
setfillstyle(0,0);
bar3d(x1_dv,y1_dv,x2_dv,y2_dv,0,false);
setfillstyle(6,13);
setcolor(13);
dec(x1_dv,8);
dec(x2_dv,8);
bar3d(x1_dv,y1_dv,x2_dv,y2_dv,0,false);
end;
end;
procedure right(const koeff:byte;var x1_dv,x2_dv:t_kubik);
begin
if x2_dv+8 >= getmaxx then
begin
musik;
setcolor(0);
setfillstyle(0,0);
bar3d(x1_dv,y1_dv,x2_dv,y2_dv,0,false);
setfillstyle(6,13);
setcolor(13);
x2_dv:=getmaxx-1;
x1_dv:=x2_dv-koeff*shir;
bar3d(x1_dv,y1_dv,x2_dv,y2_dv,0,false);
end else
begin
setcolor(0);
setfillstyle(0,0);
bar3d(x1_dv,y1_dv,x2_dv,y2_dv,0,false);
setfillstyle(6,13);
setcolor(13);
inc(x1_dv,8);
inc(x2_dv,8);
bar3d(x1_dv,y1_dv,x2_dv,y2_dv,0,false);
end;
end;
procedure dviguna_keyboard(const koeff:byte;var x,x1_dv,x2_dv:t_kubik;var y:t_kubik);
begin
{Рисуем планку с шариком посередине}
planka_sharik(koeff);
{Ниже --- координаты планки и шарика(только-что нарисованных)}
x1_dv:=round(getmaxx/2-(koeff/2)*shir-1);
x2_dv:=round(getmaxx/2+(koeff/2)*shir);
x:=getmaxx div 2;
y:=getmaxy-shir-radius-1;
repeat
case readkey of
#75: if x > (koeff div 2)*shir then
begin
left(koeff,x1_dv,x2_dv);
setcolor(0);
circle(x,y,radius);
x:=round(x1_dv+shir*koeff/2);
setcolor(10);
circle(x,y,radius);
end;
#77: if x < getmaxx-(koeff/2)*shir then
begin
right(koeff,x1_dv,x2_dv);
setcolor(0);
circle(x,y,radius);
x:=round(x1_dv+shir*koeff/2);
setcolor(10);
circle(x,y,radius);
end;
' ': exit;
#27:begin closegraph; halt; end;
end;
until false;
end;
procedure dviguna_mouse(const koeff:byte;var x,x1_dv,x2_dv:t_kubik;var y:t_kubik);
var x_get,y_get:word;
x_get_pred:word;
lb,rb,tb:boolean;
begin
{Рисуем планку с шариком посередине}
planka_sharik(koeff);
{устанавливает ограничение перемещения курсора мыши по вертикали}
setYrange(5,5);
{устанавливает ограничение перемещения курсора мыши по горизонтали}
setXrange(1,getmaxx-koeff*shir-1);
{Ниже --- координаты планки и шарика(только-что нарисованных)}
x1_dv:=round(getmaxx/2-(koeff/2)*shir-1);
x2_dv:=round(getmaxx/2+(koeff/2)*shir);
setmousexy(x1_dv,0);
x:=getmaxx div 2;
y:=getmaxy-shir-radius-1;
repeat
getmousexy(x_get,y_get,lb,rb,tb);
if x_get_pred<>x_get then
begin
setcolor(0);
setfillstyle(0,0);
bar3d(x1_dv,y1_dv,x2_dv,y2_dv,0,false);
setfillstyle(6,13);
setcolor(13);
x1_dv:=x_get;
x2_dv:=x1_dv+koeff*shir;
bar3d(x1_dv,y1_dv,x2_dv,y2_dv,0,false);
x_get_pred:=x_get;
setcolor(0);
circle(x,y,radius);
setcolor(10);
x:=x_get+round(koeff/2)*shir;
circle(x,y,radius);
end;
until lb;
end;
procedure zar_nar(var x,y:t_kubik;const dx,dy:t_dx_dy);
begin
setcolor(0);
circle(x,y,radius);
inc(x,dx);
inc(y,dy);
setcolor(10);
circle(x,y,radius);
end;
procedure naverhu_number(numbering:byte);
var s:string;
begin
settextstyle(4{GothicFont},horizdir,3);
settextjustify(centertext,centertext);
setfillstyle(1,black);
bar(0,0,120,19);
setcolor(lightgreen);
str(numbering,s);
s:='Level '+s;
outtextxy(60,5,s);
end;
procedure naverhu_liv(liv:byte);
var s:string;
begin
settextstyle(4{GothicFont},horizdir,3);
settextjustify(centertext,centertext);
setfillstyle(1,black);
bar(140,0,250,19);
setcolor(lightgreen);
str(liv,s);
s:='Lifes '+s;
outtextxy(195,5,s);
end;
procedure naverhu_kubiki(kol_kub:byte;var score:integer);
var s:string;
begin
settextstyle(4{GothicFont},horizdir,3);
settextjustify(centertext,centertext);
setfillstyle(1,black);
bar(270,0,420,19);
setcolor(lightgreen);
str(kol_kub,s);
s:='Kubikov '+s;
outtextxy(345,5,s);
inc(score,10);
naverhu_score(score);
end;
procedure naverhu_score(score:integer);
var s:string;
begin
settextstyle(4{GothicFont},horizdir,3);
settextjustify(centertext,centertext);
setfillstyle(1,black);
bar(440,0,630,19);
setcolor(lightgreen);
str(score,s);
s:='Score '+s;
outtextxy(535,5,s);
end;
end.
unit mark_zas;
interface
uses crt,graph,mymouse;
type t_mas=array [1..11] of word;
procedure zastavka(s2:string);
procedure text_na_ekran;
procedure ochki(score:word);
implementation
procedure text_na_ekran;
var f:text;
a:char;
begin
assign(f,'pravila.txt');
reset(f);
textmode(1);
textbackground(3);
textcolor(0);
clrscr;
while not eof(f) do
begin
while not(eof(f)) do
begin
read(f,a);
write(a);
end;
writeln;
end;
while not(keypressed) do
case readkey of
#27:exit;
end;
close(f);
end;
procedure zastavka(s2:string);
var redvalue:-2..63;
greenvalue2:-2..63;
lb,rb,tb:boolean;
buttoncount,errorcode:byte;
x,y:word;
i:-1..1;
begin
initmouse(buttoncount,errorcode);
cleardevice;
setcolor(lightgreen);
setlinestyle(0,2,3);
rectangle(0,0,getmaxx,getmaxy);
settextjustify(centertext,centertext);
settextstyle(4{GothicFont},horizdir,9);
setcolor(3);
outtextxy(getmaxx div 2,round(getmaxy / 2.5),'Markball');
setcolor(1);
settextstyle(7{TSCR.CHR},horizdir,2);
settextjustify(lefttext,centertext);
if s2='Click to start' then
outtextxy(10,10,'Press F1 for the help');
setcolor(2);
settextstyle(7{TSCR.CHR},horizdir,3);
outtextxy(getmaxx div 2,round(getmaxy / 1.3), s2);
i:=1;
redvalue:=1;
greenvalue2:=62;
repeat
repeat
inc(redvalue,i);
setRGBpalette(3,redvalue,redvalue,0);
getmouseXY(x,y,lb,rb,tb);
inc(greenvalue2,-i);
setRGBpalette(2,0,greenvalue2,greenvalue2);
setRGBpalette(1,Greenvalue2,0,0);
until (redvalue=63) or (redvalue=0) or rb or lb or keypressed;
i:=-i;
if keypressed then
case readkey of
#59{F1}:
begin
text_na_ekran;
SetGraphMode(vgahi);
setcolor(lightgreen);
setlinestyle(0,2,3);
rectangle(0,0,getmaxx,getmaxy);
settextjustify(centertext,centertext);
settextstyle(4{GothicFont},horizdir,9);
redvalue:=1;
greenvalue2:=62;
setcolor(3);
outtextxy(getmaxx div 2,round(getmaxy / 2.5),'Markball');
setcolor(1);
settextstyle(7{TSCR.CHR},horizdir,2);
settextjustify(lefttext,centertext);
if s2='Click to start' then
outtextxy(10,10,'Press F1 for the help');
setcolor(2);
settextstyle(7{TSCR.CHR},horizdir,3);
outtextxy(getmaxx div 2,round(getmaxy / 1.3), s2);
end;
#13:exit;
end;
until rb or lb;
end;
procedure ochki(score:word);
var f:text;
s:string[15];
c:word;
numb,mynumber:-5..20;
player:t_mas;
players_name:array [1..11] of string[15];
x,y:word;
i:char;
myname:string[15];
label ld;
begin
assign(f,'record.txt');
reset(f);
readln(f);
numb:=0;
while not eof(f) do
begin
readln(f,c);
inc(numb);
player[numb]:=c;
readln(f);
end;
close(f);
reset(f);
numb:=0;
while not eof(f) do
begin
readln(f,s);
inc(numb);
players_name[numb]:=s;
readln(f);
end;
close(f);
x:=getmaxx div 2-140;
y:=35;
bar3d(x,y,x+280,y+100,0,false);
settextjustify(centertext,centertext);
settextstyle(4{Gothic Font},horizdir,3);
setcolor(lightcyan);
outtextxy(x+140,y+10,'Enter your name');
myname:='';
while true do
if keypressed then
begin
i:=readkey;
case i of
#13: goto ld;
else begin
outtextxy(x+20,y+40,i);
inc(x,18);
myname:=myname+i;
end;
end;
end;
ld:
mynumber:=0;
numb:=1;
while (numb <= 10) and (score < player[numb]) do
inc(numb);
if numb = 11 then
begin
x:=getmaxx div 2-140;
y:=35;
bar3d(x,y,x+280,y+300,0,false);
settextjustify(centertext,centertext);
settextstyle(4{Gothic Font},horizdir,3);
setcolor(lightcyan);
outtextxy(x+140,y+10,'The best players');
settextjustify(lefttext,centertext);
y:=75;
for numb:=1 to 10 do
begin
outtextxy(x+10,y,players_name[numb]);
str(player[numb],s);
outtextxy(x+190,y,s);
inc(y,25);
delay(1000);
end;
end
else
begin
settextstyle(4{Gothic Font},horizdir,3);
mynumber:=numb;
for c:=10 downto numb do
begin
player[c+1]:=player[c];
players_name[c+1]:=players_name[c];
end;
player[mynumber]:=score;
players_name[mynumber]:=myname;
x:=getmaxx div 2-140;
y:=35;
bar3d(x,y,x+280,y+300,0,false);
settextjustify(centertext,centertext);
settextstyle(4{Gothic Font},horizdir,3);
setcolor(lightcyan);
outtextxy(x+140,y+10,'The best players');
y:=75;
settextjustify(lefttext,centertext);
for numb:=1 to 10 do
begin
outtextxy(x+10,y,players_name[numb]);
str(player[numb],s);
outtextxy(x+190,y,s);
inc(y,25);
delay(1000);
end;
rewrite(f);
for numb:=1 to 10 do
begin
writeln(f,players_name[numb]);
writeln(f,player[numb]);
end;
close(f);
end;
readkey;
end;
end.
Дополнительная программа для построения собственных уровней :
Правила пользования программой:
запустить MARKEDIT.EXE
нажимая левую кнопку мыши ставить(рисовать) кубики;
после построения уровня нажать правую кнопку мыши;
после появления меню номеров уровней выбрать номер сохраняемого уровня (файла);
Спецификации подпрограмм:
1. procedure text_na_ekran;
Назначение: используется как справка и всегда показывается при запуске;
Входные данные:
нет;
Выходные данные:
нет;
2. function netu:boolean;
Назначение: при нажатии левой кнопки мыши определяет, есть ли на этом месте уже кубик или нет;
Входные данные:
нет;
Выходные данные:
True: рисуем кубик;
False: на этом месте уже есть кубик, значит не рисуем;
3. procedure stroika;
Назначение: рисует кубик и записывает его координаты в файл;
Входные данные: нет;
Выходные данные: нет;
4. procedure search_y;
Назначение: ищет подходящие координаты для построения кубика;
Входные данные: нет;
Выходные данные: нет;
5. procedure build_level;
Назначение: строит этап, используя вышеописанные подпрограммы;
Входные данные: нет;
Выходные данные: нет;
Текст программы:
program markedit;
uses graph,crt,mymouse;
type t_kubik=-10..640;
t_arr=array[1..494] of t_kubik;
var x,y:word;
f,f_s:text;
a:t_arr;
i:1..494;
procedure initgr;
var grdriver,grmode:integer;
begin
grdriver:=vga;
grmode:=vgahi;
initgraph(grdriver,grmode,'');
if GraphResult <> grOk then halt;
end;
procedure text_na_ekran;
var f:text;
a:char;
begin
assign(f,'stroika.txt');
reset(f);
textmode(1);
textbackground(3);
textcolor(0);
clrscr;
while not eof(f) do
begin
while not(eof(f)) do
begin
read(f,a);
write(a);
end;
writeln;
end;
while not(keypressed) do
case readkey of
' ':exit;
end;
close(f);
end;
function netu:boolean;
var k:1..494;
begin
for k:=1 to 494 do
begin
if a[k]=x then
if a[k+1]=y then
begin netu:=false; exit; end;
end;
netu:=true;
end;
procedure stroika;
var color:1..15;
pattern:1..12;
begin
if netu then
begin
writeln(f,x,' ',y);
a[i]:=x;
a[i+1]:=y;
inc(i,2);
color:=random(14)+1;
pattern:=random(11)+1;
setcolor(color);
setfillstyle(pattern,color);
bar3d(x,y,48+x,y-20,0,false);
end;
end;
procedure search_y;
begin
case y of
22..42: begin y:=42; stroika; end;
43..63: begin y:=63; stroika; end;
64..84: begin y:=84; stroika; end;
85..105: begin y:=105; stroika; end;
106..126:begin y:=126; stroika; end;
127..147:begin y:=147; stroika; end;
148..168:begin y:=168; stroika; end;
169..189:begin y:=189; stroika; end;
190..210:begin y:=210; stroika; end;
211..231:begin y:=231; stroika; end;
232..252:begin y:=252; stroika; end;
263..273:begin y:=273; stroika; end;
274..294:begin y:=294; stroika; end;
295..315:begin y:=315; stroika; end;
316..336:begin y:=336; stroika; end;
337..357:begin y:=357; stroika; end;
358..378:begin y:=378; stroika; end;
379..399:begin y:=399; stroika; end;
400..420:begin y:=420; stroika; end;
end;
end;
procedure build_level;
var buttoncount,errorcode:byte;
lb,rb,tb:boolean;
x_pred:word;
s,s_l:string;
number:0..10;
spusk:1..500;
code:integer;
begin
initmouse(buttoncount,errorcode);
cleardevice;
{а ¬Є }
setcolor(random(14)+1);
rectangle(0,21,getmaxx,getmaxy);
setcolor(brown);
s:='when finish --- press the right button of the mouse';
settextstyle(7{GothicFont},horizdir,2);
settextjustify(1,1);
outtextxy(getmaxx div 2,5,s);
setYrange(21,420);
setXrange(1,637);
assign(f,'level.den');
rewrite(f);
x:=10;y:=10;
setmouseXY(x,y);
x_pred:=0;
mouseon;
repeat
getmouseXY(x,y,lb,rb,tb);
if lb then begin
mouseoff;
if x<>x_pred then
case x of
1..49: begin x:=1; search_y; end;
50..98: begin x:=50; search_y; end;
99..147:begin x:=99; search_y; end;
148..196:begin x:=148; search_y; end;
197..245:begin x:=197; search_y; end;
246..294:begin x:=246; search_y; end;
295..343:begin x:=295; search_y; end;
344..392:begin x:=344; search_y; end;
393..441:begin x:=393; search_y; end;
442..490:begin x:=442; search_y; end;
491..539:begin x:=491; search_y; end;
540..588:begin x:=540; search_y; end;
589..637:begin x:=589; search_y; end;
end;
x_pred:=x;
mouseon; end;
until rb;
setfillstyle(1,black);
bar(4,getmaxy div 5-8,130,getmaxy div 5 +300+20);
setcolor(yellow);
s:='Save as: ';
spusk:=getmaxy div 5;
settextstyle(4{GothicFont},horizdir,4);
settextjustify(lefttext,centertext);
outtextxy(4,spusk,s);
for number:=1 to 10 do
begin
inc(spusk,30);
str(number,s_l);
s:='Level '+s_l;
settextstyle(4{GothicFont},horizdir,4);
settextjustify(lefttext,centertext);
outtextxy(4,spusk,s);
end;
close(f);
repeat
if keypressed then
begin
s:=readkey;
val(s,number,code);
case number of
0:begin
assign(f_s,'levels\level10.den');
erase(f_s);
rename(f,'levels\level10.den');
exit;
end
else if number in [1..9] then
begin
assign(f_s,'levels\level'+s+'.den');
erase(f_s);
rename(f,'levels\level'+s+'.den');
exit;
end;
end;
end;
until false;
end;
var j:1..494;
begin
{for j:=1 to 494 do
a[j]:=0;}
i:=1;
randomize;
text_na_ekran;
initgr;
build_level;
mouseoff;
closegraph;
end.
Список используемой литературы:
Ян Белецкий «Турбо Паскаль с графикой для персональных компьютеров»
Walasek J.Konwersacyjne otoczenie programowe Pascala. WNT, Warsawa
Turbo Tutor. Borland International. Scotts Valley, California
Cherry G. Pascal Programming Structures. Reston Publishing Company. Reston, Virginia