Домашняя работа
по программированию
за второй семестр
Игра «Морской Бой»
Выполнил: Макаров В. А.
группа: С-26
Игра «Морской Бой»
Требуется:
Разработать программу-игру «Морской бой», с использованием анимированных
графических объектов и возможностью управлять их движением с помощью
клавиатуры.
Эскиз:
Аномалии:
Аномалия Действие программы
1) Произошла ошибка инициализации графики Вывод сообщения:
«InitGraph ERROR!»
2) При игре было допущено более пяти промахов. Проигрыш. Вывод сообщения
«GAME OVER»
Внешняя спецификация:
Вход:
Vipolnil: Makarov Vladimir
Group: C-26
Press
Выход при проигрыше:
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
@
B
F
H
X
??????????X
Z
\
”
–
?
e
e
hae
hae
hae
R
n
p
r
t
?
?
THa
A
Ae
i
i
?
o
oe
?
1/4
3/4
A
A
Ae
i
?
o
o
oe
gd/AE
+uunneessOOAA?««??AOss
gdUK
gdUK
^„7gdUK
;
end;
end;
{Процедура вывода на экран различных кораблей}
procedure sheep(ix:integer;tip:integer;bb:boolean);
const
iy=200;
var
col,col2:integer;
sp1,sp2,sp3:array[1..5] of PointType;
begin
col:=brown;
col2:=yellow;
if not bb then begin {Если bb=true, то отображение корабля}
col:=blue; {Иначе стирание корабля}
col2:=blue;
end;
{Координаты кораблей, относительно центральной точки ix}
sp1[1].x:=ix-40;
sp1[1].y:=190;
sp1[2].x:=ix+40;
sp1[2].y:=190;
sp1[3].x:=ix+20;
sp1[3].y:=215;
sp1[4].x:=ix-20;
sp1[4].y:=215;
sp1[5].x:=sp1[1].x;
sp1[5].y:=sp1[1].y;
sp2[1].x:=ix-30;
sp2[1].y:=190;
sp2[2].x:=ix+30;
sp2[2].y:=190;
sp2[3].x:=ix+15;
sp2[3].y:=210;
sp2[4].x:=ix-15;
sp2[4].y:=210;
sp2[5].x:=sp2[1].x;
sp2[5].y:=sp2[1].y;
sp3[1].x:=ix-20;
sp3[1].y:=195;
sp3[2].x:=ix+20;
sp3[2].y:=195;
sp3[3].x:=ix+10;
sp3[3].y:=205;
sp3[4].x:=ix-10;
sp3[4].y:=205;
sp3[5].x:=sp3[1].x;
sp3[5].y:=sp3[1].y;
{Отображение одного из трёх типов кораблей}
case tip of
3: begin
SetColor(col);
SetFillStyle(SolidFill,col);
FillPoly(5,sp1);
Rectangle(ix-18,iy-30,ix+18,iy-2);
SetColor(col2);
SetFillStyle(SolidFill,col2);
Rectangle(ix-10,iy-25,ix+10,iy-15);
FillEllipse(ix-18,iy,5,5);
FillEllipse(ix+18,iy,5,5);
FillEllipse(ix,iy,5,5);
end;
2: begin
SetColor(col);
SetFillStyle(SolidFill,col);
FillPoly(5,sp2);
line(ix,200,ix,170);
line(ix-5,175,ix+5,175);
line(ix-10,180,ix+10,180);
end;
1: begin
SetColor(col);
SetFillStyle(SolidFill,col);
FillPoly(5,sp3);
line(ix,200,ix,185);
line(ix-5,185,ix+5,185);
line(ix-10,190,ix+10,190);
end;
end;
end;
{Начало главной процедуры программы}
begin
x:=100;
xx:=0;
xxx:=0;
oldx:=0;
b:=false;
tarx:=320;
fire:=false; {инициализация переменных}
crx:=0;
croldx:=800;
score:=0;
old_score:=0;
mimo:=0;
promah:=false;
vzriv:=false;
{Переключение в графический режим}
GraphDriver:=Detect;
InitGraph(GraphDriver,GraphMode,”);
if ErrorCode=grok then begin
SetColor(green);
SetBKColor(black);
end else begin
Writeln(‘ERROR!’);
exit;
end;
SetColor(white);
OutText(‘Vipolnil: Makarov Vladimir’);
OutTextXY(0,10,’Group: C-26′);
SetTextJustify(CenterText,CenterText);
OutTextXY(640 div 2,480 div 2,’Press
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_scorescore 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
Нашли опечатку? Выделите и нажмите CTRL+Enter