Федеральное агентство железнодорожного транспорта
Омский государственный университет путей сообщения
Кафедра «Автоматика и системы управления»
СОЗДАНИЕ ИГРЫ «Морской бой»
Пояснительная записка к курсовой работе по программированию
ИНМВ. 400500.000 ПЗ
Студентка гр. 25 ф __________ «__»________2016 г. Руководитель – преподаватель кафедры АиСУ __________ «__»________2016 г. |
Омск 2016
Задание
Создание игры «Морской бой». Целью данной игры является уничтожение кораблей противника. Играют человек и компьютер. Оба расставляют свои корабли на поле размером 10x10. Объекты следующие: четыре однопалубных корабля, три двухпалубных, два трехпалубных и один четырехпалубный. Корабли соперника (компьютера) игроку не видны. Корабли нельзя пересекать.
Игрок делает удар, называя координаты какой-либо клетки. Если игрок не попал по кораблю, то следующий ход делает его противник. Если же игрок попал по какой-либо части корабля, то есть ранил его, или отметил координатами все точки корабля, то есть убил, то игрок продолжает делать свой ход.
Побеждает тот, кто быстрее уничтожит корабли противника.
Содержание
Введение. 3
1 Алгоритм игры.. 3
2 Код игры.. 3
Вывод. 3
. 3
Введение
В данной курсовой работе необходимо реализовать игру «Морской бой» на языке C, используя его возможности, а именно двумерные массивы, обнуление массивов, структуры и собственные функции. При разработке данной игровой программы были использованы текстовый редактор Notepad++ и компилятор MinGw GCC.
1 Алгоритм игры
Программа начинается с вывода меню. Игрок может расставить корабли самостоятельно или же выбрать пункт меню «Расставить автоматически». Так же в меню можно посмотреть расположение уже расставленных кораблей, убрать все корабли и расставить заново. После того как корабли установлены, начинается игра. Первым начинает ходить компьютер. На экране высвечивается координата выстрела компьютера и поле. Далее ход делает игрок. Если он попадает по кораблю, то ему предоставляется возможность сделать еще один ход. Если удар мимо, то ход опять переходит к компьютеру. Так происходит до тех пор, пока один из игроков не уничтожит все корабли противника. Тот, кто сделает это быстрее и считается победителем.
2 Код игры
|
Рисунок 1 – Библиотеки и основные функции |
Для реализации игры нам нужно объявить структуру, чтобы помощью нее обозначать корабли, а так же основные функций.
В программе используются такие библиотеки, как:
- #include <time. h> //библиотека, предназначенная для работы с системным временем
- #include <stdio. h> // библиотека для выполнения ввода/вывода
- #include <stdlib. h> //библиотека, которая содержит функции общего назначения
|
Рисунок 2 – Функция меню игры |
Функция PlacePlayerShips выводит на экран меню с помощью команды «printf».
|
Рисунок 3 – Функция меню игры |
Чтобы выполнить определенное действие из меню, используем функцию PlacePlayerShips. Если выбранное число совпадает с единицей, то срабатывают функции ClearArray, которая отвечает за зануление доски, и PlaceShips, с помощью которой происходит дальнейшая расстановка кораблей. Переменная «ships_placed» приравнивается к единице, так как она обозначает, что поле заполнено. При выборе цифры 2 вызывается функция, отвечающая за распечатку текущего состояния доски. При выборе 3 поле зануляется, а переменной «ships_placed» возвращается значение 0, при четверке происходит случайная расстановка кораблей. Опять же, поле стало заполненным, переменной «ships_placed» . Теперь, если игрок сразу нажмет на цифру 5, игра выдаст сообщение о том, что корабли в столовой не расставлены.
|
Рисунок 4 – Функция проверки ввода данных |
Функция ReadInt проверяет, чтобы вводились значения только в заданном диапазоне (min и max). Если была введена буква, то «continue» возвращает действие. Если число было введено верно, то exit которое первоначально в условии было равно нулю становится единицей, и происходит выход из цикла.
|
Рисунок 5 – Функция печати игрового поля |
Для представления игрового поля символами, используем функцию PrintDeck. Используем циклы for, чтобы отсчитывать каждую клеточку поля. От того, какая цифра будет стоять в данной клеточке, будет зависеть, каким символом мы будем заменять.
|
Рисунок 6 – Определение победителя |
Функция CheckAliveShips определяет, сколько частей кораблей подбито. Когда будут подбиты все 20 частей, игра закончится и в игровом окне появится сообщение о победе игрока или компьютера. Для каждого из игроков представлена своя функция доски. Поэтому в зависимости от того, какая из функций будет указана в скобках, будет зависеть, какое сообщение будет выведено.
Вывод
В ходе написания данной игровой программы на языке программирования С в рамках курса «программирование» были получены знания в этой дисциплине. Создание курсового проекта помогло отработать на практике такие темы, как структуры, массивы и работа с ними, вложенные циклы, создание собственных функций.
В процессе работы над проектом был сделан вывод о том, что для написания подобных программ необходимы дополнительные знания и умения в области программирования, необходимо учитывать нюансы языка и самой программы.
Библиографический список
1. Язык программирования С/ Ритчи Д, 2-е издание. : Пер. с англ. ‑ М. : Издательский дом «Вильяме», 2009.
2. Е. А. Альтман, , Методические указания к лабораторным работам «Основы языка С» / Е. А. Альтман, , Омский гос. ун-т путей сообщения. Омск, 2012.
3. СТП ОмГУПС–1.2–2005 / , , .
Приложение А
(обязательное)
Код программы
#include <stdio. h>
#include <stdlib. h>
#include <locale. h>
#include <time. h>
struct ShipPart
{
int x;
int y;
int alive;
};
void PrintArray(int arr[12][12], struct ShipPart arr2[10][4]); // распечатка массива
void ReadInt(int *dest, int min, int max); // прочитать целое, >= min и <= max
void PlacePlayerShips(int Deck[12][12], struct ShipPart ships[10][4]); // поставить корабли игрока
void ClearArray(int arr[12][12]); // очистить поле
void PlaceShips(int Deck[12][12], struct ShipPart ships[10][4]); // поставить корабль
int CheckCell(int Deck[12][12], int x, int y); // проверка на пересечение с другим кораблем.
void PrintDeck(int Deck[12][12]); // печать доски
void PlaceEnemyShips(int Deck[12][12], struct ShipPart ships[10][4]); // установка кораблей компьютера
void EnemyTurn(int Pldeck[12][12], struct ShipPart plships[10][4], int *alg, int *turn, int points[4]); // ход компьютера
void PlayerTurn(int PlDeck[12][12], int PlShotDeck[12][12], struct ShipPart enships[10][4], int endeck[12][12]); // ход игрока
void ChangeCells(int Deck[12][12], int x, int y); // ищем полностью убитые корабли и обрамляем их
int CheckAliveShips(struct ShipPart ships[10][4]); // считаем, сколько частей кораблей уничтожено (используется для определения победы)
void CheckShips(int Deck[12][12], struct ShipPart ships[10][4]); // функция зануления вокруг убитого корабля
int main()
{
srand(time(0));
setlocale(0, "RUS");
1 – Текст программы, лист 1
const int decksize = 12;
int Playerdeck[12][12]; // доска игрока
int Playershotdeck[12][12]; // доска кораблей соперника, которую видит игрок, по ней будем стрелять
int Enemydeck[12][12]; // доска соперника
struct ShipPart Playerships[10][4]; // корабли игрока
struct ShipPart Enemyships[10][4]; // корабли компьютера
int Turn; // чей ход
int i, j; // счетчики
int Enemyalg; // для хода соперника
int Enempypoints[4];
Turn = 0;
Enemyalg = 1;
// здесь элементы 0 и 1 = х и у сверху, 2 и 3 = х и у снизу.
Enempypoints[0] = 1;
Enempypoints[1] = 1;
Enempypoints[2] = 10;
Enempypoints[3] = 10;
// зануляем все
for (i = 0; i < decksize; i++)
{
for (j = 0; j < decksize; j++)
{
Playerdeck[i][j] = 0;
Playershotdeck[i][j] = 0;
Enemydeck[i][j] = 0;
}
}
for (i = 0; i < 10; i++)
{
for (j = 0; j < 4; j++)
{
Playerships[i][j].alive = -1;
Playerships[i][j].x = -1;
Playerships[i][j].y = -1;
Enemyships[i][j].alive = -1;
Enemyships[i][j].x = -1;
Enemyships[i][j].y = -1;
1, лист 2
}
}
// ставим корабли
PlacePlayerShips(Playerdeck, Playerships);
PlaceEnemyShips(Enemydeck, Enemyships);
// пошла игра
while (1)
{
// проверяем на наличие убитых кораблей и обрамляем их
CheckShips(Playerdeck, Playerships);
CheckShips(Playershotdeck, Enemyships);
CheckShips(Enemydeck, Enemyships);
// проверяем на победу компьютера
if (CheckAliveShips(Playerships) == 20)
{
printf("\n");
printf("\n");
printf("Увы! Вы проиграли! \n");
return 0;
}
// проверяем на победу игрока
if (CheckAliveShips(Enemyships) == 20)
{
printf("\n");
printf("\n");
printf("Поздравляем! Вы выиграли! \n");
return 0;
}
if (Turn == 1)
{
// ходит игрок
PlayerTurn(Playerdeck, Playershotdeck, Enemyships, Enemydeck);
Turn = 0;
printf("\n");
printf("\n");
}
1, лист 3
if (Turn == 0)
{
// ходит компьютер
printf("Ход соперника \n");
EnemyTurn(Playerdeck, Playerships, &Enemyalg, &Turn, Enempypoints);
}
}
return 0;
}
///////////////////////////////////////////////////////////////////////////////////////////////////
// читаем целое число
void ReadInt(int *dest, int min, int max)
{
int exit = 0;
int tmp;
char c;
while (exit == 0)
{
int error = scanf("%d", &tmp);
if (error == 0)
{
scanf("%c", &c);
continue;
}
if (tmp >= min && tmp <= max)
{
*dest = tmp;
exit = 1;
}
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////
void PlacePlayerShips(int Deck[12][12], struct ShipPart ships[10][4])
{
int key;
int type;
int x;
int y;
1, лист 4
x = -1;
y = -1;
key = -1;
int exit = 0;
int i;
int ships_placed;
ships_placed = 0;
printf("Добро пожаловать в игру <<Морской Бой>>! \n");
printf("\n");
while (exit == 0)
{
printf("Меню \n");
printf("1 - установить корабли \n");
printf("2 - посмотреть расположение установленных кораблей \n");
printf("3 - убрать все корабли и расставить заново \n");
printf("4 - расставить корабли автоматически \n");
printf("5 - начать игру \n");
// printf("6 - debug \n");
printf("\n");
if (key == 1)
{
ClearArray(Deck);
PlaceShips(Deck, ships);
ships_placed = 1;
}
if (key == 2)
{
PrintDeck(Deck);
}
if (key == 3) // очищаем доску и возвращаем количество кораблей
{
ClearArray(Deck);
ships_placed = 0;
}
1, лист 5
if (key == 4) // случайная расстановка
{
printf("Корабли расставлены. Можете начинать игру! \n");
ClearArray(Deck);
PlaceEnemyShips(Deck, ships);
ships_placed = 1;
}
if (key == 5) // выход
{
if (ships_placed == 1)
{
return;
}
else
{
printf("Игра не может быть начата, пока Вы не расставите корабли \n");
}
}
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////
// очистка поля
void ClearArray(int arr[12][12])
{
int i, j;
for (i = 0; i < 12; i++)
{
for (j = 0; j < 12; j++)
{
arr[i][j] = 0;
}
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////
void PlaceShips(int Deck[12][12], struct ShipPart ships[10][4])
{
1, лист 6
int type;
int exit;
int i, j;
int x, y;
int dir;
int collision;
type = 4;
exit = 0;
collision = 0;
for (i = 0; i < 10; i++)
{
// проверяем, какой корабль будем ставить
if (i >= 1 && i <= 2)
{
type = 3;
}
if (i >= 3 && i <= 5)
{
type = 2;
}
if (i >= 6)
{
type = 1;
}
exit = 0;
PrintDeck(Deck);
// ставим корабль
while (exit == 0)
{
collision = 0;
printf("Размер устанавливаемого корабля = %d \n", type);
printf("Выберите положение корабля (из какой точки будет расти) (введите 2 числа от 1 до 10; столбик-строчка) \n");
ReadInt(&x, 1, 10);
ReadInt(&y, 1, 10);
printf("\n");
1, лист 7
// не спрашивает положение для однопалубных
if (type!= 1)
{
printf("Выберите направление корабля (1 - вверх, 2 - вниз, 3 - влево, 4 - вправо) \n");
ReadInt(&dir, 1, 4);
printf("\n");
}
else
{
dir = 1;
}
//
if (dir == 1)
{
if (y - (type - 1) < 1) // если вышли за доску
{
printf("Установка корабля невозможна: выход за границу поля! \n");
continue;
}
else
{
// если не вышли за доску - проверяем, чтобы наш корабль не пересекался ни с каким другим и не стоял слишком близко
for (j = 0; j < type; j++)
{
int k = y - j;
if (CheckCell(Deck, x, k) == 1)
{
collision = 1;
break;
}
}
}
if (collision == 0)
{
// если установка возможна
for (j = 0; j < type; j++) // ставим корабль
{
Deck[y - j][x] = 100;
ships[i][j].x = x;
1, лист 8
ships[i][j].y = y - j;
ships[i][j].alive = 1;
exit = 1;
}
}
else
{
printf("Установка корабля невозможна: пересечение с другим кораблем! \n");
continue;
}
} // dir == 1
if (dir == 2)
{
if (y + (type - 1) > 10)
{
printf("Установка корабля невозможна: выход за границу поля! \n");
continue;
}
else
{
for (j = 0; j < type; j++)
{
int k = y + j;
if (CheckCell(Deck, x, k) == 1)
{
collision = 1;
break;
}
}
}
if (collision == 0)
{
for (j = 0; j < type; j++)
{
Deck[y + j][x] = 100;
ships[i][j].x = x;
ships[i][j].y = y + j;
ships[i][j].alive = 1;
1, лист 9
exit = 1;
}
}
else
{
printf("Установка корабля невозможна: пересечение с другим кораблем! \n");
continue;
}
} // dir == 2
if (dir == 3)
{
if (x - (type - 1) < 1)
{
printf("Установка корабля невозможна: выход за границу поля! \n");
continue;
}
else
{
for (j = 0; j < type; j++)
{
int k = x - j;
if (CheckCell(Deck, k, y) == 1)
{
collision = 1;
break;
}
}
}
if (collision == 0)
{
for (j = 0; j < type; j++)
{
Deck[y][x - j] = 100;
ships[i][j].x = x - j;
ships[i][j].y = y;
ships[i][j].alive = 1;
exit = 1;
}
}
1, лист 10
else
{
printf("Установка корабля невозможна: пересечение с другим кораблем! \n");
continue;
}
} // dir == 3
if (dir == 4)
{
if (x + (type - 1) > 10)
{
printf("Установка корабля невозможна: выход за границу поля! \n");
continue;
}
else
{
for (j = 0; j < type; j++)
{
int k = x + j;
if (CheckCell(Deck, k, y) == 1)
{
collision = 1;
break;
}
}
}
if (collision == 0)
{
for (j = 0; j < type; j++)
{
Deck[y][x + j] = 100;
ships[i][j].x = x + j;
ships[i][j].y = y;
ships[i][j].alive = 1;
exit = 1;
}
}
else
{
1, лист 11
printf("Установка корабля невозможна: пересечение с другим кораблем! \n");
continue;
}
} // dir == 4
} // while
} // for
}
// проверка клетки на пересечение с другим кораблем: 1 - пересеклись, 0 - нет
int CheckCell(int Deck[12][12], int x, int y)
{
if (Deck[y][x] == 100)
{
return 1;
}
if (Deck[y - 1][x] == 100)
{
return 1;
}
if (Deck[y - 1][x + 1] == 100)
{
return 1;
}
if (Deck[y][x + 1] == 100)
{
return 1;
}
if (Deck[y + 1][x + 1] == 100)
{
return 1;
}
if (Deck[y + 1][x] == 100)
{
return 1;
}
1, лист 12
if (Deck[y + 1][x - 1] == 100)
{
return 1;
}
if (Deck[y][x - 1] == 100)
{
return 1;
}
if (Deck[y - 1][x - 1] == 100)
{
return 1;
}
return 0;
}
///////////////////////////////////////////////////////////////////////////////////////////////////
void PrintDeck(int Deck[12][12])
{
int i, j;
for (i = 0; i <= 10; i++)
{
Deck[i][0] = i;
Deck[0][i] = i;
}
for (i = 0; i <= 10; i++)
{
for (j = 0; j <= 10; j++)
{
if (i == 0 || j == 0)
{
if (Deck[i][j] < 10)
{
printf("%d ", Deck[i][j]);
}
else
{
printf("%d ", Deck[i][j]);
}
}
else if (Deck[i][j] == 0)
1, лист 13
{
printf("- ");
}
else if (Deck[i][j] == 100)
{
printf("# ");
}
else if (Deck[i][j] == 300)
{
printf("X ");
}
else if (Deck[i][j] == 200)
{
printf("o ");
}
}
printf("\n");
}
printf("\n");
printf("\n");
}
// установка кораблей для компьютера работает так же, как и для игрока, только стартовые координаты и направление берется случайным образом.
void PlaceEnemyShips(int Deck[12][12], struct ShipPart ships[10][4])
{
int type;
int exit;
int i, j;
int x, y;
int dir;
int collision;
type = 4;
exit = 0;
collision = 0;
for (i = 0; i < 10; i++)
{
if (i >= 1 && i <= 2)
{
type = 3;
1, лист 14
}
if (i >= 3 && i <= 5)
{
type = 2;
}
if (i >= 6)
{
type = 1;
}
exit = 0;
while (exit == 0)
{
collision = 0;
x = rand() % 10 + 1;
y = rand() % 10 + 1;
dir = rand() % 4 + 1;
if (dir == 1)
{
if (y - (type - 1) < 1) // если вышли за доску
{
continue;
}
else
{
// если не вышли за доску - проверяем, чтобы наш корабль не пересекался ни с каким другим и не стоял слишком близко
for (j = 0; j < type; j++)
{
int k = y - j;
if (CheckCell(Deck, x, k) == 1)
{
collision = 1;
break;
}
}
}
if (collision == 0)
1, лист 15
{
// если установка возможна
for (j = 0; j < type; j++) // ставим корабль
{
Deck[y - j][x] = 100;
ships[i][j].x = x;
ships[i][j].y = y - j;
ships[i][j].alive = 1;
exit = 1;
}
}
else
{
continue;
}
} // dir == 1
if (dir == 2)
{
if (y + (type - 1) > 10)
{
continue;
}
else
{
for (j = 0; j < type; j++)
{
int k = y + j;
if (CheckCell(Deck, x, k) == 1)
{
collision = 1;
break;
}
}
}
if (collision == 0)
{
for (j = 0; j < type; j++)
{
Deck[y + j][x] = 100;
ships[i][j].x = x;
1, лист 16
ships[i][j].y = y + j;
ships[i][j].alive = 1;
exit = 1;
}
}
else
{
continue;
}
} // dir == 2
if (dir == 3)
{
if (x - (type - 1) < 1)
{
continue;
}
else
{
for (j = 0; j < type; j++)
{
int k = x - j;
if (CheckCell(Deck, k, y) == 1)
{
collision = 1;
break;
}
}
}
if (collision == 0)
{
for (j = 0; j < type; j++)
{
Deck[y][x - j] = 100;
ships[i][j].x = x - j;
ships[i][j].y = y;
ships[i][j].alive = 1;
exit = 1;
}
}
else
{
1, лист 17
continue;
}
} // dir == 3
if (dir == 4)
{
if (x + (type - 1) > 10)
{
continue;
}
else
{
for (j = 0; j < type; j++)
{
int k = x + j;
if (CheckCell(Deck, k, y) == 1)
{
collision = 1;
break;
}
}
}
if (collision == 0)
{
for (j = 0; j < type; j++)
{
Deck[y][x + j] = 100;
ships[i][j].x = x + j;
ships[i][j].y = y;
ships[i][j].alive = 1;
exit = 1;
}
}
else
{
continue;
}
} // dir == 4
} // while
} // for
}
1, лист 18
void EnemyTurn(int Pldeck[12][12], struct ShipPart plships[10][4], int *alg, int *turn, int points[4])
{
if (CheckAliveShips(plships) == 20)
{
return;
}
int x, y, i, j;
if (*alg == 1) // идем по верху
{
x = points[0];
y = points[1];
i = 0;
j = 1;
*alg = 2;
}
else
{
// идем по низу
x = points[2];
y = points[3];
i = 2;
j = 3;
*alg = 1;
}
// стреляем
if (Pldeck[y][x] == 0) // пустая
{
printf("Компьютер выстрелил в точку %i, %i. К счастью, он не задел ни один Ваш корабль. \n", x, y);
Pldeck[y][x] = 200;
*turn = 1; // отдали ход
}
if (Pldeck[y][x] == 100)
{
printf("По Вашему кораблю попали в точке %i, %i!!! \n", x, y);
Pldeck[y][x] = 300;
////////////////////
1, лист 19
// Ищем часть корабля в массиве частей и убиваем ее
int k, r;
int exit = 0;
for (k = 0; k < 10; k++)
{
for (r = 0; r < 4; r++)
{
if (plships[k][r].x == x && plships[k][r].y == y)
{
plships[k][r].alive = 0;
exit = 1;
}
if (exit == 1)
{
break;
}
} // for r
if (exit == 1)
{
break;
}
} // for k
// конец нового куска
////////////////////
*turn = 0; // продолжаем ходить
}
// делаем шаг по доске
if (i == 0)
{
// если шли по верху
points[i] += 2;
if (points[i] > 10)
{
points[i] -= 10;
points[j] += 1;
}
return;
}
1, лист 20
if (i == 2)
{
points[i] -= 2;
if (points[i] < 1)
{
points[i] += 10;
points[j] -= 1;
}
return;
}
}
void PlayerTurn(int PlDeck[12][12], int PlShotDeck[12][12], struct ShipPart enships[10][4], int endeck[12][12])
{
int x, y;
while (1)
{
CheckShips(PlShotDeck, enships);
CheckShips(endeck, enships);
if (CheckAliveShips(enships) == 20)
{
return;
}
printf("Ваша доска: \n");
PrintDeck(PlDeck);
printf("Доска для стрельбы: \n");
PrintDeck(PlShotDeck);
printf("Введите координаты точки выстрела (два целых, от 1 до 10; столбик-строчка) \n");
ReadInt(&x, 1, 10);
ReadInt(&y, 1, 10);
if (endeck[y][x] == 100) // если корабль
{
// подбили
PlShotDeck[y][x] = 300;
endeck[y][x] = 300;
1, лист 21
// новый кусок
int k, r;
int exit = 0;
for (k = 0; k < 10; k++)
{
for (r = 0; r < 4; r++)
{
if (enships[k][r].x == x && enships[k][r].y == y)
{
enships[k][r].alive = 0;
exit = 1;
}
if (exit == 1)
{
break;
}
} // for r
if (exit == 1)
{
break;
}
} // for k
// конец нового куска
////////////////////
} // if
if (endeck[y][x] == 0) // если пустая
{
// просто пометили и вышли
PlShotDeck[y][x] = 200;
endeck[y][x] = 200;
return;
}
if (PlShotDeck[y][x] == 200)
{
printf("Вы уже стреляли в эту точку! \n");
continue;
}
}
}
1, лист 22
// проверяет корабли на целостность. если нашелся полностью уничтоженный корабль - обрамляет его отмеченными клетками.
void CheckShips(int Deck[12][12], struct ShipPart ships[10][4])
{
int i, j;
int type;
type = 4;
for (i = 0; i < 10; i++)
{
int k;
k = 0;
// выбираем тип проверяемого корабля
if (i >= 1 && i <= 2)
{
type = 3;
}
if (i >= 3 && i <= 5)
{
type = 2;
}
if (i >= 6)
{
type = 1;
}
// считаем количество сломанных частей
for (j = 0; j < type; j++)
{
if (ships[i][j].alive == 0)
{
k++;
}
}
// если количество частей равно размеру корабля
if (k == type)
{
// обрамляем корабль
1, лист 23
for (j = 0; j < type; j++)
{
ChangeCells(Deck, ships[i][j].x, ships[i][j].y);
}
}
}
}
// возвращает число мертвых частей кораблей
int CheckAliveShips(struct ShipPart ships[10][4])
{
int result, i, j;
int type;
type = 4;
result = 0;
for (i = 0; i < 10; i++)
{
if (i >= 1 && i <= 2)
{
type = 3;
}
if (i >= 3 && i <= 5)
{
type = 2;
}
if (i >= 6)
{
type = 1;
}
for (j = 0; j < type; j++)
{
if (ships[i][j].alive == 0)
{
result++;
}
}
}
return result;
}
1, лист 24
// обрамление корабля
void ChangeCells(int Deck[12][12], int x, int y)
{
Deck[y - 1][x - 1] = 200;
Deck[y - 1][x + 1] = 200;
Deck[y + 1][x + 1] = 200;
Deck[y + 1][x - 1] = 200;
if (Deck[y][x - 1] != 300)
{
Deck[y][x - 1] = 200;
}
if (Deck[y][x + 1] != 300)
{
Deck[y][x + 1] = 200;
}
if (Deck[y - 1][x] != 300)
{
Deck[y - 1][x] = 200;
}
if (Deck[y + 1][x] != 300)
{
Deck[y + 1][x] = 200;
}
}
1, лист 25








