"Морской бой": разработка программы

Тип работы:
Курсовая
Предмет:
Программирование


Узнать стоимость

Детальная информация о работе

Выдержка из работы

Задание

Разработать программу на языке C++, реализующую игру «Морской бой».

Создать объект корабль, у которого должно быть свойство цвет и метод прорисовки. От него создать четыре потомка (корабли с соответствующими размерами). От этих потомков создать необходимое количество потомков (в зависимости от размеров корабля, если 4, то 1 корабль, если 3, то 2 корабля и т. д.), которых должны иметь свойство позиция. При попадании в корабль сменить его цвет на другой. Клетки реализовать объектом (со свойствами позиция и методами прорисовки). При попадании в пустую клетку сделать ее отличимой от остальных (например, поставить в ней крест), кроме того не позволять игроку и компьютеру стрелять в нее. На экране отображать поля обоих игроков. Компьютеру задать простую логику: добивать корабль, не стрелять в соседние клетки от затопленного корабля и т. д. На экране отображать счетчик оставшихся кораблей игрока и компьютера.

Аннотация

Данная курсовая работа направлена на изучение принципов объектно-ориентированного программирование. В данной работе разрабатывается игра «Морской бой». В программе используются классы, наследование, виртуальные методы.

Курсовая работа содержит:

· рисунков — 6,

· графиков — 0,

· таблиц — 0,

· схем — 1,

· страниц — 19.

Введение

программирование игра виртуальный

Целью данной курсовой работы является разработка карточной игры. Это задача реализуется с помощью объектно-ориентированного подхода. Выбор карточной игры был дан на усмотрение студента, и среди многочисленных вариантов предпочтение было отдано простой игре «21». Суть игры заключается в том, что бы набрать количество очков равное или максимально приближенное к 21. Игра предназначена для двоих игроков.

Обычно перед началом разработки любой игры должна сформироваться идея, а издатель/разработчик должен дать «зелёный свет».

В более распространённом случае, если разработчик и издатель являются разными компаниями, идея должна быть предложена руководству, одобрена и выставлена на рассмотрение издателям. В этом деле может помочь рабочее демо, но оно не является обязательным для авторитетного издателя с хорошей репутацией. Если заинтересованный издатель найден, можно начинать производство. Сегодня идея игры редко убеждает, если в ней не заинтересован издатель.

Если разработчик также является издателем, или если они оба являются подразделениями одной компании, то одобрение должно дать только высшее руководство. Однако, в зависимости от размера компании-издателя, может потребоваться несколько попыток, пока идея не поднимется вверх через все слои руководства.

Для реализации этой работы необходимо разработать класс, который будет представлять основу данной программы оттолкнувшись от которой можно реализовывать все более и более сложные и интересные идеи. Подобием такого класса послужил класс Karta который хранит в себе всё необходимые сведения об игровой карте и методы которые свойственны ей среди которых имеются: выдача карты, выбор случайной карты из колоды и т. д.

Для управления всеми действами в программе необходимо было создать соответствующее ей меню, которое впоследствии было разработано.

Главным «помощником» в работе мне послужил язык программирования высокого уровня С++, который без всяких трудностей и препятствий позволил мне реализовать всю поставленную предо мною задачу целиком и полностью.

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

1. Анализ задачи

Смысл игры «Морской бой» следующий: создаётся два поля 10×10, на которых размещаются по 10 кораблей разного размера (один — размера четыре, два — размера три, три — размера два и четыре — размера один); корабли могут располагаться горизонтально и вертикально; два корабля не могут находиться в соседних полях; каждый игрок видит только свои корабли и обстрелянные поля противника; стрелять разрешается только по тем полям, по которым еще не стреляли; если игрок ранил корабль, то поле закрашивается красным цветом, если убил — то все поля вокруг корабля закрашиваются серым цветом; игрок стреляет до первого промаха, далее ход переходит к противнику; как только кто-то из игроков убьёт все корабли противника, он выигрывает, все игра окончена.

