Программ-игра «Морской бой», с использованием анимированных графических объектов и возможностью управлять их движением с помощью клавиатуры - реферат
Домашняя работа
по программированию
за второй семестр
Игра «Морской Бой»
Выполнил: Макаров В. А.
группа: С-26
Игра «Морской Бой»
Требуется:
Разработать
программу-игру «Морской бой», с использованием анимированных графических
объектов и возможностью управлять их движением с помощью клавиатуры.
Эскиз:
Аномалии:
Аномалия
Действие программы
1) Произошла
ошибка инициализации графики
Вывод сообщения:
«InitGraph ERROR!»
2) При игре
было допущено более пяти промахов. Проигрыш.
Вывод
сообщения
«GAME OVER»
Внешняя
спецификация:
Вход:
Vipolnil:
Makarov Vladimir
Group: C-26
Press <Enter> to
start play game!
Выход при
проигрыше:
GAME OVER
Метод:
Описание:
Во
время игры на экране изображена водная поверхность и две скалы по бокам. Время
от времени из-за скал выплывают различные корабли, которые движутся вдоль
горизонта к противоположенной скале. Существует три типа кораблей: маленький,
средний и большой. Тип корабля всегда выбирается случайным образом. Скорость
каждого корабля зависит от размера самого корабля: маленький самый быстрый,
остальные соответственно обладают более низкой скоростью. Цель игрока состоит в
том, чтобы с помощью пушки и прицела подбить как можно большое количество
кораблей и не промахиваться. Количество подбитых кораблей (scope) показывается в нижнем левом углу
экрана. Игрок должен нацеливать пушку влево или вправо и стрелять по
возможности на опережение, так как снаряд вылетающий из пушки обладает
относительно малой скоростью. В случае промаха игрока, корабль разворачивается
и уплывает в обратную сторону. Если игрок совершил более пяти промахов, то он
проигрывает и выходит из игры.
Прицеливание
осуществляется с помощью стрелок (вправо и влево) на клавиатуре, пробел –
стрельба и escape – выход.
Основной
метод:
В
основе работы программы лежит главный зацикленный цикл, выход из которого
осуществляется только при выходе или при проигрыше. В цикле выполняются действия,
зависящие от состояния флагов, так как каждому событию в программе
соответствует свой флаг. Так же в этом цикле отслеживаются нажатия определённых
клавиш. Цикл прокручивается с, заранее определённой и постоянной, временной
задержкой.
Когда
какой-нибудь флаг принимает истинное значение, в цикле проделывается
соответствующее ему действие, после чего флаг сразу сбрасывается в положение
ложь.
Рисование
всех двигающихся объектов производится для удобства в отдельных процедурах. В
качестве параметров туда передаётся координата по оси или x или
y, так же туда передаётся флаг,
указывающий на то – рисовать объект или стирать. Под стиранием объекта
понимается его рисование цветом фона.
Движение
всех графических объектов в программе осуществляется стандартным методом:
сначала рисуется объект, а после временной задержки он рисуется на том же месте
цветом фона (стирается) и рисуется в новом месте.
Скорости всех двигающихся в программе
объектов различны:
Временная
задержка во всей программе постоянная и используется один раз за цикл. Если
один проход цикла назвать тактом, то разность скоростей объектов реализована за
счёт того, что каждый объект перемещается на единицу расстояния не за каждый
такт, а за каждый 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<=длина(st[k]) делать
если st[k][l]='1' то
insert('0',st[k],l+1) {Вставить
после нуля единицу}
one:=истина {Значит, в тексте есть
единицы}
всё
inc(l) {l:=l+1}
кцикл
кцикл
всё
Вспомогательная
функция: Определяет,
является ли символ цифрой
Входные
данные: с:сим
Выходные
данные: лог
Внутренние
переменные: e:цел fl:лог
начало
fl:=ложь
d:='0123456789' {все
цифровые символы}
циклдля e:=1 до
10 делать {перебор всех символов цифр}
если c=d[e] то fl:=истина
кцикл
{Ели символ является цифрой, то
функция возвратит истину,
иначе возвратит ложь}
digs:=fl {функция возвращает значение}
всё
Исходный кодвсей программы:
{Домашнее задание на
тему "графика"}
{Выполнил студент:
Макаров Владимир, группа С-26}
{Игра "МорскойБой"}
program
SeaWar;
uses
Graph,crt;
var
GraphDriver:integer;
GraphMode:integer;
ErrorCode:integer;
{Переменные для инициализации графики}
s_score:string;
{Все переменные,
используемые в программе}
x :integer;
y :integer;
{Переменные для хранения координат}
xx :integer;
{и переменные цикла}
typ :integer;
{Тип текущего корабля}
xxx :integer;
{Координаты}
tarx :integer;
{Координаты прицела и пушки}
fx :integer;
{Координаты}
fy :integer;
score :integer;
{Кол-во очков}
old_score :integer;
{Прошлое значение кол-ва очков}
mimo :integer;
{Кол-во промахов}
oldx :integer;
{Координаты}
oldy :integer;
crx :integer;
cr_type :integer;
{Тип корабля}
flang :integer;
{С какой стороны плывёт корабль}
croldx
:integer;
cr_ind2
:integer;
cr_ind:longint;
{Рабочая переменная}
c:char;
{Хранение нажатых клавиш}
{Флаги}
b :boolean;
{Флаг нажатия клавиш "стрелок"}
fire :boolean;
{Стрельба}
swim :boolean;
{Перемещение}
promah :boolean;
{Промах}
vzriv :boolean;
{Взрыв}
const
{Два константных массива
точек для хранения координат скал}