Создание компьютерной игры "Морской бой"

Автор работы: Пользователь скрыл имя, 15 Мая 2013 в 13:46, курсовая работа

Описание работы

Цель данной курсовой работы: разработка программы на языке C++, реализую-щей игру «Морской бой» человека с компьютером.
Задачи курсовой работы:
•Изучение принципов объектно-ориентированного программирования
•Получение практических навыков в работе с классами, наследовани-ем и функциями
•Создание функционирующего программного обеспечения

Содержание работы

Введение 3
Глава I. Модель программы 4
Глава II. Программная реализация решения задачи 5
Архитектура программы 5
Тестирование 6
План работы 6
Глава III. Листинг программы 7
Заключение 17
Список использованной литературы 18
Приложение 1. Руководство пользователя 19
Приложение 2. Руководство программиста 20

Файлы: 1 файл

kursovoy.docx

— 301.20 Кб (Скачать файл)

  cout << "\n(координата должна быть цифрой от 0 до 9! после чего нажмите enter)\n";

    cout <<"\nгоризонталь: ";

// ввод "горизонтальной" координаты

   cin >> character;

int match = 0;

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

if (numbers[i] == character)

{

match = 1;

character = i;

}

if (match == 0) 

return 1;

  //  cout << '+';

     cout <<"\nвертикаль: ";

match = 0;

// ввод "вертикальной" координаты

    cin >> digit ;

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

if (numbers[i] == digit)

{

match = 1;

digit = i;

}

if (match == 0)

return 1;

return 0; 

}

 

void test()

{

cout << endl;

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

{

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

{

cout << chelovek.vistrel[i][j];

}

cout << "  ";

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

{

cout << computer.vistrel[i][j];

}

cout << endl;

}

cout << endl;

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

{

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

{

cout << chelovek.korabl[i][j];

}

cout << "  ";

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

{

cout << computer.korabl[i][j];

}

cout << endl;

}

}

 

// В функции устанавливаются  и проверяются флаги defeat_flag игроков.

int check_ending()

{

int flag = 0;

int chelovek_flag = 0;

int computer_flag = 0;

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

{

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

{

if (chelovek.korabl[i][j] == 2)

chelovek_flag = 1; // у пользователя ещё остались неповреждённые корабли

if (computer.korabl[i][j] == 2)

computer_flag = 1; // у компьютера ещё остались неповреждённые корабли

}

}

if (chelovek_flag == 0)

flag = 2;

if (computer_flag == 0)

flag = 1;

if (flag == 1)

{

cout << "Победил игрок!\n";

return 2;

}

if (flag == 2)

{

cout << "Победил компьютер!\n";

return 2;

}

}

 

void igrok::vid()

{

// инициализация массивов vistrel и korabl

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

{

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

{

korabl[i][j] = 1;

vistrel[i][j] = 0;

}

}

 

// Расстановка кораблей

rasstanovka(4);

rasstanovka(3);

rasstanovka(3);

rasstanovka(2);

rasstanovka(2);

rasstanovka(2);

rasstanovka(1);

rasstanovka(1);

rasstanovka(1);

rasstanovka(1);

}

 

void igrok::rasstanovka (int paluba)

{

int my = paluba - 1;

bool isset = 0;

int s,c;

direction d;

while (isset == 0) // проверка удалось ли разместить корабль

{

d = static_cast<direction>(rand()%2); // выбираем направление

 

s = rand()%10; // случайным образом определяются координаты

c = rand()%10;

int e = 0;

switch (d)

{

case h:

if (korabl[s][c+paluba-1] == 1)

{

e = mesto(s,c,d,paluba); // проверка смежных клеток

if (e == 0)

{

for (int i = 0; i < paluba; i++)

{

korabl[s][c+i] = 2; // размещаем корабль в массиве korabl

}

isset = 1;

}

}

break;

case v:

if (korabl[s+paluba-1][c] == 1)

{

e = mesto(s,c,d,paluba);

if (e == 0)

{

for (int i = 0; i < paluba; i++)

{

korabl[s+i][c] = 2;

}

isset = 1;

}

}

break;

} // конец switch

} // конец while

} // конец set4()

 

/*

Функция проверяет, можно  ли в данной координате [s][c]

разместить корабль с палубами paluba.

В комментариях показано какие клетки проверяются при установке

четырёхпалубного корабля в [4][3]

*/

int igrok::mesto(int s, int c, direction d, int paluba)