Клетку представим объектом класса Kletka, который хранит координаты клетки и имеет метод прорисовки. Корабли реализуем двумя классами: базовым классом Base_Korabl, со свойством цвет и виртуальным методом прорисовки, и производным от него классом Kor_potomok, который содержит, позицию корабля, размер, положение, и в котором переопределен метод прорисовки базового класса для прорисовки кораблей разного размера.

Использование объектно-ориентированного программирования упрощает нам задачу. Объектно-ориентированное программирование — это подход к разработке программного обеспечения, основанный на объектах. Этот подход позволяет максимизировать принципы модульности и «сокрытия информации». Объектно-ориентированное программирование базируется на связывании или инкапсуляции структур данных и процедуры, которая работает с данными в структуре, с модулем.

Объектно-ориентированный принцип разработки дает много преимуществ. Например, каждый объект инкапсулирует его структуру данных с процедурой, используемой для работы с экземплярами структуры данных. Это позволяет устранить в коде программы внутренние зависимости, которые могут быстро привести к тому, что этот код будет трудно обслуживать. Объекты могут также наследовать из порождающего объекта структуры данных и другие характеристики, что позволяет сэкономить усилия и обеспечить прозрачное использование для многих целей больших фрагментов кода.

2. Выбор языка программирования

Язык С++ является в настоящее время наиболее распространенным и перспективным языком промышленного программирования. Он содержит наиболее полный набор свойств и возможностей, выработанных всей историей развития языков программирования. К существенным характерным свойствам С++ следует отнести прежде всего мощную поддержку объектно-ориентированного подхода к разработке программ и механизм параметризации типов и алгоритмов. Широкий диапазон типов и развитые возможности построения пользовательских типов позволяют адекватно отразить особенности предметной области; строгие правила обращения с константными типами способствуют надежности программ. Повышению надежности создаваемых программ служит простой и гибкий аппарат управления исключительными ситуациями. Развитые схемы преобразования и приведения типов позволяют обеспечить достаточный компромисс между строгой типизацией и эффективностью исполнения программ. Средства явного управления областями действия («пространства имен») предоставляют удобный механизм структурирования больших программ.

С++ является прямым преемником языка С и фактически включает его как подмножество. Тем самым, С++ целиком содержит хорошо зарекомендовавшую себя традиционную модель вычислений языка С, в том числе, развитый общеалгоритмический базис, широкие возможности конструирования новых типов и гибкие средства работы с памятью, включая арифметику над указателями. Это обстоятельство обеспечивает сохранение в актуальном состоянии миллионы строк программного текста, разработанного на С, и дает дополнительные гарантии широкого использования С++.

Помимо широкой распространенности и популярности, в том числе, и в отечественной практике программирования, язык С++ служит технологической основой перспективной парадигмы, возникшей в недавнее время, — обобщенного программирования. Основным инструментом реализации обобщенного программирования на языке С++ служит механизм шаблонов и убедительным примером использования этой парадигмы является Стандартная Библиотека Шаблонов (Standard Template Library, STL), разработанная А. Степановым и М. Ли и вошедшая в 1994 г. в состав стандартной библиотеки С++.

Еще одно обстоятельство, обусловившее выбор языка С++ принятие в конце 1998 г. Международного Стандарта ANSI/ISO этого языка. Факт стандартизации для такого большого, сложного и современного языка, как С++, трудно переоценить. Если говорить коротко, С++ становится инструментом промышленного программирования в общемировом масштабе. Приверженность все большего числа корпоративных разработчиков программного обеспечения к использованию типовых решений и стандартизованных инструментальных средств дает твердую уверенность в успешных перспективах С++, по крайней мере, на ближайшие десять-пятнадцать лет (примерный срок смены поколений языков программирования).

3. Проектирование класса

В данной курсовой работе были созданы следующие классы:

Kletka — класс клетка:

Свойства:

· Pustaya_kletka — пустая или не пустая клетка,

· Vistrel — стреляли в клетку или нет,

· X — координата X,

· Y — координата Y.

Методы:

· Kletka (int x, int y) — конструктор,

