Министерство общего и профессионального образования РФ
Белгородская Государственная Технологическая Академия
Строительных Материалов.
Кафедра ПОВТиАС
[pic]
Выполнил:
Студент факультета АПиИТ
Группы ПВ-22
Маркелов Денис
Руководитель:
Белгород – 2000.
СОДЕРЖАНИЕ
1. ПРЕДИСЛОВИЕ
2. ВВЕДЕНИЕ
3. ЗАДАНИЕ КУРСОВОЙ РАБОТЫ
4. ПРАВИЛА ПОЛЬЗОВАНИЯ ПРОГРАММОЙ «АРКАНОИД»
5. ИСПОЛЬЗУЕМЫЕ СТРУКТУРЫ ДАННЫХ
6. ИСПОЛЬЗУЕМЫЕ МОДУЛИ
7. СПЕЦИФИКАЦИЯ ПОДПРОГРАММ
8. ТЕКСТ ПРОГРАММЫ И СКОНСТРУИРОВАННЫХ МОДУЛЕЙ
9. правила пользования дополнительной программой для построения
уровней «MARKEDIT»
10. СПЕЦИФИКАЦИЯ ПОДПРОГРАММ В ПРОГРАММЕ «MARKEDIT»
11. ТЕКСТ ПРОГРАММЫ «MARKEDIT” И СКОНСТРУИРОВАННЫХ МОДУЛЕЙ
12. СПИСОК ИСПОЛЬЗУЕМОЙ ЛИТЕРАТУРЫ
Предисловие
Язык Турбо Паскаль – это один из самых распространённых языков
программирования микрокомпьютеров. Он разработан фирмой «Борланд»
как диалект стандартного языка Паскаль, но благодаря своей
популярности сам стал стандартом языка программирования 8- и
16-разрядных микрокомпьютеров. К важнейшим достоинствам языка Турбо
Паскаль относятся небольшой размер компилятора, высокая степень
соответствия стандартному Паскалю, очень быстрая компиляция
программ, объединение компилятора с интерактивным экранным
редактором, предупреждение об ошибках на уровне исходной программы,
обширная библиотека подпрограмм и полезные расширения, упрощающие
системное программирование.
Введение
Одной из основных проблем, с которой сталкиваются в процессе
программирования, является написание программы, не содержащей
ошибок. Ошибку наиболее полно можно определить как расхождение
поведения программы с ожиданиями пользователя. Сюда входит как
несоответствие результатов исходным данным, так и другие, порой
более опасные эффекты: зацикливание, аварийная остановка программ и
т.п. Наиболее явно наблюдаемыми историческими тенденциями в
программировании являются непрерывный рост пользовательских
требований, лавинообразное усложнение функциональности программы и,
как следствие, - усложнение её разработки.В связи с увеличением
трудоёмкости програмных средств возникла необходимость выработки
интеллектуальных инструментов, позволяющих разработчикам
справляться с возросшей сложностью своего труда. В настоящий момент
можно утверждать, что практически каждая программа составляется с
применением той или иной технологии программирования. «В связи с
тем,что за последние десять или пятьнадцать лет производительность
вычислительных машин увеличилась в тысячи раз, пользователи стали
гораздо более бесцеремонными при выборе проблем, которые они
считают «технически разрешимыми». Пользователи хотят, чтобы
размеры, сложность и изощрённость программ увеличивалась
исключительно быстрыми темпами, и в последние годы стало очевидным,
что в целом наши программистские возможности не поспевают за этими
неумеренными аппетитами». По мере того, как мощь компьютеров росла,
а область применения всё расширялась, увеличивались не только
размеры, и сложность программ, но и количество ошибок в них.
Главной задачей современного программиста при написании программы
является не подвегание её бесконечным тестированиям, а тщательный,
полный анализ исходного текста программы, а также отладка программы
с помощью дополнительных програмных средств.
Задание на проектирование
Разработать алгоритм игры «АРКАНОИД», цель которой заключается в
наборе как можно большего количества очков, которые увеличиваются
при выбивании очередного кубика. При выбивании всех кубиков
текущего уровня осуществляется переход на следующий уровень,
количество которых – десять. В конце игры в зависимости от
количества набранных очков, введённое по запросу программы имя
игрока должно быть занесено в десятку лучших и записано в файл.
Над рамкой, в течение игры должны отображаться:
1) № текущего этапа; 2) количество оставшихся жизней, первоначально
которых – 10; 1) количество оставшихся кубиков; 2) количество
набранных очков.
Правила пользования программой:
1) запустить MARKBALL.EXE
2) выбрать чем играть:
2a) мышь
2б) клавиатура
3) выбрать скорость шарика
4) выбрать размер планки
Используемые структуры данных:
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 – максимальное количество кубиков;
Используемые модули:
Стандартные:
1) CRT;
2) GRAPH;
3) WINDOS – модуль требуемый сконструируемым модулем MYMOUSE;
4) STRINGS – модуль требуемый сконструируемым модулем MYMOUSE;
Сконструированные:
1) MARKEL – основные игровые подпрограммы;
2) MARK_ZAS – содержит инструментарий интерфейса (заставка, помощь,
счёт лучших игроков в конце игры);
3) MYMOUSE – работа с мышью
Спецификация подпрограмм:
Модуль MARKEL
a. 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);
Назначение: определяет коснулся ли шарик кубика о верхнюю или
нижнюю грань;
Входные данные:
2) dy – направление движения шарика по оси Y;
3) x,y – текущие координаты центра шарика;
4) i – значение, от которого зависит какие кубики проверять на
сбивание;
5) a – массив координат кубиков;
6) kol_kub – количество кубиков на данный момент;
Выходные данные:
7) dy – изменённое направление движения шарика по оси Y;
8) a – изменённый массив координат кубиков;
9) kol_kub – изменённое количество кубиков;
6. procedure bok_bok(var dx:t_dx_dy;x,y:t_kubik;var a:t_arr;var
kol_kub:kol_kubik);
Назначение: определяет коснулся ли шарик кубика о левую или правую
грань;
Входные данные: 10) dx – направление движения шарика по оси X; 11)
x,y – текущие координаты центра шарика; 12) a – массив координат
кубиков; 13) kol_kub – количество кубиков на данный момент;
Выходные данные: 14) dx – изменённое направление движения шарика по
оси X; 15) a – изменённый массив координат кубиков; 16) 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);
Назначение: определяет коснулся ли шарик кубика об углы;
Входные данные: 17) dx,dy – направление движения шарика по осям X и
Y; 18) x,y – текущие координаты центра шарика; 19) a – массив
координат кубиков; 20) kol_kub – количество кубиков на данный
момент;
Выходные данные: 21) dx,dy – изменённое направление движения шарика
по осям X и Y; 22) a – изменённый массив координат кубиков; 23)
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 – координаты шарика, которые и нужно записать в
массив;
24) i – переменная от которой зависит с какого номера искать
подходящее место для координат кубика;
25) a – массив координат кубиков;
Выходные данные: нет
11. procedure level(var a:t_arr;const numbering:byte;var
kol_kub:kol_kubik);
Назначение: открывает файл и считывая с него координаты кубиков,
рисует их;
Входные данные:
1) a – массив координат кубиков;
2) numbering – номер открываемого этапа;
3) kol_kub – количество кубиков;
Выходные данные:
1) a – массив координат кубиков;
2) kol_kub – количество нарисованных кубиков;
12. procedure left(const koeff:byte;var x1_dv,x2_dv:t_kubik);
Назначение: движение планки влево;
Входные данные:
1) koeff – коэффициент, от которого зависит размер планки;
2) x1_dv,x2_dv – координаты планки по оси Х;
Выходные данные: x1_dv,x2_dv – изменившиеся координаты планки по
оси Х;
13. procedure right(const koeff:byte;var x1_dv,x2_dv:t_kubik);
Назначение: движение планки вправо;
Входные данные:
1) koeff – коэффициент, от которого зависит размер планки;
3) 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 – коэффициент, от которого зависит размер планки;
1) x,y – координаты шарика;
2) x1_dv,x2_dv – координаты планки по оси Х;
Выходные данные:
3) x,y – координаты шарика;
4) 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 – координаты шарика;
5) x1_dv,x2_dv – координаты планки по оси Х;
Выходные данные: f. x,y – координаты шарика; g. 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
Арканоид на Паскале
127
0
8 минут
Темы:
Понравилась работу? Лайкни ее и оставь свой комментарий!
Для автора это очень важно, это стимулирует его на новое творчество!