Автор работы: Пользователь скрыл имя, 15 Мая 2013 в 13:46, курсовая работа
Цель данной курсовой работы: разработка программы на языке C++, реализую-щей игру «Морской бой» человека с компьютером.
Задачи курсовой работы:
•Изучение принципов объектно-ориентированного программирования
•Получение практических навыков в работе с классами, наследовани-ем и функциями
•Создание функционирующего программного обеспечения
Введение 3
Глава I. Модель программы 4
Глава II. Программная реализация решения задачи 5
Архитектура программы 5
Тестирование 6
План работы 6
Глава III. Листинг программы 7
Заключение 17
Список использованной литературы 18
Приложение 1. Руководство пользователя 19
Приложение 2. Руководство программиста 20
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
Федеральное государственное
бюджетное образовательное
высшего профессионального образования
«Сибирский государственный аэрокосмический университет
имени академика М. Ф. Решетнёва»
(СибГАУ)
Кафедра: Информатики и вычислительной техники
КУРСОВАЯ РАБОТА
по дисциплине: «Программирование на ЯВУ»
Выполнили:
студенты группы
КТ-91
Гришаева О.Е.
Коханова Г.Р.
Шляхтенкова Л.А.
Проверил:
ассистент кафедры ИВТ
Орлова А.С.
Красноярск, 2012
Оглавление
Введение 3
Глава I. Модель программы 4
Глава II. Программная реализация решения задачи 5
Архитектура программы 5
Тестирование 6
План работы 6
Глава III. Листинг программы 7
Заключение 17
Список использованной литературы 18
Приложение 1. Руководство пользователя 19
Приложение 2. Руководство программиста 20
Цель данной курсовой работы: разработка программы на языке C++, реализующей игру «Морской бой» человека с компьютером.
Задачи курсовой работы:
Выбор игры обусловлен ее популярностью и широкой известностью. Практически каждый в тот или иной период своей жизни играл в эту игру. В последние годы в связи с появлением компьютеров и новых обучающих и развивающих программ вновь возрос интерес к ней. Но мало кто знает о том, что эта игра имеет серьезное научное и практическое приложение, и для ее анализа могут быть использованы современные компьютерные методы.
Остановимся на некоторых основных правилах классического варианта игры. Первый игрок, игрок А, расставляет корабли на квадратном игровом поле из n клеток (обычно это поле 10×10 клеток). Корабли делятся на классы: одноклеточные, двухклеточные, трехклеточные и четырехклеточные. Игрок В на своем поле расставляет свои корабли. Заметим, что корабли не должны касаться друг друга. Игра состоит в том, что игроки по очереди называют координаты клеток, в которых, как они предполагают, расположены корабли противника, то есть как бы производят выстрел по выбранной клетке. О попадании или промахе игроку сообщается после выстрела. Игра продолжается до тех пор, пока у одного из игроков не будут уничтожены все корабли.
Для управления всеми действиями в программе необходимо создать соответствующее ей меню.
Главным «помощником» в работе послужил язык программирования высокого уровня С++, который без всяких трудностей и препятствий позволил реализовать все поставленные перед нами задачи целиком и полностью.
Рисунок 1 - Главное меню приложения
При запуске программы появляется приветствие и главное меню. игроку предлагается несколько действий на выбор:
Рисунок 2 - Руководство пользователя
Выбрав начало игры, игрок видит поле 10*10 клеток, обозначенных цифрами (от 0 до 9) по горизонтали и вертикали. Кроме того, появляется пустое поле, на котором будут отображаться результаты выстрелов игрока на поле противника. Далее компьютер произвольно расставляет корабли на игровом поле так, чтобы они не касались друг друга. Корабли делятся на классы: одноклеточные (4 штуки), двухклеточные (3 штуки), трехклеточные (2 штуки) и четырехклеточные (1 штука).
Рисунок 3 - Игровое поле
По завершении расстановки начинается игра. Игрок производит выстрел. Для этого он последовательно вводит горизонтальную и вертикальную координаты точки выстрела (цифра от 0 до 9, после чего нажимается "enter"). При попадании в пустую клетку, она становится отличной от остальных (появляется знак "+"). При попадании в корабль противника клетка меняет символ ("Х"). При "убийстве" последнего корабля противника появляется сообщение об окончании игры.
Рисунок 4 - Тестирование игры
В программе используется базовый класс "igrok" и два производных класса - "igrok chelovek" и "igrok computer". В классе "igrok" содержатся данные о конфигурации кораблей, их положении на игровом поле и о ходах противника (в производном классе "igrok chelovek" хранится информация о ходах компьютера и наоборот).
При работе используются текстовые файлы формата txt, которые позволяют хранить и использовать большие объемы текстовой информации.
Текущая программа была протестирована на контрольной группе из пяти человек. Каждым было проведено по 3 игры, в ходе которых не было выявлено сбоев работы программы.
Следует заметить, что из-за большого объема работ, которые необходимо было выполнить в сжатые сроки, и изучаемой информации, разработчиками не были прописаны в коде программы некоторые функции. Не удалось реализовать сохранение конфигурации текущей игры и, соответственно, восстановление неоконченной игры из файла и учет достижений игроков.
Ниже представлен календарный план выполнения работ.
22.10 – начало работы;
25.10 – утверждение техзадания;
5.11 – сдача техзадания;
19.11 – разработка кода приложения;
22.11 – классы и функции;
3.12 – функционирование приложения;
17.12 – сдача работы.
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include<conio.h>
#include<string.h>
#include<stdio.h>
#include <ctime>
#include <clocale>
using namespace std;
// перечисление хранит направление: горизонтальное и вертикальное
enum direction{h,v};
class igrok
{
public:
bool poragenie; // переменная хранит информацию о поражении
int vistrel[10][10]; // массив выстрелов объекта
int korabl[10][10]; // массив кораблей объекта
igrok (): poragenie(0) {} // конструктор
void vid();
void rasstanovka(int tip);
int mesto(int s, int c, direction d, int paluba);
void povorot(igrok&, int character, int digit);
void povorot(igrok&);
};
// карта размером в 13 строк и 35 столбцов
const int s = 13, c = 35;
char map[s][c] = {
" 0123456789 0123456789 ",
" +----------+ +----------+",
"0| | 0| |",
"1| | 1| |",
"2| | 2| |",
"3| | 3| |",
"4| | 4| |",
"5| | 5| |",
"6| | 6| |",
"7| | 7| |",
"8| | 8| |",
"9| | 9| |",
" +----------+ +----------+" };
igrok chelovek;
igrok computer;
void map_init(char map[s][c]);
void show (char map[s][c]);
int input(char&, char&);
void test();
int check_ending();
char numbers[10] = { '0','1','2','3','4','5','6','
int main()
{
setlocale(LC_CTYPE, "Russian");
char o, O;
cout<<"\n МОРСКОЙ БОЙ \n\n";
cout<<"ДОБРО ПОЖАЛОВАТЬ В ГЛАВНОЕ МЕНЮ \n";
cout<<"\nдля ознакомления с руководством пользователя нажмите (1) \n";
cout<<"\nдля начала игры нажмите (2) \n";
cout<<"\nдля вывода статистики нажмите (3) \n";
cout<<"\nдля выхода из игры (4) \n\n";
cin>>o;
if (o == '1')
{
system("cls"); // очистка экрана
ifstream ifs("rukovodstvo.txt");
char str[25][50];//создание двумерного символьного массива str
int i,j,inword=0,beg,dl_str,dl_
for(i=0;i<25;i++)//цикл с предусловием от 0 до 25 для считывания строк из файла
{//начало тела цикла
ifs.get(str[i],50);//
ifs.get();// считывание строки из файла и записывание в i строку массива str
}//конец тела цикла
cout<<"\nРУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ:\n\n";
for(i=0;i<25;i++)//цикл с предусловием от 0 до 25 для вывода массива str
cout<<str[i]<<endl;//вывод на экран i строки массива str и переход на //следующую строку
for(i=0;i<25;i++)//цикл с предусловием по номерам строк от 0 до 25
{//начало тела цикла
dl_str=strlen(str[i]);//
for(j=0;j<dl_str;j++)//цикл с предусловием по i-ой строке по символам от 0 //до dl_str
{//начало тела цикла
if(*(str[i]+j)==' '||*(str[i]+j)=='\0'||*(str[i]
{//то
if(inword==1)//проверяем, находимся ли мы в слове
{//если да, то
dl_word=j-beg;//переменной dl_word присваиваем j-//beg(длина слова)
mas[k]=dl_word;//записываем значение dl_word в //массив mas
k++;//увеличиваем переменную k на единицу
inword=0;//присваиваем переменной inword //0(выходим из слова)
}//конец блока операторов
}else //если текущий элемент не равен символам в одинарных //кавычках
if (inword==0)//проверяем, находимся ли мы вне слова
{//если да, то
inword=1;//присваиваем переменной inword //1(входим в слово)
beg=j;//переменной beg(начало слова) присваиваем //значение j
}//конец блока операторов
}//конец тела цикла
}//конец тела цикла
cout<<"Чтобы начать игру нажмите (1) \n\n";
cout<<"Чтобы выйти из игры нажмите (2) \n\n";
cin>>O;
if (O == '1')
{
int message = 0; // переменная хранит коды сообщений
// установка начального значения генератора случайных чисел
srand( static_cast<unsigned int>(time(NULL)) );
chelovek.vid(); // инициализация массивов человека
computer.vid(); // инициализация массивов компьютера
map_init(map); // добавление в массив map информации из human.korabl
/*
message может содержать три значения:
0 - всё нормально
1 - пользователь нажал неверную клавишу
2 - кто-то победил, конец игры
*/
while (message != 2)
{
int user_input = 0;
system("cls"); // очистка экрана
show(map); // вывод на экран map
if (message == 1) // код сообщения 1 - введено неверное значение
cout << "вы ввели недопустимое значение координат!\n";
message = 0; // обнуление message
//test(); // функция для тестирования массивов korabl и vistrel
char character, digit;
user_input = input(character, digit); // переменные передаются по ссылке
if (user_input == 1)
{
message = 1;
continue;
}
chelovek.povorot(computer,
computer.povorot(chelovek);
message = check_ending();
}
_getch();
}
if (O == '2')
{
system("cls"); // очистка экрана
cout<<"\n ДО НОВЫХ ВСТРЕЧ!!\n";
return 0;
}
}
if (o == '2')
{
int message = 0; // переменная хранит коды сообщений
// установка начального значения генератора случайных чисел
srand( static_cast<unsigned int>(time(NULL)) );
chelovek.vid(); // инициализация массивов человека
computer.vid(); // инициализация массивов компьютера
map_init(map); // добавление в массив map информации из human.korabl
/*
message может содержать три значения:
0 - всё нормально
1 - пользователь нажал неверную клавишу
2 - кто-то победил, конец игры
*/
while (message != 2)
{
int user_input = 0;
system("cls"); // очистка экрана
show(map); // вывод на экран map
if (message == 1) // код сообщения 1 - введено неверное значение
cout << "вы ввели недопустимое значение координат!\n";
message = 0; // обнуление message
//test(); // функция для тестирования массивов korabl и vistrel
char character, digit;
user_input = input(character, digit); // переменные передаются по ссылке
if (user_input == 1)
{
message = 1;
continue;
}
chelovek.povorot(computer,
computer.povorot(chelovek);
message = check_ending();
}
_getch();
}
if (o == '4')
{
system("cls"); // очистка экрана
cout<<"\n ДО НОВЫХ ВСТРЕЧ!!\n";
return 0;
}
} // конец while
/*
Добавление в массив map информации из chelovek.korabl.
*/
void map_init(char map[s][c])
{
for (int i=0;i < 10; i++)
{
for (int j=0; j < 10; j++)
{
if (chelovek.korabl[i][j] == 2)
map[i+2][j+2] = '#';
}
}
}
/*
Сначала в массив maps заносится информация о выстрелах сделанных
противниками.
Затем происходит вывод на экран map. при этом используются
массивы korabl и vistrel класса igrok.
*/
void show(char map[s][c])
{
for (int i=0; i<10; i++)
{
for (int j=0; j<10; j++)
{
/* Заполняем поле игрока */
if (computer.vistrel[i][j] == 1 && chelovek.korabl[i][j] == 3)
{
map[i+2][j+2] = 'Х';
}
else if (computer.vistrel[i][j] == 1 && chelovek.korabl[i][j] != 3)
{
map[i+2][j+2] = '+';
}
/* Заполняем поле компьютера */
if (computer.korabl[i][j] == 3 && chelovek.vistrel[i][j] == 1)
{
map[i+2][j+2+21] = 'Х';
}
else if (computer.korabl[i][j] != 3 && chelovek.vistrel[i][j] == 1)
{
map[i+2][j+2+21] = '+';
}
} // конец for j
} //конец for i
// Посимвольный вывод массива map на экран
for (int i = 0; i < s; i++)
{
for (int j = 0; j < c; j++)
{
cout << map[i][j];
}
cout << "\n";
}
}
// ввод координат
int input(char& character, char& digit)
{ cout <<"\n ВВЕДИТЕ КООРДИНАТУ ВАШЕГО ХОДА ";
Информация о работе Создание компьютерной игры "Морской бой"