· void Vistrel_v_kletku (int vistrel = 1) — функция выстрел в клетку,

· int Vistrel_ili_net () — функция определяет, стреляли в клетку или нет,

· void Korabl_v_kletku (int Pustaya_kletka) — функция устанавливает, корабль в клетку,

· int Pustaya_ili_net () — функция определяет, пустая или не пустая клетка,

· void Prorisovka (int sdvX, int sdvY) — функция прорисовки.

Base_Korabl — базовый класс корабль:

Свойства:

· Color — цвет корабля.

Методы:

· Base_Korabl () — конструктор,

· Prorisovka (short x, short y) — функция виртуального метода прорисовки.

Kor_potomok — класс производный от Base_Korabl:

Свойства:

· Razmer — размер корабля,

· X — позиция по X,

· Y — позиция по Y,

· Polojenie — положение (горизонтальное или вертикальное),

· KOL_RANENIY — количество ранений.

Методы:

· Kor_potomok (short Razmer, short x, short y, short Polojenie) — конструктор,

· void Prorisovka (int sdvX, int sdvY) — функция переопределёного метода прорисовки,

· int Vistrel (int x, int y) — функция выстрел,

· int Ranenie () — функция ранение,

· void Vistrel_v_kletkus (Kletka *kletka[10][10]) — функция обстрела всех клеток вокруг корабля, если он убит,

· void Rasstanovka (Kletka *kletka[10][10]) — функция расставляет корабли.

Связь между базовым классом Base_Korabl и производным классам Kor_potomok представлена на схеме 1. Класс Kletka — независимый класс.

Схема 1. Связь между классами

4. Программирование задачи

Синтаксис объявления класса в языке С++ имеет следующий вид:

class < имя класса>: < спецификатор доступа> < имя базового класса>

{

элементы класса

< метка видимости> :<элементы класса>

< метка видимости> :<элементы класса>

};

Листинг объявления класса Kletka:

class Kletka {

private:

short Pustaya_kletka, Vistrel, X, Y;

public:

Kletka (int x, int y);

void Vistrel_v_kletku (int vistrel = 1);

int Vistrel_ili_net ();

void Korabl_v_kletku (int Pustaya_kletka);

int Pustaya_ili_net ();

void Prorisovka (int sdvX, int sdvY);

}

В данном листинге все свойства скрыты с помощью метки видимости private, так как работа со свойствами осуществляется с помощью интерфейса. Это один из трех принципов объектно-ориентированного программирования — инкапсуляция. Объединение данных с функциями их обработки в сочетании со скрытием ненужной для использования этих данных информации называется инкапсуляцией. Также имеется конструктор, который инициализирует начальные данные. Конструктор не возвращает значение, даже типа void, и должен называться также как и класс. Конструкторов может быть несколько с разными параметрами.

Листинг объявления класса Base_Korabl:

class Base_Korabl {

protected:

short Color;

public:

Base_Korabl ();

void Prorisovka (short x, short y);

}

В этом листинге в производном классе был переопределён метод Prorisovka () для прорисовки кораблей разного размера. Этот принцип объектно-ориентированного программирования называется полиморфизмом — возможностью использовать в различных классах иерархии одно имя для обозначения сходных по смыслу действий и гибко выбирать требуемое действие во время выполнения программы.

Листинг объявления класса Kor_potomok:

class Kor_potomok: Base_Korabl {

short Razmer, X, Y, Polojenie, KOL_RANENIY;

public:

Kor_potomok (short Razmer, short x, short y, short Polojenie);

void Prorisovka (int sdvX, int sdvY);

int Vistrel (int x, int y);

int Ranenie ();

void Vistrel_v_kletkus (Kletka *kletka[10][10]);

void Rasstanovka (Kletka *kletka[10][10]);

}

Класс Kor_potomok является производным от класса Base_Korabl. Он наследует все свойства и методы базового класса и добавляет новые. Это еще один принцип объектно-ориентированного программирования — наследование. Наследование — это возможность создания иерархии классов, когда потомки наследуют все свойства своих предков, могут их изменять и добавлять новые.

