Программ-игра «Морской бой», с использованием анимированных графических объектов и возможностью управлять их движением с помощью клавиатуры

Программ-игра «Морской бой», с использованием анимированных графических объектов и возможностью управлять их движением с помощью клавиатуры

Домашняя работа

по программированию

за второй семестр

Игра «Морской Бой»

Выполнил: Макаров В. А.

группа: С-26

Игра «Морской Бой»

Требуется:

Разработать программу-игру «Морской бой», с использованием анимированных

графических объектов и возможностью управлять их движением с помощью

клавиатуры.

Эскиз:

[pic]

Аномалии:

|Аномалия |Действие программы |

|1) Произошла ошибка инициализации|Вывод сообщения: |

|графики |«InitGraph ERROR!» |

|2) При игре было допущено более |Вывод сообщения |

|пяти промахов. Проигрыш. |«GAME OVER» |

Внешняя спецификация:

Вход:

|Vipolnil: Makarov Vladimir |

|Group: C-26 |

| |

| |

| |

|Press to start play game! |

| |

| |

| |

Выход при проигрыше:

| |

| |

| |

| |

|GAME OVER |

| |

| |

| |

Метод:

Описание:

Во время игры на экране изображена водная поверхность и две скалы по

бокам. Время от времени из-за скал выплывают различные корабли, которые

движутся вдоль горизонта к противоположенной скале. Существует три типа

кораблей: маленький, средний и большой. Тип корабля всегда выбирается

случайным образом. Скорость каждого корабля зависит от размера самого

корабля: маленький самый быстрый, остальные соответственно обладают более

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

прицела подбить как можно большое количество кораблей и не промахиваться.

Количество подбитых кораблей (scope) показывается в нижнем левом углу

экрана. Игрок должен нацеливать пушку влево или вправо и стрелять по

возможности на опережение, так как снаряд вылетающий из пушки обладает

относительно малой скоростью. В случае промаха игрока, корабль

разворачивается и уплывает в обратную сторону. Если игрок совершил более

пяти промахов, то он проигрывает и выходит из игры.

Прицеливание осуществляется с помощью стрелок (вправо и влево) на

клавиатуре, пробел – стрельба и escape – выход.

Основной метод:

В основе работы программы лежит главный зацикленный цикл, выход из

которого осуществляется только при выходе или при проигрыше. В цикле

выполняются действия, зависящие от состояния флагов, так как каждому

событию в программе соответствует свой флаг. Так же в этом цикле

отслеживаются нажатия определённых клавиш. Цикл прокручивается с, заранее

определённой и постоянной, временной задержкой.

Когда какой-нибудь флаг принимает истинное значение, в цикле

проделывается соответствующее ему действие, после чего флаг сразу

сбрасывается в положение ложь.

Рисование всех двигающихся объектов производится для удобства в отдельных

процедурах. В качестве параметров туда передаётся координата по оси или x

или y, так же туда передаётся флаг, указывающий на то – рисовать объект или

стирать. Под стиранием объекта понимается его рисование цветом фона.

Движение всех графических объектов в программе осуществляется стандартным

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

том же месте цветом фона (стирается) и рисуется в новом месте.

Скорости всех двигающихся в программе объектов различны:

Vснаряда > Vкорабля №1 > Vкорабля №2 > Vкорабля №3

Временная задержка во всей программе постоянная и используется один раз

за цикл. Если один проход цикла назвать тактом, то разность скоростей

объектов реализована за счёт того, что каждый объект перемещается на

единицу расстояния не за каждый такт, а за каждый n-ный такт, а n

определено для каждого объекта по-разному. Чем меньше n, тем быстрее

скорость. В данной программе все скорости постоянны.

Алгоритм:

Procedure target (ix: integer; bb: boolean)

|Входные данные: ix:цел bb:лог |

|Внутренние постоянные переменные: iy=200 |

| |

|начало |

|если bb то {Отображение} |

|Установить цвет(green) |

|Установить тип заливки(SolidFill,green) |

