Рефетека.ру / Информатика и програм-ие

Реферат: Арканоид на Паскале

Министерство общего и профессионального образования РФ

Белгородская Государственная Технологическая Академия

Строительных Материалов.

Кафедра ПОВТиАС

[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

Рефетека ру refoteka@gmail.com