Также к программе подключены следующие заголовочные файлы:

· isotream — заголовочный файл подключается для получения доступа к функциям потокового ввода/вывод

· stdlib — заголовочный файл стандартной библиотеки общего назначения. Использованы функции:

randomize — функция устанавливающая случайный порядок выбора псевдослучайных чисел функцией

random — функция возвращающая случайного число из указанного диапазона.

· conio — заголовочный файл объявляет несколько библиотечных функций для работы с «консольным вводом и выводом» программы. При помощи него были решены проблемы связанные с формированием внешнего вида программы. Использованы функции:

gotoxy — перемещает курсор в текстовом окне на указанную позицию курсора. Прототип функции void gotoxy (int x, int y).

window — определяет текстовое окно на экране. Прототип функции void window (int left, int top, int right, int bottom).

textbackground — задает цвет фона в текстовом режиме. Прототип функции void textbackground (int newcolor).

textcolor — Устанавливает цвет символов в текстовом режиме. Прототип функции void textcolor (int newcolor).

clrscr — очищает текущее текстовое окно и перемещает курсор в верхний левый угол экрана. Прототип функции void clrscr (void).

getch — читает один символ, непосредственно с консоли, без вывода его на экран. Прототип функции int getch (void).

· dos. h — используется для подключения следующих функции delay.

При вызове функции delay выполнение программы приостанавливается на время, определяемое параметром milliseconds. Прототип функции void delay (unsigned milliseconds).

Полный листинг программы смотрите в приложении 1.

Заключение

В данной работе была разработана игра «Морской бой». В программе использовались классы, наследование, виртуальные методы. В качестве языка программирования был выбран язык С++. Этот язык является прямым преемником языка С и фактически включает его как подмножество. Тем самым, С++ целиком содержит хорошо зарекомендовавшую себя традиционную модель вычислений языка С, и предоставляет мощные средства работы с объектами. Было спроектировано три класса: Kletka — класс клетка, содержащий свойство позиция и метод прорисовки; Base_Korabl — базовый класс корабль со свойствам цвет методом прорисовки; Kor_potomok — класс производный от класса Base_Korabl, к которому помимо свойств базового класса добавляются свойства позиция, размер, положение, и в котором переопределён метод прорисовки, чтобы прорисовывать корабли разного размера. Все свойства классов закрыты с помощью метки видимости private, а доступ к ним осуществляется с помощью общедоступных методов работающими со свойствами. Такой подход позволяет скрыть от особенности организации класса, предоставив пользователю интерфейс работы с классом.

При разработке программы я получил практические навыки в работы с классами и закрепил теоретические знания по объектно-ориентированному программированию.

Особых трудностей в написании работы не возникло.

Дальнейшую модификацию программы вижу в усложнении логики игры компьютера таким образом, чтобы сначала он стрелял по тем клеткам, в которых могут располагаться большие корабли.

Цель работы заключалась в изучении принципов объектно-ориентированного программирования, и эта цель была достигнута.

Список литературы

1. С/С++. Программирование на языке высокого уровня. Павловская Т. А. Санкт — Петербург «Питер» 2004 г;

2. C/C++. Объектно-ориентированное программирование. Практикум. Павловская Т. А. Санкт — Петербург «Питер» 2004 г;

3. C/C++. Структурное программирование. Практикум. Павловская Т. А., Щупак Ю. А. Санкт — Петербург «Питер» 2005 г;

4. Конспект лекций по дисциплине «Объектно-ориентированное программирование»;

Приложения

Приложение 1 (листинг программы)

#include < conio. h>

#include < stdlib. h>

#include < iostream. h>

#include < dos. h>