|Нарисовать закрашенный эллипс(ix,430,26,100) |

|Выбрать цвет(lightgreen) |

|Нарисовать линию(ix-10,iy,ix+10,iy) |

|Нарисовать линию(ix,iy-10,ix,iy+10) |

|иначе {Стирание} |

|Установить тип заливки(SolidFill,blue) |

|Установить цвет(blue) |

|Нарисовать закрашенный эллипс( (ix,430,26,100) |

|Установить цвет(blue) |

|Нарисовать линию(ix-10,iy,ix+10,iy) |

|Нарисовать линию(ix,iy-10,ix,iy+10) |

|всё |

|конец |

Часть 2: Поиск в тексте единиц и вставка после них нулей

|Входные данные: var st:мас:стр r:цел var one:лог |

|Выходные данные: rez:масс:стр iz:цел |

|Внутренние переменные: k,l:цел |

| |

|начало |

|one:=ложь |

|цикл для k:=1 до r делать |

|l:=1 |

|цикл пока l to start play game!'); |

|c:=ReadKey; |

| |

|{Подготовка экрана к игре} |

|ClearDevice; |

|SetBkColor(blue); |

|SetColor(lightgray); |

|SetFillStyle(SolidFill,lightgray); |

|FillPoly(4,trin1); |

|FillPoly(4,trin2); |

|SetColor(black); |

|Target(320,true); |

| |

|{Главный цикл обработки различных сообщений и событий} |

|repeat |

|repeat |

| |

|{Обработка сообщения "Взрыв корабля"} |

|if vzriv then begin |

|if xx=0 then begin |

|typ:=cr_type; |

|xxx:=crx; |

|end; |

|if xx5 then begin |

|{Выход из игры в случае проигрыша} |

|ClearDevice; |

|SetColor(white); |

|SetBkColor(black); |

|SetTextJustify(CenterText,CenterText); |

|OutTextXY(640 div 2,480 div 2,'GAME OVER!'); |

|Sound(200); |

|Delay(10000); |

|NoSound; |

|c:=ReadKey; |

|exit; |

|end; |

|end; |

|fire:=false; |

|NoSound; |

|SetColor(blue); |

|line(fx+1,fy-2,fx+1,fy+2); |

|line(fx-1,fy-2,fx-1,fy+2); |

|line(fx,fy-2,fx,fy+2); |

|end; |

|end; |

|if b then begin |

|{Перерисовка прицела и пушки в случае нажатия клавиш "стрелок"} |

|target(oldx,false); |

|target(tarx,true); |

|b:=false; |

|end else target(tarx,true); |

|{В случае попадания, производится начисление очков и вывод их на экран} |

|if old_score<>score then begin |

|SetColor(blue); |

|SetTextJustify(LeftText,BottomText); |

|Str(old_score,s_score); |

|OutTextXY(70,460,s_score); |

|old_score:=score; |

|end; |

|SetColor(white); |

|SetTextJustify(LeftText,BottomText); |

|OutTextXY(20,460,'Score'); |

|Str(score,s_score); |

|OutTextXY(70,460,s_score); |

|delay(150); {Временная задержка главного цикла} |

|until keypressed; |

|{Обработка нажатия клавиш} |

|c:=readkey; |

|case c of |

|#75: begin {влево} |

|if tarx>220 then begin |

|oldx:=tarx; |

|tarx:=tarx-5; |

|b:=true; |

|end; |

|end; |

|#77: begin {вправо} |

|if tarx<420 then begin |

|oldx:=tarx; |

|tarx:=tarx+5; |

|b:=true; |

|end; |

|end; |

|#32: begin {пробел "Выстрел"} |

|if not fire then begin |

|x:=800; |

|fire:=true; |

|fx:=tarx; |

|fy:=380; |

|end; |

|end; |

|#27: begin {esc "Выход"} |

|NoSound; |

|exit; |

|end; |

|end; |

|until false; {Зацикливание главного цикла обработки сообщений} |

|end. |