{

int e = 0;

switch (d)

{

case h:

/*

      проверка для горизонтально расположенного корабля

*/

if (korabl[s-1][c-1] == 2)

{

e = 1;

/*

проверка клетки по диагонали от корабля (верхний левый квадрат)     

*/

}

if (korabl[s-1][c+paluba] == 2)

{

e = 1;

/*

проверка клетки по диагонали от корабля (верхний правый квадрат)   

*/

}

if (korabl[s+1][c-1] == 2)

{

e = 1;

/*

проверка клетки по диагонали от корабля (нижний левый квадрат)

*/

}

if (korabl[s+1][c+paluba] == 2)

{

e = 1;

/*

проверка клетки по диагонали от корабля (нижний правый квадрат)

*/

}

 

if (korabl[s][c-1] == 2)

{

e = 1;

/*

проверка клетки слева от корабля    

*/

}

if (korabl[s][c+paluba] == 2)

{

e = 1;

/*

проверка клетки справа от корабля    

*/

}

for (int i = 0; i < paluba; i++)

{

if (korabl[s-1][c+i] == 2)

{

e = 1;

/*

проверка клеток над кораблем    

*/

}

if (korabl[s+1][c+i] == 2)

{

e = 1;

/*

проверка клеток под кораблем  

*/

}

}

break;

case v:

         /*

      проверка  для вертикально расположенного  корабля

*/

if (korabl[s-1][c-1] == 2)

{

e = 1;

/*

проверка клетки по диагонали от корабля (верхний левый квадрат)    

*/

}

if (korabl[s-1][c+1] == 2)

{

e = 1;

/*

проверка клетки по диагонали от корабля (верхний правый квадрат)  

*/

}

if (korabl[s+paluba][c-1] == 2)

{

e = 1;

/*

проверка клетки по диагонали от корабля (нижний левый квадрат)    

*/

}

if (korabl[s+paluba][c+1] == 2)

{

e = 1;

/*

проверка клетки по диагонали от корабля (нижний правый квадрат)

*/

}

 

if (korabl[s-1][c] == 2)

{

e = 1;

/*

проверка клетки над кораблем    

*/

}

if (korabl[s+paluba][c] == 2)

{

e = 1;

/*

проверка клетки под корабем    

*/

}

for (int i = 0; i < paluba; i++)

{

if (korabl[s+i][c-1] == 2)

{

e = 1;

/*

проверка клеток слева от корабля    

*/

}

if (korabl[s+i][c+1] == 2)

{

e = 1;

/*

проверка клеток справа от корабля    

*/

}

}

break;

}

return e;

}

 

// Ход компьютера: вносим  изменения в массивы human.korabl и computer.hits

void igrok::povorot(igrok& enemy)

{

//srand(static_cast<unsigned int>(time(NULL)));

bool flag = 0;

while (flag == 0)

{

int character = rand()%10; // Координаты по которым будет стрелять компьютер

int digit = rand()%10;     // выбираются случайно

if (vistrel[character][digit] != 1) // проверка: выбирал ли уже компьютер эти координаты

{

vistrel[character][digit] = 1;

flag = 1;

if (enemy.korabl[character][digit] == 2)

{

enemy.korabl[character][digit] = 3;

}

}

}

}

// Ход игрока: вносим изменения в массивы computer.korabl и human.hits

void igrok::povorot(igrok& enemy, int character, int digit)

{

vistrel[character][digit] = 1;

if (enemy.korabl[character][digit] == 2)

{

enemy.korabl[character][digit] = 3;}}

 

 

 

 

 

 

 

Заключение

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Список использованной литературы

 

  1. С/С++. Программирование на языке высокого уровня. Павловская Т.А. Санкт - Петербург «Питер» 2004 г
  2. Программирование шахмат и других логических игр. Корнилов Е. Санкт - Петербург «БВХ-Петербург» 2005 г
  3. Искусство программирования на С++. Фленов М. Санкт - Петербург «БВХ-Петербург» 2006 г
  4. [Электронный ресурс]

http://www.cyberforum.ru/csharp-net/thread164.html

 

 

 

Приложение 1. Руководство пользователя

 

При запуске игры появляется поле 10*10 клеток, обозначенных цифрами (от 0 до 9) по горизонтали и вертикали. Кроме того, появляется пустое поле, на котором будут отображаться результаты выстрелов игрока на поле противника.

Далее компьютер рандомно расставляет корабли на игровом поле так, чтобы они не касались друг друга. Корабли делятся на классы: одноклеточные (4), двухклеточные (3), трехклеточные (2) и четырехклеточные (1).

По завершении расстановки  начинается игра. Игрок производит выстрел. Для этого он последовательно вводит горизонтальную и вертикальную координаты точки выстрела (цифра от 0 до 9, после чего нажимается "enter"). При попадании в пустую клетку, она становится отличимой от остальных (появляется знак "+").

При попадании в корабль  противника клетка меняет символ ("Х").

При «убийстве» последнего корабля противника появляется сообщение об окончании игры.

 

Приложение 2. Руководство  программиста

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

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

b) При запуске программы появляется консольное приложение с вариантами действия для пользователя ("справка" или "игра"). При выборе "справка" появляется руководство пользователя (подсказка с правилами игры). При выборе "игра" появляется поле 10*10 клеток, обозначенных цифрами (от 0 до 9) по горизонтали и вертикали: 

  0 1 2 3 4 5 6 7 8 9

0                            |

1                             |

2                        |

3                         |

4                |

5                  |

6               |

7                            |

8                           |

9______________|

 

Кроме того, появляется пустое поле, на котором будут отображаться результаты выстрелов игрока на поле противника.

 

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

По завершении расстановки  начинается игра. Игрок производит выстрел. При попадании в пустую клетку сделать ее отличимой от остальных (например, поставить "-"). При попадании в корабль противника клетка меняет символ ("+").

При убийстве последнего корабля  противника появляется сообщение об окончании игры: высвечивается меню ("выйти из игры" или "новая игра").

 


Информация о работе Создание компьютерной игры "Морской бой"