class Kletka {

private:

short Pustaya_kletka, Vistrel, X, Y;

public:

Kletka (int x, int y) {Vistrel = 0; Pustaya_kletka = 0; X = x; Y = y; }

void Vistrel_v_kletku (int vistrel = 1) {Vistrel = vistrel; }

int Vistrel_ili_net () {return Vistrel; }

void Korabl_v_kletku (int pustaya_kletka) {Pustaya_kletka = pustaya_kletka; }

int Pustaya_ili_net () {return Pustaya_kletka; }

void Prorisovka (int sdvX, int sdvY) {

window (3*(sdvX+X), 2*(sdvY+Y), 3*(sdvX+X)+2, 2*(sdvY+Y)+1);

int color;

if (Pustaya_kletka == 2) {

if (Vistrel) color = RED;

else color = GREEN;

}

else if (Vistrel) color = BLUE;

else color = BLUE;

textbackground (color);

clrscr ();

if (color == CYAN) {

gotoxy (2, 2);

}

if (Vistrel) {

cout< <"*";

textcolor (WHITE);

}

}

};

class Base_Korabl {

protected:

short Color;

public:

Base_Korabl () {Color = 0; }

void Prorisovka (short x, short y) {

window (3*x, 2*y, 3*x+2, 2*y+1);

textbackground (Color);

clrscr ();

}

};

class Kor_potomok: Base_Korabl { short Razmer, X, Y, Polojenie, KOL_RANENIY;

public:

Kor_potomok (short razmer, short x, short y, short polojenie) {

Razmer = razmer; X = x; Y = y; Polojenie = polojenie; KOL_RANENIY = 0;

}

void Prorisovka (int sdvX, int sdvY) {

if (Polojenie) for (int a = X; a < X + Razmer; a++) Base_Korabl: :Prorisovka (sdvX+a, sdvY+Y);

else for (int a = Y; a < Y + Razmer; a++) Base_Korabl: :Prorisovka (sdvX+X, sdvY+a);

}

int Vistrel (int x, int y) {

if (Polojenie) for (int a = X; a < X + Razmer; a++) {

if ((x == a) & & (Y == y)) return 1;

}

else for (int a = Y; a < Y + Razmer; a++) {

if ((x == X) & & (y == a)) return 1;

}

return 0;

}

int Ranenie () {KOL_RANENIY++; if (KOL_RANENIY == Razmer) return 1; else return 0; }

void Vistrel_v_kletkus (Kletka *kletka[10][10]) {

int xm, ym;

if (Polojenie) {xm = X + Razmer; ym = Y + 1; }

else {xm = X + 1; ym = Y + Razmer; }

for (int i = X — 1; i <= xm; i++) if ((i <= 10) & & (i > 0))

for (int j = Y — 1; j <= ym; j++) if ((j <= 10) & & (j > 0))

kletka[i-1][j-1]-> Vistrel_v_kletku (1);

}

void Rasstanovka (Kletka *kletka[10][10]) {

int xm, ym;

if (Polojenie) {xm = X + Razmer; ym = Y + 1; }

else {xm = X + 1; ym = Y + Razmer; }

for (int i = X — 1; i <= xm; i++)

for (int j = Y -1; j <= ym; j++) {

if (!((i < 1) || (i > 10) || (j < 1) || (j > 10))) {

if ((X <= i) & & (i <= xm-1) & & (Y <= j) & & (j <= ym-1))

kletka[i-1][j-1]-> Korabl_v_kletku (2);

else kletka[i-1][j-1]-> Korabl_v_kletku (1);

}

}

}

};

void New_Korabl (Kor_potomok *ship[10], Kletka *kletka[10][10], int kol_raneniy);

int shoting (Kletka *kletka[10][10], Kor_potomok *ship[10], int & xn, int & yn, int & kol_raneniy, int & a, int m);

void main () {

textbackground (BLACK);

textcolor (WHITE);

clrscr ();

const csdvX = 14, csdvY = 2;

for (int i = 1; i <= 10; i++) {

gotoxy (3*csdvX + 3*i + 1, 2*csdvY + 1); cout< <i;

gotoxy (3*csdvX + 1, 2*csdvY + 2*i + 1); cout< <i;

}

Kletka * kletka[10][10];

for (i = 0; i < 10; i++)

for (int j = 0; j < 10; j++) kletka[i][j] = new Kletka (i+1, j+1);

for (i = 0; i < 5; i++) random (45);

const msdvX = 1, msdvY = 2;

for (i = 1; i <= 10; i++) {

gotoxy (3*msdvX + 3*i + 1, 2*msdvY + 1); cout< <i;

gotoxy (3*msdvX + 1, 2*msdvY + 2*i + 1); cout< <i;

}

Kletka * mkletka[10][10];

for (i = 0; i < 10; i++)

for (int j = 0; j < 10; j++) mkletka[i][j] = new Kletka (i+1, j+1);

randomize ();

Kor_potomok *mship[10], *Base_Korabl[10];

New_Korabl (Base_Korabl, kletka, 0);

New_Korabl (mship, mkletka, 1);

char ch;

int ckol = 10, cxn, cyn, cr = 0, ma, ca;

int mkol = 10, px = 0, py= 0;

for (i = 0; i < 10; i++) for (int j = 0; j < 10; j++)

kletka[i][j]-> Prorisovka (csdvX, csdvY);

for (i = 0; i < 10; i++) for (int j = 0; j < 10; j++)

mkletka[i][j]-> Prorisovka (msdvX, msdvY);

window (msdvX+3, 2, msdvY + 33, 3);

textbackground (BLACK);

clrscr ();

cout< <"Кол-во кораблей игрока: «< <mkol;

do {

int sh;

do { // Выстрел игрока

window (3*csdvX + 1, 2, 3*csdvX + 32, 3);

textbackground (BLACK);

clrscr ();

cout< <"Кол-во кораблей компьютера: «< <ckol;

if (!ckol) break;

sh = shoting (kletka, Base_Korabl, px, py, csdvX, csdvY, 1);

for (i = 0; i < 10; i++) for (int j = 0; j < 10; j++) kletka[i][j]-> Prorisovka (csdvX, csdvY);

if (!sh) ckol--;

if (sh == 2) break;

} while (1);

if (!ckol) break;

do { // Выстрел компьютера

window (msdvX + 3, 2, msdvY + 33, 3);

textbackground (BLACK);

clrscr ();

cout< <"Кол-во кораблей игрока: «< <mkol;

if (!mkol) break;

sh = shoting (mkletka, mship, cxn, cyn, cr, ca, 0);

for (i = 0; i < 10; i++) for (int j = 0; j < 10; j++) mkletka[i][j]-> Prorisovka (msdvX, msdvY);

if (!sh) mkol--;

if (sh == 2) break;

delay (500);

} while (1);

} while (ckol & & mkol);

window (18, 12, 62, 16);

textbackground (GREEN);

clrscr ();

(mkol)? cout< <"Поздравляем! Вы выйграли. «: cout< <"Увы! Вы проиграли. «;

getch ();

delete kletka;

delete mkletka;

return;

}

/* функция обстрела кораблей (матрица обетов поле,

координаты последнего выстрела, количество ранений)

возвращает 0 — убит, 1 — ранен, 2 — мимо

*/

int shoting (Kletka *kletka[10][10], Kor_potomok *ship[10], int & x, int & y, int & kol_raneniy, int & a, int m) {

int xn, yn;

if (m) // Выстрел игрока

do { // пока не введено небитое поле

char ch;

do {

window (3*(kol_raneniy+x+1), 2*(a+y+1), 3*(kol_raneniy+x+1)+2, 2*(a+y+1)+1);

textbackground (WHITE);

clrscr ();

ch = getch ();

switch (ch) {

case 77: if (x < 9) {kletka[x][y]-> Prorisovka (kol_raneniy, a); x++;} break;

case 75: if (x > 0) {kletka[x][y]-> Prorisovka (kol_raneniy, a); x--;} break;

case 80: if (y < 9) {kletka[x][y]-> Prorisovka (kol_raneniy, a); y++;} break;

case 72: if (y > 0) {kletka[x][y]-> Prorisovka (kol_raneniy, a); y--;} break;

}

} while (ch ≠ 13);

xn = x; yn = y;

if (!kletka[x][y]-> Vistrel_ili_net ()) break;

} while (1);

else switch (kol_raneniy) { // Выстрел компьютера

case 0:

do { //корабль не был ранен

x = random (10);

y = random (10);

if (!kletka[x][y]-> Vistrel_ili_net ()) break;

} while (1);

break;

case 1: // корабль был ранен один раз

xn = x; yn = y;

if ((x < 9) & & (!kletka[x+1][y]-> Vistrel_ili_net ())) {a = 0; x++; }

else if ((x > 0) & & (!kletka[x-1][y]-> Vistrel_ili_net ())) {a = 1; x--; }

else if ((y < 9) & & (!kletka[x][y+1]-> Vistrel_ili_net ())) {a = 2; y++; }

else if ((y > 0) & & (!kletka[x][y-1]-> Vistrel_ili_net ())) {a = 3; y--; }

break;

default:

xn = x; yn = y;

switch (a) { //коробль был ранен более одного раза

case 0: if ((x < 9) & & (!kletka[x+1][y]-> Vistrel_ili_net ())) x++;

else {x = x — kol_raneniy; a = 1;} break;

case 1: if ((x > 0) & & (!kletka[x-1][y]-> Vistrel_ili_net ())) x--;

else {x = x + kol_raneniy; a = 0;} break;

case 2: if ((y < 9) & & (!kletka[x][y+1]-> Vistrel_ili_net ())) y++;

else {y = y — kol_raneniy; a = 3;} break;

case 3: if ((y > 0) & & (!kletka[x][y-1]-> Vistrel_ili_net ())) y--;

else {y = y + kol_raneniy; a = 2;} break;

}

}

kletka[x][y]-> Vistrel_v_kletku (1);

for (int i = 0; i < 10; i++) if (ship[i]-> Vistrel (x+1, y+1)) {

if (ship[i]-> Ranenie ()) { // убит

ship[i]-> Rasstanovka (kletka);

ship[i]-> Vistrel_v_kletkus (kletka);

kol_raneniy = 0;

return 0;

}

else {kletka[x][y]-> Korabl_v_kletku (2); kol_raneniy++; return 1;} // ранен

}

if (kol_raneniy) {x = xn; y = yn; }

return 2; // мимо

}

/* Создает корабли и размещает их на поле */

void New_Korabl (Kor_potomok *ship[10], Kletka *kletka[10][10], int kol_raneniy) {

for (int k = 0; k < 10; k++) {

int Razmer, x, y, Polojenie, b;

if (0 == k) Razmer = 4;

else if ((1 == k) || (2 == k)) Razmer = 3;

else if ((3 <= k) & & (5 >= k)) Razmer = 2;

else Razmer = 1;

do {

x = random (10) + 1; y = random (10) + 1; Polojenie = random (2);

int xm, ym; b = 0;

if (Polojenie) {xm = x + Razmer; ym = y; }

else {xm = x; ym = y + Razmer; }

for (int i = x; i <= xm; i++) {

for (int j = y; j <= ym; j++) {

if ((i > 10) || (j > 10)) {b = 1; break; }

if (!((i < 1) || (i > 10) || (j < 1) || (j > 10))) {

if (b = kletka[i-1][j-1]-> Pustaya_ili_net ()) break; }

}

if (b) break;

}

} while (b);

ship[k] = new Kor_potomok (Razmer, x, y, Polojenie);

ship[k]-> Rasstanovka (kletka);

}

if (!kol_raneniy) for (int i = 0; i <= 9; i++)

for (int j = 0; j <= 9; j++) kletka[i][j]-> Korabl_v_kletku (0);

return;

}

Приложение 2 (результат выполнения программы)

Рисунок 1. Начальная расстановка кораблей

Рисунок 2. Первое ранение

Рисунок 3. Первый убитый корабль компьютера

Рисунок 4. Первый убитый корабль игрока

Рисунок 5. Игрок проиграл

Рисунок 6. Игрок выиграл

ПоказатьСвернуть
Заполнить форму текущей работой