Разработка программы на языке C++, реализующей игру "Морской бой"
Описание и преимущества языка программирования высокого уровня С++. Характеристика, отличительные черты объявления класса BaseKorabl, Kletka и KorPotomok. Особенности основных алгоритмов создания программы, сущность листинга в производном классе.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 24.05.2016 |
Размер файла | 31,8 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Оглавление
ВВЕДЕНИЕ
ГЛАВА 1. Выбор Языка Программирования
1.1 Выбор языка программирования
1.2 Проектирование класса
1.3 Программирование задачи
1.4 Листинг. Объявления класса Kletka
1.5 Объявления класса BaseKorabl
1.6 Объявления класса KorPotomok
ГЛАВА 2. Описание предметной области
2.1 Описание классов
2.2 Основные алгоритмы
2.3 Тестирование
2.4 Анализ работы
ЗАКЛЮЧЕНИЕ
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНОКОВ
«ПРИЛОЖЕНИЕА»
ТЕКСТ ПРОГРАММЫ
«ПРИЛОЖЕНИЕВ»
ИСХОДНЫЙ КОД ЛИСТИНГА
ВВЕДЕНИЕ
Данная курсовая работа направлена на изучение принципов объектно-ориентированного программирования. Разработать программу на языке C++, реализующую игру «Морской бой». В программе используются, выбор языка программирования. Характеристика необходимых классов, наследований, виртуальных методов.
Программа «Морской бой» - чисто игровая программа, предназначена для удовлетворения игровых потребностей пользователя. Она требует использования мыши, так как только с ее помощью пользователь может размещать на игровом поле корабли и «стрелять» по кораблям противника.
Актуальность: Разработать программу, реализующую игру «Морской бой» в режиме пользователь - компьютер. В процессе реализации данной задачи использовать основные свойства объектно-ориентированного программирования (в обязательном порядке создать несколько классов (свойство инкапсуляции), которые будут взаимодействовать между собой и, если будет необходимо, использовать также другие свойства ООП).
Цель: Разработать программу на языке C++, реализующую игру «Морской бой». Создать объект корабль, у которого должно быть свойство цвет и метод прорисовки. От него создать четыре потомка (корабли с соответствующими размерами). От этих потомков создать необходимое количество потомков (в зависимости от размеров корабля, если 4, то 1 корабль, если 3, то 2 корабля и т.д.), которых должны иметь свойство позиция. При попадании в корабль сменить его цвет на другой. Клетки реализовать объектом (со свойствами позиция и методами прорисовки). При попадании в пустую клетку сделать ее отличимой от остальных (например, поставить в ней крест), кроме того не позволять игроку и компьютеру стрелять в нее. На экране отображать поля обоих игроков. Компьютеру задать простую логику: добивать корабль, не стрелять в соседние клетки от затопленного корабля и т.д. На экране отображать счетчик оставшихся кораблей игрока и компьютера.
Обычно перед началом разработки любой игры должна сформироваться идея, а издатель/разработчик должен дать «зелёный свет».Для управления всеми действами в программе необходимо было создать соответствующее ей меню, которое впоследствии было разработано.
Главным «помощником» в работе мне послужил язык программирования высокого уровня С++, который без всяких трудностей и препятствий позволил мне реализовать всю поставленную предо мною задачу целиком и полностью.
В курсовой работе приведены все этапы разработки программы, начиная с постановки самой задачи до её непосредственной реализации. Данная курсовая работа направлена на изучение принципов объектно-ориентированного программирование. В данной работе разрабатывается игра «Морской бой». В программе используются классы, наследование, виртуальные методы.
Постановка задачи: В данном проекте необходимо реализовать известную игру «Морской бой». Наиболее важные алгоритмы этой игры: алгоритмы расстановки кораблей по полю, выбора направления удара Компа в поле Игрока и непосредственно нанесение удара им.
Возможности программы: С помощью данной программы пользователь может насладиться игрой «Морской бой» в режиме пользователь - компьютер.
ГЛАВА 1. Выбор Языка Программирования
1.1 Выбор языка программирования
Язык С++ является в настоящее время наиболее распространенным и перспективным языком промышленного программирования. Он содержит наиболее полный набор свойств и возможностей, выработанных всей историей развития языков программирования. К существенным характерным свойствам С++ следует отнести прежде всего мощную поддержку объектно-ориентированного подхода к разработке программ и механизм параметризации типов и алгоритмов. Широкий диапазон типов и развитые возможности построения пользовательских типов позволяют адекватно отразить особенности предметной области; строгие правила обращения с константными типами способствуют надежности программ. Повышению надежности создаваемых программ служит простой и гибкий аппарат управления исключительными ситуациями. Развитые схемы преобразования и приведения типов позволяют обеспечить достаточный компромисс между строгой типизацией и эффективностью исполнения программ. Средства явного управления областями действия ("пространства имен") предоставляют удобный механизм структурирования больших программ.
С++ является прямым преемником языка С и фактически включает его как подмножество. Тем самым, С++ целиком содержит хорошо зарекомендовавшую себя традиционную модель вычислений языка С, в том числе, развитый обще алгоритмический базис, широкие возможности конструирования новых типов и гибкие средства работы с памятью, включая арифметику над указателями. Это обстоятельство обеспечивает сохранение в актуальном состоянии миллионы строк программного текста, разработанного на С, и дает дополнительные гарантии широкого использования С++.
Помимо широкой распространенности и популярности, в том числе, и в отечественной практике программирования, язык С++ служит технологической основой перспективной парадигмы, возникшей в недавнее время, - обобщенного программирования. Основным инструментом реализации обобщенного программирования на языке С++ служит механизм шаблонов и убедительным примером использования этой парадигмы является Стандартная Библиотека Шаблонов (StandardTemplateLibrary, STL), разработанная А.Степановым и М.Ли и вошедшая в 1994 г. в состав стандартной библиотеки С++.
Еще одно обстоятельство, обусловившее выбор языка С++ принятие в конце 1998 г. Международного Стандарта ANSI/ISO этого языка. Факт стандартизации для такого большого, сложного и современного языка, как С++, трудно переоценить. Если говорить коротко, С++ становится инструментом промышленного программирования в общемировом масштабе. Приверженность все большего числа корпоративных разработчиков программного обеспечения к использованию типовых решений и стандартизованных инструментальных средств дает твердую уверенность в успешных перспективах С++, по крайней мере, на ближайшие десять-пятнадцать лет (примерный срок смены поколений языков программирования).
1.2 Проектирование класса
В данной курсовой работе были созданы следующие классы:
Kletka - класс клетка:
Свойства:
· Pustaya_kletka - пустая или не пустая клетка,
· Vistrel - стреляли в клетку или нет,
· X - координата X,
· Y - координата Y.
Методы:
· Kletka(int x, int y) - конструктор,
· voidVistrel_v_kletku(intvistrel = 1) - функция выстрел в клетку,
· intVistrel_ili_net() - функция определяет, стреляли в клетку или нет,
· voidKorabl_v_kletku(intPustaya_kletka) - функция устанавливает, корабль в клетку,
· intPustaya_ili_net() - функция определяет, пустая или не пустая клетка,
· voidProrisovka(intsdvX, intsdvY) - функция прорисовки._Korabl - базовый класс корабль:
Свойства:
· Color - цвет корабля.
Методы:
· Base_Korabl() - конструктор,
· Prorisovka(short x, short y) - функция виртуального метода прорисовки._potomok - класс производный от Base_Korabl:
Свойства:
· Razmer - размер корабля,
· X - позиция по X,
· Y - позиция по Y,
· Polojenie - положение (горизонтальное или вертикальное),
· KOL_RANENIY - количество ранений.
Методы:
· Kor_potomok(short Razmer, short x, short y, short Polojenie) - конструктор,
· void Prorisovka(intsdvX, intsdvY) - функцияпереопределёногометодапрорисовки,
· intVistrel(int x, int y) - функциявыстрел,
· intRanenie() - функцияранение,
· voidVistrel_v_kletkus(Kletka *kletka[10][10]) - функция обстрела всех клеток вокруг корабля, если он убит,
· voidRasstanovka(Kletka *kletka[10][10]) - функция расставляет корабли.
Связь между базовым классом Base_Korabl и производным классам Kor_potomok. Класс Kletka - независимый класс.
Связь между классами
classKor_potomok: Base_Korabl {Razmer, X, Y, Polojenie, KOL_RANENIY;:_potomok(shortRazmer, short x, short y, shortPolojenie);Prorisovka(intsdvX, intsdvY);Vistrel(int x, int y);Ranenie();Vistrel_v_kletkus(Kletka *kletka[10][10]);Rasstanovka(Kletka *kletka[10][10]);
}
1.3 Программирование задачи
Синтаксис объявления класса в языке С++ имеет следующий вид:
class<имя класса>: <спецификатор доступа><имя базового класса>
{
элементы класса
<метка видимости>:<элементы класса>
<метка видимости>:<элементы класса>
};
1.4 Листинг. Объявления класса Kletka
classKletka {:Pustaya_kletka, Vistrel, X, Y;:(intx, inty);Vistrel_v_kletku(intvistrel = 1);Vistrel_ili_net();Korabl_v_kletku(intPustaya_kletka);Pustaya_ili_net();Prorisovka(intsdvX, intsdvY);
}
В данном листинге все свойства скрыты с помощью метки видимости private, так как работа со свойствами осуществляется с помощью интерфейса. Это один из трех принципов объектно-ориентированного программирования - инкапсуляция. Объединение данных с функциями их обработки в сочетании со скрытием ненужной для использования этих данных информации называется инкапсуляцией. Также имеется конструктор, который инициализирует начальные данные. Конструктор не возвращает значение, даже типа void, и должен называться также как и класс. Конструкторов может быть несколько с разными параметрами.
1.5 Объявления класса BaseKorabl
classBase_Korabl {:Color;:_Korabl();Prorisovka(short x, short y);
}
В этом листинге в производном классе был переопределён метод Prorisovka() для прорисовки кораблей разного размера. Этот принцип объектно-ориентированного программирования называется полиморфизмом - возможностью использовать в различных классах иерархии одно имя для обозначения сходных по смыслу действий и гибко выбирать требуемое действие во время выполнения программы.
1.6 Объявления класса KorPotomok
classKor_potomok: Base_Korabl {Razmer, X, Y, Polojenie, KOL_RANENIY;:_potomok(shortRazmer, short x, short y, shortPolojenie);Prorisovka(intsdvX, intsdvY);Vistrel(int x, int y);Ranenie();Vistrel_v_kletkus(Kletka *kletka[10][10]);Rasstanovka(Kletka *kletka[10][10]);
}
Класс Kor_potomok является производным от класса Base_Korabl. Он наследует все свойства и методы базового класса и добавляет новые. Это еще один принцип объектно-ориентированного программирования - наследование. Наследование - это возможность создания иерархии классов, когда потомки наследуют все свойства своих предков, могут их изменять и добавлять новые.
Также к программе подключены следующие заголовочные файлы:
·isotream - заголовочный файл подключается для получения доступа к функциям потокового ввода/вывод
·stdlib - заголовочный файл стандартной библиотеки общего назначения. Использованы функции:- функция устанавливающая случайный порядок выбора псевдослучайных чисел функцией- функция возвращающая случайного число из указанного диапазона.
·conio - заголовочный файл объявляет несколько библиотечных функций для работы с «консольным вводом и выводом» программы. При помощи него были решены проблемы связанные с формированием внешнего вида программы. Использованы функции:
gotoxy - перемещает курсор в текстовом окне на указанную позицию курсора. Прототип функции voidgotoxy(int x, int y).- определяет текстовое окно на экране. Прототипфункции void window(intleft,inttop,intright,int bottom).
textbackground - задает цвет фона в текстовом режиме. Прототипфункции void textbackground(intnewcolor).
textcolor - Устанавливает цвет символов в текстовом режиме. Прототипфункции void textcolor(intnewcolor).
clrscr - очищает текущее текстовое окно и перемещает курсор в верхний левый угол экрана. Прототип функции voidclrscr(void).
getch - читает один символ, непосредственно с консоли, без вывода его на экран. Прототип функции intgetch(void).
·dos.h - используется для подключения следующих функции delay .
При вызове функции delay выполнение программы приостанавливается на время, определяемое параметром milliseconds. Прототип функции voiddelay (unsignedmilliseconds).
Полный листинг программы смотрите в приложении 1.
ГЛАВА 2 Описание предметной Области
2.1 Описание предметной области
Предметная область данного проекта - игра «Морской бой». Она реализуется с помощью нажатий на клавиши мыши (размещение кораблей и выстрелы по кораблям противника, удачные попадания фиксируются желтым цветом).
Правила игры следующие: в поле 10х10 пользователь расставляет свои корабли (корабли не должны лежать друг на друге, стоять рядом, пересекаться). Точно так же компьютер на своем игровом поле расставляет свои корабли. Количество кораблей 10, а именно: один четырехпалубный (одна палуба соответствует одной клетке игрового поля), два трехпалубных, три двухпалубный и четыре однопалубных. После расстановки кораблей пользователь и компьютер поочередно «стреляют» по клеткам игрового поля противника. Если кому-либо из них удалось попасть во вражеский корабль, то, согласно правилам, ход не переходит к противнику (если игрок попал в корабль противника, то он имеет право еще одного выстрела) до следующего промаха. Победа достается тому, кто первым уничтожит все корабли противника. Ниже приводится диаграмма прецедентов, на которой изображены варианты действий для пользователя и компьютера.
2.1 Описание классов
С целью более удобного проектирования, настройки, и разделения отдельных исполняемых операций, программа построена на классах, которые взаимодействуют между собой. Использование классов дает улучшенной понимание кода, а значит настройку и последующую модификацию исходного кода программы. Код программы находится в «Приложении B»
2.2 Основные алгоритмы
Ниже в виде схем Насси-Шнейдермана представлены алгоритмы основных функций, используемых в программе, а именно: Функция Draw, Функция ShootPlayer (x, y, n), Функция Shoot (x, y, n). Функция Disposition или Generation
Определить значение key, x, y
Key = промах
Да Нет
Нарисовать промах в ячейке х, у
Кеу = попадание
Да Нет
Нарисовать в ячейке х, у подбитую палубу
Кеу = нарисовать корабль
Да Нет
і от 1 до количество палуб
По вертикали
Да Нет
Рисовать палубу в ячейке х, у+і Рисовать палубу в ячейке х+і, у
Key = промах
Да Нет
Нарисовать промах в ячейке х, у
Кеу = попадание
Да Нет
Нарисовать в ячейке х, у подбитую палубу
Кеу = нарисовать корабль
Да Нет
і от 1 до количество палуб
По вертикали
Да Нет
По вертикали
Рисовать палубу в ячейке х, у+і
Рисовать палубу в ячейке х+і, у
Функция Draw
Проверить куда пришлось попадание
Мимо
Нет Да
Нарисовать след от выстрела
В цель
Да Нет
Запомнить, что туда уже стреляли
Нарисовать подбитую палубу
Сообщить о попадании в расстрелянную ранее ячейку
Запомнить, что туда уже стркляли
ФункцияShootPlayer (x, y, n)
Запомнить результата выстрела в ShootPlayer
вShootPlayer попадание
Да Нет
Флот CPU уничтоженбесконечноДа Нет
Генерация x, y, для CPU
Конец раунда
Выход
Запомнить результат выстрела компьютера в ShootCPU
Функция Shoot (x, y, n)
Количество палуб col_dec = 4 col_ship< = 10k от 0 до col_ship
от 0 до 10
j от 0 до col_dec
Может ли здесь находиться данная палуба
Функция Disposition или Generation
2.3 Тестирование
Чтобы проверить корректность работы программы нужно провести тестирование. Бой с противником продолжается до полной победы, т.е. пока не будут уничтожены все 10 кораблей одного из противников.
Если первым свои корабли потерял компьютер, игроку выводится сообщение о победе
Сообщение о победе
Если первым свои корабли потерял игрок, ему выводится сообщение о проигрыше
Сообщение о проигрыше
В начале игры выводится приглашение к расстановке кораблей:
Расстановка кораблей
Если игрок выполнил недопустимое действие (например, попытался «наложить» корабль на корабль) ему будет выведено предупреждающее сообщение о его ошибке.
Если расстановка кораблей закончилась выводится приглашение к началу игры
Начало игры
В случае промаха игроку выводится сообщение о промахе
Сообщение о промахе
В случае попадания игроку выводится сообщение о попадании
Сообщение о попадании
В случае попадания в ячейку, которая уже обстреляна, игроку выводится сообщение с предложением выстрелить ещё раз
Сообщение о выстреле в обстрелянную ячейку
2.4 Анализ работы
В процессе выполнения данного курсового проекта были закреплены знания по использованию классов и использованию основ объектно-ориентированного программирования.
Конец игры предусмотрен в двух случаях: победа пользователя или победа компьютера. Также в процессе написания программы были рассмотрены все варианты некорректной работы программы, например: не размещает ли компьютер и пользователь корабли в соседних клетках, не ставит ли он корабли только в углах игрового поля, не накладываются ли корабли один на другой. Также проверяется соответствие количества кораблей и палуб на них (1 четырех палубный, 2 трехпалубных, 3 двухпалубных, 1 однопалубных). Все вышеописанные неполадки были обнаружены и успешно устранены.
Во время написания программы я получила навыки по использованию некоторых, ранее не использованных мной, компонентов среды программирования С++ Builder 6.
Также при написании данного курсового проекта я закрепил свои знания в области написания объектно-ориентированных программ, содержащих взаимодействующие классы. Были получены новые знания о создании классов и работе с ними. Благодаря работе над программой были закреплены знания распределения обязанностей между классами.
ЗАКЛЮЧЕНИЕ
В данной курсовой работе была разработана игра «Морской бой». В программе использовались классы, наследование, виртуальные методы. В качестве языка программирования был выбран язык С++. Этот язык является прямым преемником языка С и фактически включает его как подмножество. Тем самым, С++ целиком содержит хорошо зарекомендовавшую себя традиционную модель вычислений языка С, и предоставляет мощные средства работы с объектами. Было спроектировано три класса: Kletka - класс клетка, содержащий свойство позиция и метод прорисовки; Base_Korabl - базовый класс корабль со свойствам цвет методом прорисовки; Kor_potomok - класс производный от класса Base_Korabl, к которому помимо свойств базового класса добавляются свойства позиция, размер, положение, и в котором переопределён метод прорисовки, чтобы прорисовывать корабли разного размера. Все свойства классов закрыты с помощью метки видимости private, а доступ к ним осуществляется с помощью общедоступных методов работающими со свойствами. Такой подход позволяет скрыть от особенности организации класса, предоставив пользователю интерфейс работы с классом.
При разработке программы я получила практические навыки в работы с классами и закрепила теоретические знания по объектно-ориентированному программированию.
Особых трудностей в написании курсовой работы не возникло.
Дальнейшую модификацию программы вижу в усложнении логики игры компьютера таким образом, чтобы сначала он стрелял по тем клеткам, в которых могут располагаться большие корабли.
Цель работы заключалась в изучении принципов объектно-ориентированного программирования, и эта цель была достигнута.
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
1. C/C++. Объектно-ориентированное программирование. Практикум. Павловская Т.А. Санкт - Петербург «Питер» 2004 г;
2. C/C++. Структурное программирование. Практикум. Павловская Т.А., Щупак. Ю.А. Санкт - Петербург «Питер» 2005 г;
3. Архангельский. А.Я. Delphi 7. Справочное пособие. - М:ООО «Бином-Пресс», 2003 -1024 с.: ил.
4. Архангельский. А.Я. Программирование в C++ Builder 6. - ЗАО «Издательство
5. БИНОМ», Москва, 2000
6. Бобровский.С. Delphi и Kylix: библиотека программиста. - СПб.: Питер, 2002. - 560с.
7. Википедия. Свободная библиотека. Лифшиц.Ю. Курс лекций «Современные задачи криптографии» [Электрон ресурс] / Режим доступа: http://ru.wikipedia.org/wiki/.
8. Конспект лекций по дисциплине «Объектно-ориентированное программирование»;
9. Павловская. Т.А. С/С++. «Питер», Санкт-Петербург, 2002
10. Подбельский. В.В. Язык С, С++. «Финансы и статистика», Москва, 2003
11. С/С++. Программирование на языке высокого уровня. Павловская. Т.А. Санкт - Петербург «Питер» 2004 г;
12. Уильям. Топп, Уильям. Форд. Структура данных в С++-ЗАО «Издательство
13. Фаронов. В. В. Delphi. Программирование на языке высокого уровня.- М.: Питер, 2004. - 640 с.
14. Фленов. М.Е. Библия Delphi. - 3-е изд., перераб и доп. - СПб.:БХВ- Петербург, 2011. -688с.
ПРИЛОЖЕНИЕ А
ТЕКСТ ПРОГРАММЫ
Текст программы состоит из следующих модулей: UShipBattle.h, UShipBattle.cpp, ShipBattle.cpp
ShipBattle.cpp
// -
#include <vcl.h>
#pragma hdrstop
// -
USEFORM («UShipBattle.cpp», Form1);
// -
WINAPI WinMain (HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
Application->CreateForm (__classid(TForm1), &Form1);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
catch (…)
{
try
{
throw Exception(«»);
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
}
return 0;
}
// -
UShipBattle.cpp
// -
#include <vcl.h>
#pragma hdrstop
#include «UShipBattle.h»
// -
#pragma package (smart_init)
#pragma resource «*.dfm»
TForm1 *Form1;
// -
__fastcall TForm1:TForm1 (TComponent* Owner)
: TForm(Owner)
{
HE = new HandlersOfEvents (Fild1, Fild2);
}
// -
intFlot: GetStatus()
{
destroy = true;
for (j = 0; j < 10; j++)
for (i = 0; i< ship[j].col_deck; i++)
if (ship[j].decks[i])
{
destroy = false;
return 1;
}
return 0;
}
// -
int AI: Generation (Flot *CPU, intcol_ship, intcol_deck)
{
int x1, y1, k, i, j;
bool vertical = false, regen;
do {
randomize();
x1 = rand()% 10;
y1 = rand()% 10;
regen = false;
for (k = 0; k <col_deck; k++)
for (i = 0; i<col_ship; i++)
for (j = 0; j < CPU -> ship[i].col_deck; j++)
{
if(regen) break;
if(! vertical)
{
if((CPU -> ship[i].desp_of_part[j].x == x1 + k &&
CPU -> ship[i].desp_of_part[j].y == y1) || (x1 + k >= 10))
{
vertical = true;
regen = true;
continue;
}
if((CPU -> ship[i].desp_of_part[j].x - 1 == x1 + k ||
CPU -> ship[i].desp_of_part[j].x + 1 == x1 + k) &&
(CPU -> ship[i].desp_of_part[j].y - 1 == y1 ||
CPU -> ship[i].desp_of_part[j].y + 1 == y1))
{
vertical = true;
regen = true;
continue;
}
}
if(vertical)
{
if((CPU -> ship[i].desp_of_part[j].x == x1 &&
CPU -> ship[i].desp_of_part[j].y == y1 + k) ||
(y1 + k >= 10))
{
vertical = false;
regen = true;
continue;
}
if((CPU -> ship[i].desp_of_part[j].x - 1 == x1 ||
CPU -> ship[i].desp_of_part[j].x + 1 == x1) &&
(CPU -> ship[i].desp_of_part[j].y - 1 == y1 + k ||
CPU -> ship[i].desp_of_part[j].y + 1 == y1 + k))
{
vertical = true;
regen = true;
continue;
}
}
}
} while(regen);
if(! vertical)
for (i = 0; i<col_deck; i++)
{
CPU -> ship [col_ship - 1].desp_of_part[i].x = x1 + i;
CPU -> ship [col_ship - 1].desp_of_part[i].y = y1;
}
else
for (i = 0; i<col_deck; i++)
{
CPU -> ship [col_ship - 1].desp_of_part[i].x = x1;
CPU -> ship [col_ship - 1].desp_of_part[i].y = y1 + i;
}
return 0;
}
// -
int Referee: GoChecking (int x, int y, int n)
{
if (n == 1)
if (! Check(net1, x, y))
return 0;
if (n == 2)
if (! Check(net2, x, y))
return 0;
return 1;
}
// -
int Referee: Check (bool net[10] [10], int x, int y)
{
x /= 20; y /= 20;
if (! net[x] [y]) return 0;
return 1;
}
// -
int Referee: GoScaning (int x, int y, int n)
{
if (n == 1)
if (! Scan(player, x, y))
return 0;
if (n == 2)
if (! Scan(CPU, x, y))
return 0;
return 1;
}
// -
int Referee: Scan (Flot *fl, int x, int y)
{
x /= 20; y /= 20;
for (i = 0; i< 10; i++)
for (j = 0; j <fl -> ship[i].col_deck; j++)
if (fl -> ship[i].desp_of_part[j].x == x &&
fl -> ship[i].desp_of_part[j].y == y)
{
fl -> ship[i].decks[j] = false;
return 0;
}
return 1;
}
// -
int Referee: Miss (int x, int y, int n)
{
x /= 20; y /= 20;
if(n == 1) net1 [x] [y] = false;
if(n == 2) net2 [x] [y] = false;
return1;
}
// -
int Referee: EndRaund (int n)
{
if (n == 2)
Form1 -> Panel2 -> Caption = «Выпобедили!»;
if (n == 1)
Form1 -> Panel2 -> Caption = «Выпроиграли!»;
gameover = true;
return 0;
}
// -
intHandlersOfEvents: Play (TImage *Im1, TImage *Im2)
{
Im1 -> Enabled = true;
Im2 -> Enabled = true;
return 0;
}
// -
intHandlersOfEvents: Desposition (int x, int y, TMouseButton Button)
{
if(play) return 0;
x /= 20; y /= 20;
for (k = 0; k <col_deck; k++)
for (i = 0; i<col_ship; i++)
for (j = 0; j < player -> ship[i].col_deck; j++)
{
if (Button == mbLeft)
{
if (player -> ship[i].desp_of_part[j].x == x + k &&
player -> ship[i].desp_of_part[j].y == y)
{
ShowMessage («Невозможно выполнить действие!»);
return 0;
}
if (x + k >= 10)
{
ShowMessage («Невозможно выполнить действие!»);
return 0;
}
if((player -> ship[i].desp_of_part[j].x - 1 == x + k ||
player -> ship[i].desp_of_part[j].x + 1 == x + k) &&
player -> ship[i].desp_of_part[j].y - 1 == y ||
player -> ship[i].desp_of_part[j].y + 1 == y))
{
ShowMessage («Невозможно выполнить действие!»);
return 0;
}
}
if (Button == mbRight)
{
if (player -> ship[i].desp_of_part[j].x == x &&
player -> ship[i].desp_of_part[j].y == y + k)
{
ShowMessage («Невозможно выполнить действие!»);
return 0;
}
if (y + k >= 10)
{
ShowMessage («Невозможно выполнить действие!»);
return 0;
}
if((player -> ship[i].desp_of_part[j].x - 1 == x ||
player-> ship[i].desp_of_part[j].x + 1 == x) &&
(player-> ship[i].desp_of_part[j].y - 1 == y + k ||
player-> ship[i].desp_of_part[j].y + 1 == y + k))
{
ShowMessage («Невозможно выполнить действие!»);
return 0;
}
}
}
if (Button == mbLeft)
Draw («position_h», x*20, y*20, 1);
else
Draw («position_v», x*20, y*20, 1);
Generation (CPU, col_ship, col_deck);
if (col_ship == 1) col_deck -;
if (col_ship == 3) col_deck -;
if (col_ship == 6) col_deck -;
if (col_ship == 10) play = true;
if(play) Form1 -> Panel2 -> Caption = «Поехали»;
col_ship++;
return 0;
};
// -
intHandlersOfEvents: Shoot (int x, int y)
{
if (game_over) return 0;
intshoot_player = ShootPlayer (x, y, 2);
if (shoot_player> 0)
do {
x = rand()% 200;
y = rand()% 200;
intshoot_cpu = ShootPlayer (x, y, 1);
if (shoot_cpu> 0)
break;
if (shoot_cpu< 0)
player ->GetStatus();
if (player -> destroy || target_CPU> 19)
{
EndRaund(1);
return 0;
}
} while(true);
else basekorabl kletka korpotomok алгоритм
{
if (shoot_player< 0)
CPU ->GetStatus();
if (CPU -> destroy || target_player> 19)
{
EndRaund(2);
return 0;
}
}
return 0;
}
// -
intHandlersOfEvents: ShootPlayer (int x, int y, int n)
{
if(! play) return 0;
if (! GoChecking(x, y, n))
{
if (n == 2) Form1 -> Panel2 -> Caption = «Ещёраз! Тудаужестреляли!»;
return 0;
}
else if (! GoScaning(x, y, n))
{
Draw («target», x, y, n);
Miss (x, y, n);
if (n == 2)
{
Form1 -> Panel2 -> Caption = «Попал! Ещёраз!»;
target_player++;
}
elsetarget_CPU++;
return -1;
}
Miss (x, y, n);
if (n == 2) Form1 -> Panel2 -> Caption = «Мимо! Ходопонента»;
Draw («miss», x, y, n);
return 1;
}
// -
intHandlersOfEvents: Draw (String key, int x, int y, int n)
{
TImage *Im;
x /= 20; y /= 20;
if (n == 1) Im = Form1 -> Fild1;
if (n == 2) Im = Form1 -> Fild2;
if (key == «target»)
{
Im -> Canvas -> Rectangle (x*20, y*20, x*20 + 20, y*20 + 20);
Im -> Canvas -> Brush -> Color = clYellow;
Im -> Canvas -> Rectangle (x*20, y*20 + 20, x*20 + 20, y*20);
Im -> Canvas -> Brush -> Color = clWhite;
}
if (key == «miss»)
{
Im -> Canvas -> Ellipse (x*20, y*20, x*20 + 20, y*20 + 20);
Im -> Canvas -> Ellipse (x*20 + 5, y*20 + 5, x*20 + 15, y*20 + 15);
}
if (key == «position_h»)
{
for (i = 0; i<col_deck; i++)
{
Im -> Canvas -> Brush -> Color = clBlue;
Im -> Canvas -> Rectangle (x*20 + i*20, y*20, x*20 + 20 + i*20, y*20 + 20);
player -> ship [col_ship - 1].desp_of_part[i].x = x + i;
player -> ship [col_ship - 1].desp_of_part[i].y = y;
Im -> Canvas -> Brush -> Color = clWhite;
}
}
if (key == «position_v»)
{
for (i = 0; i<col_deck; i++)
{
Im -> Canvas -> Brush -> Color = clBlue;
Im -> Canvas -> Rectangle (x*20, y*20 + i*20, x*20 + 20, y*20 + 20 + i*20);
player -> ship [col_ship - 1].desp_of_part[i].x = x;
player -> ship [col_ship - 1].desp_of_part[i].y = y + i;
Im -> Canvas -> Brush -> Color = clWhite;
}
}
return 0;
}
// -
void __fastcall TForm1: Fild2MouseDown (TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
HE -> Shoot (X, Y);
}
// -
void __fastcall TForm1: BitBtn2Click (TObject *Sender)
{
HE -> Play (Fild1, Fild2);
BitBtn2 -> Visible = false;
BitBtn3 -> Visible = true;
Panel2 -> Caption = «Расставьтекорабли»;
}
// -
void __fastcall TForm1: Fild1MouseDown (TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
HE ->Desposition (X, Y, Button);
}
// -
void __fastcall TForm1: BitBtn3Click (TObject *Sender)
{
Panel2 -> Caption = «Расставьтекорабли»;
Fild1 -> Picture ->LoadFromFile («net.bmp»);
Fild2 -> Picture ->LoadFromFile («net.bmp»);
HE = new HandlersOfEvents (Fild1, Fild2);
}
// -
UShipBattle.h
// -
#ifndefUShipBattleH
#define UShipBattleH
// -
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Buttons.hpp>
#include <ExtCtrls.hpp>
#include <Graphics.hpp>
#include <ComCtrls.hpp>
// -
struct Ship
{
bool destroy;
intcol_deck;
bool *decks;
TPoint *desp_of_part;
};
classFlot
{
public:
inti, j, n;
bool destroy;
TImage *Im;
Ship ship[10];
Flot (TImage *I)
{
destroy = false;
Im = I;
n = 1;
for (i = 0; i< 10; i++)
{
if (i< 6) n = 2;
if (i< 3) n = 3;
if (i == 0) n = 4;
ship[i].destroy = false;
ship[i].col_deck = n;
ship[i].decks = new bool[n];
ship[i].desp_of_part = new TPoint[n];
}
}
intGetStatus();
};
class AI
{
public:
TPoint decks_[20];
intcol_decks_;
int Generation (Flot *CPU, intcol_ship, intcol_deck);
};
class Referee: public AI
{
public:
inti, j, target_player, target_CPU;
bool net1 [10] [10], net2 [10] [10], game_over;
Flot *player, *CPU;
Referee()
{
for (i = 0; i< 10; i++)
for (j = 0; j < 10; j++)
{
net1 [i] [j] = true;
net2 [i] [j] = true;
}
game_over = false;
target_player = 0;
target_CPU = 0;
col_decks_ = 0;
}
intGoChecking (int x, int y, int n);
int Check (bool net[10] [10], int x, int y);
intGoScaning (int x, int y, int n);
int Scan (Flot *fl, int x, int y);
int Miss (int x, int y, int n);
intEndRaund (int n);
};
classHandlersOfEvents: public Referee
{
public:
bool play;
intcol_deck, col_ship, i, j, k;
HandlersOfEvents (TImage *Im1, TImage *Im2)
{
play = false;
col_deck = 4; col_ship = 1;
player = new Flot(Im1);
CPU = new Flot(Im2);
}
int Play (TImage *Im1, TImage *Im2);
int Move();
intDesposition (int x, int y, TMouseButton Button);
int Draw (String key, int x, int y, int n);
intShootPlayer (int x, int y, int n);
int Shoot (int x, int y);
};
class TForm1: public TForm
{
__published: // IDE-managed Components
TImage *Fild1;
TImage *Fild2;
TPanel *Panel1;
TBitBtn *BitBtn1;
TBitBtn *BitBtn2;
TBitBtn *BitBtn3;
TPanel *Panel2;
void __fastcall Fild2MouseDown (TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y);
void __fastcall BitBtn2Click (TObject *Sender);
void __fastcall Fild1MouseDown (TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y);
void __fastcall BitBtn3Click (TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TForm1 (TComponent* Owner);
HandlersOfEvents *HE;
};
// -
externPACKAGETForm1 *Form1;
// -
#endif
ПРИЛОЖЕНИЕ В
ИСХОДНЫЙ КОД ЛИСТИНГА
В данной программе четко прослеживаются группы функций, которые из-за выполняемых ними операций стоит объединить в классы. Проанализировав предметную область программы можно выделить следующие классы:
ь Flot
ь AI
ь Referee
ь HandersOfEvents
Класс Flot - класс, который содержит данные о кораблях (количество кораблей, поле на котором следует размещать корабли и т.д.);
Класс AI - так называемый класс искусственного интеллекта, размещает корабли противника;
Класс Referee - наследник класса AI, который проверяет состояние кораблей и флотов пользователя и компьютера;
Класс HandersOfEvents - наследник класса Referee. Это единственный класс в данной программе, который взаимодействует с формой напрямую.
Также в программе используется структура Ship, которая содержит данные о количестве палуб корабля, расположении частей корабля, следит за состоянием корабля в целом.
// классFlot
classFlot
{
public:
int i, j, n; // переменные, используемые в циклах
booldestroy; // флаг, проверяющий наличие флота
TImage *Im; // поле, на котором мы рисуем
Ship ship[10]; // количество кораблей
Flot (TImage *I)
{
destroy = false;
Im = I;
n = 1;
for (i = 0; i< 10; i++)
{
if (i< 6) n = 2;
if (i< 3) n = 3;
if (i == 0) n = 4;
ship[i].destroy = false;
ship[i].col_deck = n;
ship[i].decks = new bool[n];
ship[i].desp_of_part = new TPoint[n];
}
}
intGetStatus();
};
// класс AI
class AI
{
public:
int Generation (Flot *CPU, intcol_ship, intcol_deck); // размещение кораблей противника
};
// класс Referee
class Referee: public AI
{
public:
inti, j, target_player, target_CPU;
bool net1 [10] [10], net2 [10] [10], game_over;
Flot *player, *CPU;
Referee()
{
for (i = 0; i< 10; i++)
for (j = 0; j < 10; j++)
{
net1 [i] [j] = true;
net2 [i] [j] = true;
}
game_over = false;
target_player = 0;
target_CPU = 0;
}
intGoChecking (int x, int y, int n); // запускфункциипроверки
intCheck (boolnet[10] [10], int x, int y); // проверка попадания в старую или новую ячейку
intGoScaning (int x, int y, int n); // запуск функции сканирования
intScan (Flot *fl, int x, int y); // сканирование (проверка) попадания в корабль
intMiss (int x, int y, int n); // отмечание ячейки в которую попали (но не в корабль)
intEndRaund (int n); // конецигры
};
// классHandlersOfEvents
classHandlersOfEvents: public Referee
{
public:
bool play;
intcol_deck, col_ship, i, j, k;
HandlersOfEvents (TImage *Im1, TImage *Im2)
{
play = false;
col_deck = 4; col_ship = 1;
player = new Flot(Im1);
CPU = new Flot(Im2);
}
int Play (TImage *Im1, TImage *Im2);
int Move();
intDesposition (int x, int y, TMouseButton Button); // размещениекораблей
int Draw (String key, int x, int y, int n); // рисование
intShootPlayer (int x, int y, int n); // выстрелигрока
intShoot (int x, int y); // выстрел компьютера
};
// структура Ship
structShip
{
booldestroy; // флаг уничтожения корабля
intcol_deck; // количество палуб
bool *decks; // массив палуб
TPoint *desp_of_part; // расположение частей (палуб) корабля
};
Размещено на Allbest.ru
Подобные документы
Характеристика основных принципов объектно-ориентированного программирования. Этапы разработки программы на языке C++, реализующей игру "Морской бой". Выбор языка программирования. Характеристика необходимых классов, наследований, виртуальных методов.
курсовая работа [657,6 K], добавлен 17.06.2012Разработка программы создания заметок в любом месте компьютера. Выбор технологии, языка и среды разработки приложения. Описание основных алгоритмов работы программного обеспечения. Проектирование пользовательского интерфейса. Выбор стратегии тестирования.
отчет по практике [700,5 K], добавлен 24.11.2014Разработка комплекса алгоритмов. Кодирование и компиляция. Тестирование, отладка, испытание и сдача программы. Минимальные системные требования для использования Delphi 7. Написание программы с использованием инструментального языка высокого уровня.
курсовая работа [2,7 M], добавлен 21.02.2011Описание принципа развивающей игры в слова "Виселица". Разработка программы, реализующей задачу данной игры на языке Delphi. Обоснование выбора среды программирования, листинг файла, результаты отладки и тестирования, руководство для пользователя.
курсовая работа [572,7 K], добавлен 14.07.2012Ознакомление с возможностями языка Си как средой программирования высокого уровня. Циклы программирования параметрического оператора for и функции форматированного ввода. Разработка программы средствами Си: блок-схема, текст и тестирование программы.
контрольная работа [204,4 K], добавлен 26.01.2013Создание программы, реализующей игру "Линии". Среда разработки программы, описание ее общего вида. Основные алгоритмы программы. Реализация программы в среде разработки Microsoft Visual Studio 2008 на языке объектно-ориентированного программирования С++.
курсовая работа [639,0 K], добавлен 16.03.2012Организация вычислительных процессов и программирования на алгоритмическом языке. Создание программы "Калькулятор". Выбор языка и среды программирования. Функциональная схема работы программы, описание разработанных алгоритмов. Способы устранения ошибок.
курсовая работа [434,1 K], добавлен 27.08.2012Разработка и тестирование программы класса Точка. Спецификация программы. Сценарий диалога с пользователем. Разработка структур данных и алгоритмов. Таблица параметров функций программы. Текст программы на языке C++. Особенности тестирования программы.
лабораторная работа [43,1 K], добавлен 21.07.2012Изучение условий поставленной задачи и используемых данных для разработки программы хранения информации о рейсах поезда. Описание разработанных функций, листинга, блок-схем алгоритмов и дерева функции. Рассмотрение сценария диалога данной программы.
курсовая работа [532,7 K], добавлен 20.07.2014Особенности разработки и реализации обучающей программы и схемы алгоритмов на языке программирования С++. Понятие равномерной и неравномерной дискретизации. Представление информации (составление кода) в виде таблицы перекодировки или многочлена.
курсовая работа [704,6 K], добавлен 06.03.2013