[an error occurred while processing this directive]
Набрал в Яндексе "код пробела". Наиболее "совпадающий" результат поиска.
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено L.A. 19 января 2003 г. 17:20
В ответ на: А ещё можно в яндексе набрать " ASCII код пробела" и получить мнений 500, главным образом, вокруг 20h. отправлено tdk 19 января 2003 г. 16:56


ПРАКТИКУМ № 2. Стрельба по движущейся мишени
В §1 этой главы мы с вами разработали и написали интерактивную программу первого типа. Для ощущения полной завершенности нам осталось только написать интерактивную программу второго типа. Итак:

Задача: По экрану монитора летает окружность, «отражаясь» от его границ. Кроме того, с помощью клавиш управления курсором по экрану можно передвигать перекрестье прицела.

Если в какой-то момент нажимается клавиша «огонь» (обычно, это клавиша пробела) и перекрестье прицела оказывается в окружности, то ее полет на время останавливается, а к счетчику попаданий добавляется 1.

По завершении программы (нажатием на клавишу ESC)игроку сообщается количество попаданий и общее количество выстрелов.

Фактически, эта программа не представляет из себя ничего нового: задача о летающем шарике разобрана в §5, а с управлением объектом с помощью клавиатуры мы имели дело в §7. Теперь осталось лишь очень аккуратно объединить и немного изменить написанное раньше. И поможет нам в этом конечно же ЯПП.

Проект первого уровня, как обычно, крайне прост:


Запустить окружность и, перемещая перекрестье прицела с помощью клавиатуры, постараться ее сбить.

Вспоминая упомянутые выше задачи о полете окружности и управлении объектом, можно конкретизировать первый уровень:

Делать пока (не нажата клавиша ESC)

{Нарисовать белым цветом перекрестье прицела с центром в PX, PY;
Нарисовать окружность белым цветом с центром в CX, CY;
Сделать паузу; (* посмотреть на рисунки *);
Нарисовать черным цветом перекрестье прицела с центром в PX, PY;
Нарисовать окружность черным цветом с центром в CX, CY;
Изменить координаты окружности;
Опросить клавиатуру;
Если (нажаты клавиши смещения прицела) то {изменить координаты центра прицела}
Если (нажата клавиша «огонь») то {

Если (есть попадание) то {Нарисовать окружность красным цветом;
Сделать паузу;
Нарисовать окружность черным цветом; (* можно и не рисовать. Тогда на поле останутся красные «трупики» подбитых окружностей. *)
Добавить к счетчику попаданий 1;
} (*конец «Если (есть попадание)» *)

Добавить к счетчику выстрелов 1;
} (* Конец «Если (нажата клавиша «огонь») *)

} (*Конец главнейшего цикла*)
Сообщить количество выстрелов и количество попаданий;

Теперь можно подумать и о переменных, необходимых для работы нашей программы.

PX - координаты прицела по X;
PY - координаты прицела по Y;
CX - координаты окружности по X;
CY - координаты окружности по Y;
DPX - смещение прицела по Х (т.е., насколько быстро он перемещается по горизонтали);
DPY - смещение прицела по Y (т.е., насколько быстро он перемещается по вертикали);
DCX - смещение окружности по Х (т.е., насколько быстро она перемещается по горизонтали);
DCY - смещение окружности по Y (т.е., насколько быстро она перемещается по вертикали);
R - радиус окружности;
ZALP - счетчик выстрелов;
URA - счетчик попаданий;
I - переменная цикла (для задержки, если понадобится).

Если внимательно присмотреться к операторам ЯПП, то легко понять, что почти все из низ мы уже переводили на конкретный язык программирования. Исключением является оператор


Если (есть попадание)

Чтобы не связываться со сложными формулами, будем считать, что мы попали в цель, если перекрестье прицела попало не в саму окружность, а в описанный вокруг нее квадрат (см. рис. 51)

Рис. 51

Конечно, в ситуации, изображенной на этом рисунке, должен быть промах, но пока что, в первом приближении, будем считать, что выстрел удачен.

Тогда условие попадания записывается довольно просто:


Если ( |CX-PX|

где вертикальные палочки означают модуль, известный вам по урокам математики.

Уточним теперь все вышесказанное в проекте третьего уровня:

Описать и проинициализировать необходимые для работы переменные;
Делать пока (не нажата клавиша ESC)


{Вызвать Прицел (PX,PY,14) (* 14 - номер белого цвета *);
Окружность (СX, CY, R, 14);
Сделать паузу; (* посмотреть на рисунки *);
Вызвать Прицел (PX,PY,0) (* 0- номер черного цвета - цвета фона) *);
Окружность (СX, CY, R, 0);

(* Изменяем координаты окружности: *)
СX:=СX+DСX; СY:=СY+DСY;
Если (СY+R> 479 или СY-R<0) то {DСY:= — DСY};
Если (СX+R>639 или СX-R<0) то {DСX:= — DСX};

(* Опрос клавиатуры: *)
Опросить клавиатуру, поместить скан-код нажатой клавиши в переменную SCAN;
Выбор (SCAN)
{ код "стрелочка вверх": { PY=PY–DPY}
код "стрелочка вниз": { PY=PY+DPY}
код "стрелочка влево": { PX=PX–DPX}
код "стрелочка вправо": { PX=PX+DPX}
код "пробел":

{Если ( |CX-PX| то

{ Окружность (СX, CY, R, 12); (* 12 - красный цвет *);
Сделать паузу;
Окружность (СX, CY, R, 0); (* можно и не рисовать. Тогда на поле останутся красные «трупики» подбитых окружностей. *)
URA:=URA+1 попаданий 1;
} (*конец «Если (есть попадание)» *)

ZALP:=ZALP+1;
} (* Конец «кода "пробел" *)

} (* конец Выбора *)

} (*Конец главнейшего цикла*)
Сообщить «Количество залпов:», ZALP, «Из них в цель:», URA;

Надеемся, проекта третьего уровня вполне достаточно, чтобы вы смогли перевести эту программу на выбранный язык программирования.

Вопросы и задания

1. Переведите рассмотренную нами программу на один или несколько языков программирования, отладьте ее и запустите.

2. На рис.51 прицел нарисован не очень красиво. Измените подпрограмму «Прицел» и сделайте его рисунок более похожим на настоящий.

3. Попробуйте программу в работе. Измените, если необходимо, время задержки, скорость перемещения прицела и окружности.

4. В случае попадания добавьте рисунок и звук взрыва.


Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru