Разработка игры "Морской бой"

Рассмотрение оптимального алгоритма игры в "Морской бой". Применение в программе цикла while, конструкции case и функции simply_move. Режим работы программы при вводе некорректных данных. Отображение попаданий на игровом поле. Руководство пользователя.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 18.02.2019
Размер файла 849,5 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Размещено на http://www.allbest.ru/

ФЕДЕРАЛЬНОЕ АГЕНТСТВО ЖЕЛЕЗНОДОРОЖНОГО ТРАНСПОРТА

федеральное государственное бюджетное образовательное учреждение высшего образования

“ОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ПУТЕЙ СООБЩЕНИЯ” (ОмГУПС (ОмИИТ))

Кафедра “Информационная безопасность”

Разработка игры МОРСКОЙ БОЙ

Пояснительная записка к курсовой работе

по дисциплине “Технологии и методы программирования”

Студент гр. 25с

А.К. Шмаков

Руководитель -

старший преподаватель

Н. Ю. Афоничев

Омск 2017

Задание

Написать игру “Морской бой” на языке программирования Си с учетом возможности игры как пользователя, так и компьютера.

Правила игры в “Морской бой”

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

Все перечисленные корабли должны быть размещены на квадратном поле 10 на 10 клеток, при этом корабли не могут соприкасаться ни углами, ни сторонами. Нумерация строк и столбцов начинается с 0.

Рядом рисуется вражеское поле аналогичного размера. При удачном выстреле по кораблю противника на соответствующей клетке вражеского поля ставится “*” и производится повторный выстрел, при неудачном выстреле в соответствующей клетке ставится “0”, и ход переходит к противнику.

Реферат

Курсовая работа содержит 39 страниц, 20 рисунков, 1 источник, 1 приложение.

Морской бой, корабли, игрок.

Объектом разработки является программа.

Цель работы - разработать игру “Морской бой”.

В результате работы разработана игра “Морской бой”.

Степень внедрения: для широкой аудитории пользователей.

Пояснительная записка выполнена в текстовом редакторе Microsoft Word 2013, программирование проводилось с использованием языка Си в текстовом редакторе Notepad++ и компилятором MinGW, блок-схемы выполнены в редакторе Visio 2013. Работа помещена на диск в конверт.

Содержание

  • 1. Разработка программы
  • 1.1 Оптимальный алгоритм игры в “Морской бой”
  • 1.2 Алгоритм поведения компьютера в игре “Морской бой”
  • 2. Алгоритмизация
  • 3. Тестирование
  • 3.1 Ввод некорректных данных
  • 3.2 Ввод корректных данных и отображение попаданий на игровом поле
  • 4. Руководство пользователя
  • 5. Заключение
  • Библиографический список
  • Приложение А

Введение

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

В работе будет рассматриваться написание игры “Морской бой”. Каждый знает эту игру с детства и не раз участвовал в баталиях. Теперь, когда все повзрослели, стало интересно, можно ли как-нибудь перенести идею игры на программный уровень, чтобы сыграть не с человеком, а компьютером. Это великолепный опыт в продумывании стратегии игры компьютера, а также отличный опыт в написании приложения.

1. Разработка программы

1.1 Оптимальный алгоритм игры в “Морской бой”

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

Рисунок 1.1 - Разбитое игровое поле

Существует несколько комбинаций выстрелов, при которых никак нельзя вписать четырехпалубный корабль в квадрат 4х4. Если повезло, и был подбит какой-либо корабль, то стоит его добивать. На рисунке 1.2 представлено игровое поле, на котором не может находиться целый четырехпалубный корабль.

Рисунок 1.2 - Игровое поле с прострелами

Если в процессе стрельбы, четырехпалубный корабль был найден, следует делить поле уже на квадраты 3х3. Производить выстрелы следует так, чтобы у противника не осталось в наличии целых трехпалубных кораблей.

1.2 Алгоритм поведения компьютера в игре “Морской бой”

Алгоритм работы компьютера несколько проще, так как реализовать все нюансы программы достаточно сложно. Компьютер будет производить выстрелы до тех пор, пока не будет подбита хотя бы одна палуба. На рисунке 1.3 показаны возможные дальнейшие действия компьютера.

Рисунок 1.3 - Попадание в палубу корабля на произвольной клетке поля

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

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

2. Алгоритмизация

Общая блок-схема игры “Морской бой” представлена на рисунке 2.1.

Рисунок 2.1 - Общая блок-схема игры “Морской бой”

Функции init_map() и enemy_init_map() идентичны. В данных функциях вызываются функции расстановки кораблей set() и enemy_set() соответственно. Рассмотрим работу функции set(). В нее из функции init_map() передается значение deck - количество палуб у корабля. Количество палуб может быть 4, 3, 2, 1. Так, значение deck = 4 передается в функцию set() 1 раз, а значение deck = 1 четыре. Блок-схема работы данной функции представлена на рисунке 2.2.

Рисунок 2.2 - Блок-схема работы функции set()

Рисунок 2.3 - Блок-схема работы функции set() (продолжение)

[1] : В программе используется цикл while. Условие выполнения цикла - isset == 0; После того, как переменная isset != 0, Выходим из цикла. Это означает, что корабль был успешно установлен.

[2] : В программе также используется конструкция case (switch). В общем случае генерация координат проходит одинаково для всех кораблей: генерируется случайное направление (dir), а также координаты первой палубы. Корабль можно поставить горизонтально или вертикально, а значит значение переменной dir может быть равно 0 или 1. Если dir = 0, то корабль будет стоять горизонтально, если dir = 1 - вертикально. Далее в выбранном направлении выставляются остальные палубы. Так, если корабль четырехпалубный (deck = 4), то ставится сначала первая палуба, а потом в заданном направлении корабль распространяется по игровому полю до deck - 1, то есть ставится еще дополнительно три палубы (одна из палуб уже стоит). Задача конструкции case (switch) состоит в том, чтобы правильно генерировались координаты для первой палубы корабля. Первую палубу четырехпалубного корабля нельзя поставить на клетку с координатами (8;8), так как при распространении в любом из направлений, он выйдет за пределы игрового поля. А, например, однопалубный корабль можно поставить даже на игровую клетку с координатами (9;9).

[3] : Вторая конструкция case(switch) используется уже на этапе проверки условия “Можно ли поставить корабль с данным числом палуб на данное место?” В проверке этого условия помогает функция place(), работа которой будет рассмотрена ниже. Если нельзя поставить корабль на данное место, то генерируются новые координаты. Если же удается поставить корабль, то функция завершает свою работу.

Еще одной немаловажной функцией является функция place(). Она проверяет можно ли поставить корабль в заданное место. В эту функцию передаются такие параметры, как координаты, направление, а также количество палуб корабля. Блок-схема функции представлена на рисунке 2.3.

Рисунок 2.3 - Блок-схема работы функции place()

В основе работы данной функции лежит принцип флагов: если поставить корабль можно e = 0, если нельзя - e = 1. Как уже было сказано, в данную функцию передаются координаты, направление, а также количество палуб корабля. На основе этих данных функция выясняет можно ли поставить корабль на поле.

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

Рисунок 2.4 - Проверка условий правильности расстановки корабля

Здесь s - номер строки, а c - номер столбца. Если на перечисленных местах пустые клетки, то корабль ставится на это место, и функция возвращает 0, если же нет, то функция возвращает 1 и требуется генерация новых координат.

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

Функции init_enemy_map(), enemy_set(), enemy_place() работают по абсолютно такому же принципу, как функции init_map(), set() и place().

Блок-схема функции, отвечающей за произведения выстрелов игроком представлена на рисунке 2.5.

Рисунок 2.5 - Работа функции simple_move()

Работа данной функции довольно простая. Сначала вводятся координаты точки, в которую хочет выстрелить игрок. Если введенные числа не входят диапазон допустимых значений, то игрока просят ввести координаты второй раз. Далее идет проверка на то, стрелял ли игрок в это место ранее. Если игрок уже стрелял, то его также просят ввести другие координаты. Проверить это достаточно просто, так как результатом выстрела на поле могут быть символы “0” или “*”. “0”, если игрок стрелял ранее и не попал по кораблю противника и “*”, если уже подбил корабль противника. Данная функция возвращает значение переменной k. Если игрок попал по кораблю, то функция возвращает 0, если не попал, то 1. Это нужно для того, чтобы правильно организовать основной цикл игры, который находится в функции main(). В ней организован цикл хода игрока. Игрок может стрелять пока значение, возвращаемое данной функцией будет равно 0. Когда функция вернет значение 1, ход перейдет к компьютеру.

Функция, отвечающая за ход компьютера включает в себя стратегию игры, которая состоит в следующем: компьютер стреляет в случайные точки карты, пока не наткнется на вражеский корабль. После этого он имеет право сделать еще один выстрел. Переменной shot передается случайное значение от 0 до 3. Эта переменная отвечает за то, в каком направлении будет произведен следующий выстрел: левее, правее, выше или ниже относительно побитой палубы вражеского корабля. Если так случилось, что в той стороне оказалась еще одна палуба корабля, то компьютер продолжает стрелять в заданном направлении, пока не наткнется на ` ' или `*'. Если компьютер встречает один их этих символов, то генерируются новые случайные координаты для нового выстрела. Если компьютер промазывает, то ход переходит к игроку. Блок-схема работы данной функции представлена на рисунках 2.6-2.9.

Рисунок 2.6 - Блок-схема работы функции enemy_simple_move

Рисунок 2.7 - Блок- схема работы функции enemy_simple_move (продолжение)

Рисунок 2.8 - Блок- схема работы функции enemy_simple_move (продолжение)

Рисунок 2.9 - Блок- схема работы функции enemy_simple_move (продолжение)

Данная функция также возвращает значение 0 или 1 в зависимости от того, попал компьютер по кораблю игрока или нет.

После того, как были рассмотрены основные функции программы, следует рассказать о основном цикле игры. С самого начала инициализируется игровое поле. Затем организуется бесконечный цикл игры. В бесконечном цикле организуются также циклы ходов игрока и компьютера. Игру начинает игрок. В цикле игры вызывается функция simple_move(). Если функция возвращает значение 0, то выхода из цикла игрока не происходит, и игрок продолжает дальше стрелять дальше. Если функция вернула значение 1, то ход переходит к компьютеру. После каждого выстрела игрока или компьютера происходит проверка на наличие целых кораблей у соперников. Так, если ход игрока, то проверяется наличие целых кораблей противника. Проверка происходит сразу после выстрела. Если подбиты все корабли хотя бы одного из игроков, то оглашается победитель партии и программа завершает свою работу.

3. Тестирование

3.1 Ввод некорректных данных

В данной программе не предусмотрена защита от ввода букв. Результат работы программы, при вводе буквы представлена на рисунке 3.1.

Рисунок 3.1 - Ввод буквы

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

Зато если вдруг пользователь решить выйти за пределы игрового поля или попытается стрельнуть в одно и то же место дважды, программа попросит ввести его новые координаты для выстрела. Работа программы при вводе некорректных данных подобного типа представлена на рисунках 3.2 и 3.3.

Рисунок 3.2 - Попытка стрельбы в одну точку

Рисунок 3.3 - Попытка выйти за пределы игрового поля

3.2 Ввод корректных данных и отображение попаданий на игровом поле

При вводе корректных данных, игра будет работать в своем штатном режиме. Нормальная работа программы представлена на рисунке 3.4.

Рисунок 3.4 - Штатный режим работы программы

На рисунке видно, что на тех местах, куда был произведен выстрел игроком отображается попал он или нет. Так, в точке (2;1) находится палуба вражеского корабля. Также видны выстрелы компьютера. Компьютер попал в трехпалубный корабль. Также видно, что второй выстрел компьютера был произведен рядом с местом попадания. В данный момент игрок и компьютер имеют по одному попаданию каждый.

4. Руководство пользователя

Вашему вниманию представляется игра морской бой. Вы будете играть против компьютера. На экране вы можете видеть два поля. На одном из них располагаются ваши корабли. По другому полю вы должны будете вести огонь. Корабли противника скрыты в тумане войны. Задача игры найти и уничтожить все корабли противника. На рисунке 4.1 представлено начальное окно игры.

алгоритм игра цикл while

Рисунок 4.1 - Начальное окно игры

Вы должны будете делать выстрелы по вражеской территории. Рекомендуется вводить координаты после приглашения программы сделать это, иначе может получиться путаница. Ввод координат осуществляется с клавиатуры. Допустимые вводимые значения - от 0 до 9. Крайне не рекомендуется вводить символы, отличные от цифр, так как это приведет к отказу программы и, соответственно, потере прогресса. Сначала вводится номер строки, потом номер столбца. Для примера введем номер строки 4 и номер столбца 5. На рисунке 4.2 представлен ввод координат.

Рисунок 4.2 - Ввод координат выстрела

На рисунке мы видим, что на месте с координатами (4;5) стоит символ “0”. Это означает, что мы не попали ни по одному из кораблей противника. Ниже пририсовывается игровое поле, которое получается после выстрела компьютера. Видно, что компьютер тоже промазал. Его выстрел отображается на левой матрице на координатах (6;3).

На рисунке 4.3 представлено попадание по кораблю противника как игроком, так и компьютером.

Рисунок 4.3 - Ход игры

Видно, что игрок попал всего один раз, а компьютер целых два. Попадание игрока - точка с координатами (1;0), а компьютера (7;6) и (7;9). При попадании во вражеский корабль, мы имеете право сделать еще один выстрел. То же самое может сделать и противник.

Игра продолжается до тех пор, пока все корабли одного из игроков не будут уничтожены. На рисунке 4.4 представлен конец игры.

Рисунок 4.4 - Окончание игры

5. Заключение

В ходе курсовой работы была разработана игра “Морской бой”. Она удовлетворяет всем требованиям задания. На экране отображается игровая матрица, состоящая из двух полей: поле дружеских кораблей и поле вражеских кораблей. Ввод координат производится с клавиатуры. В игру может играть один человек против компьютера. Игра ведется по очереди игроком и компьютером. При попадании, ход остается у того, кто стрелял.

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

Библиографический список

1 Б. Керниган, Д. Ритчи / Язык программирования Си

Приложение А

(обязательное)

Листинг программы

#include <stdio.h>

#include <stdbool.h>

#include <stdlib.h> //rand()

#include <string.h> //memcpy()

char matrix[13][29];

char enemy_matrix[13][29];

char map[13][29] = {

" 0123456789 0123456789 ",

" #----------# #----------#",

"0| | 0| |",

"1| | 1| |",

"2| | 2| |",

"3| | 3| |",

"4| | 4| |",

"5| | 5| |",

"6| | 6| |",

"7| | 7| |",

"8| | 8| |",

"9| | 9| |",

" #----------# #----------#" };

char enemy_map[13][29] = {

" 0123456789 0123456789 ",

" #----------# #----------#",

"0| | 0| |",

"1| | 1| |",

"2| | 2| |",

"3| | 3| |",

"4| | 4| |",

"5| | 5| |",

"6| | 6| |",

"7| | 7| |",

"8| | 8| |",

"9| | 9| |",

" #----------# #----------#" };

void set (int);

void enemy_set (int);

int enemy_place (int, int, int, int);

int place (int, int, int, int);

int simple_move (void);

int simple_enemy_move (void);

void init_map (void);

void init_enemy_map (void);

void main (void)

{

int player_defeat=0, enemy_defeat=0,def=0, e_def=0;

int i,j,m=0,n=0,r=3;

float k=0.0;

printf ("\n Добро подаловать в игру Морской бой! \n");

printf ("\n Вы будете играть против компьютера. \n");

printf ("\n Не забывайте: удача улыбается лишь храбрым. \n");

printf ("\n Свистать всех наверх. Мы начинаем \n");

/* Инициализация и последующее отображение игрового поля */

init_map();

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

{

printf("\n");

for (j=0; j<29; j++)

printf("%c",matrix[i][j]);

}

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

k=k*1.683;

init_enemy_map();

/* Организуется бесконечный цикл. Условие

выхода - уничтожить все корабли*/

while (r>0)

{

do

{

m = simple_move();

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

{

printf("\n");

for (j=0; j<29; j++)

printf("%c",matrix[i][j]);

}

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

for (j=0; j<29; j++)

if (enemy_matrix[i][j] == 'X')

{

def = def + 1;

}

enemy_defeat = 20 - def;

def = 0;

// Условие окончания игры. Когда на карте не останется

// ни одного символа 'X', переменная enemy_defeat будет равно 20

// что соответствует условию выхода из цикла

if (enemy_defeat == 20 ) goto L2;

}

while (m < 1);

m = 0;

do

{

n = enemy_simple_move();

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

{

printf("\n");

for (j=0; j<29; j++)

printf("%c",matrix[i][j]);

}

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

for (j=0; j<13; j++)

if (matrix[i][j] == 'X')

{

def = def + 1;

}

player_defeat = 20 - def;

def = 0;

// Условие окончания игры. Когда на карте не останется

// ни одного символа 'X', переменная player_defeat будет равно 20

// что соответствует условию выхода из цикла

if (player_defeat == 20 ) goto L3;

}

while (n < 1);

n=0;

}

L2:

if (enemy_defeat == 20) printf("\n Пользователь выиграл!\n");

L3:

if (player_defeat == 20) printf("\n Компьютер выиграл!\n");

}

// Функция, котоая отвечает за ходы игрока

int simple_move (void)

{

int i,j,k=0;

int x,y,s,c;

M:

printf("\n Введите строку \n");

scanf("%i",&y);

printf("\n Введите столбец \n");

scanf("%i",&x);

if ((x<0)||(y<0)||(x>9)||(y>9))

{

printf ("\n Ошибка ввода. Введите другие координаты.\n");

goto M;

// Если пользователь ввел неверные координаты, его просят ввессти другие

}

// Все эти преобразования и, казалось бы, не имеюще

// смысла действия, нужны из за особенностей игрового поля

s = y + 2;

c = x + 2;

i=y+2;

j=x+17;

// Если попадание, то ставится '*'

// как на игровое поле противника, так и на игровое поле игрока

if ((enemy_matrix[s][c] == '*')||(enemy_matrix[s][c] == '0'))

{

printf("\n Вы уже стреляли в данную точку. Измените координаты \n");

goto M;

}

if (enemy_matrix[s][c] == 'X')

{

k = 0;

matrix[i][j] = '*';

enemy_matrix[s][c] = '*';

}

// То же самое для промаха

else

{

k = 1;

matrix[i][j] = '0';

enemy_matrix[s][c] = '0';

}

// Если пользователь попадает, то функция возвращает 0

// Если промазывает - 1.

// Это нужно для правильной очередности стрельбы, ведь в морском бое

// кто попал, тот стреляет второй раз.

return k;

}

// Функция, которая отвечает за ходы компьютера

int enemy_simple_move (void)

{

int i,j,s,c,q,y,x,p=1;

int shot;

L1:

x = rand() % 10;

y = rand() % 10;

s = y + 2;

c = x + 2;

i = y + 2;

j = x + 17;

// Эта проверка нужна для того, чтобы компьютер не лупил в одно и то же место

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

// генериируются снова

if ((matrix[s][c] == '0')||(matrix[s][c] == '*')) goto L1;

else

{

if (matrix[s][c] == 'X')

{

shot = rand () % 4;

q = 0;

enemy_matrix[i][j] = '*';

matrix[s][c] = '*';

// Если компьютер попал, запускается адская машина

// Выше генерировалась случайная величина shot. Это направление выстрела.

// Если компьютер попал один раз, то стреляет второй не куда попало, а

// в случайное место вокруг попадание. Если он попадает второй раз, то продолжает стрелять

// пока не упрется в пустое место или 0.

switch (shot)

{

case 0:

{

while (matrix[s+p][c] == 'X')

{

enemy_matrix[i+p][j] = '*';

matrix[s+p][c] = '*';

p++;

}

if (matrix[s+p][c] == ' ')

{

enemy_matrix[i+p][j] = '0';

matrix[s+p][c] = '0';

q = 1;

}

break;

}//----------------------------------------------------case 0

case 1:

{

while (matrix[s-p][c] == 'X')

{

enemy_matrix[i-p][j] = '*';

matrix[s-p][c] = '*';

p++;

}

if (matrix[s-p][c] == ' ')

{

enemy_matrix[i-p][j] = '0';

matrix[s-p][c] = '0';

q = 1;

}

break;

}//----------------------------------------------------case 1

case 2:

{

while (matrix[s][c+p] == 'X')

{

enemy_matrix[i][j+p] = '*';

matrix[s][c+p] = '*';

p++;

}

if (matrix[s][c+p] == ' ')

{

enemy_matrix[i][j+p] = '0';

matrix[s][c+p] = '0';

q = 1;

}

break;

}//----------------------------------------------------case 2

case 3:

{

while (matrix[s][c-p] == 'X')

{

enemy_matrix[i][j-p] = '*';

matrix[s][c-p] = '*';

p++;

}

if (matrix[s][c-p] == ' ')

{

enemy_matrix[i][j-p] = '0';

matrix[s][c-p] = '0';

q = 1;

}

break;

}//-----------------------------------------------------case 3

break;

}//----------------------------switch

}

else

{

q = 1;

enemy_matrix[i][j] = '0';

matrix[s][c] = '0';

}

}

// Если компьютер попадает, то функция возвращает 0

// Если промазывает - 1.

// Это нужно для правильной очередности стрельбы, ведь в морском бое

// кто попал, тот стреляет второй раз.

return q;

}

// Функции инициализации игрового поля

void init_map (void)

{

set(4);

set(3);

set(3);

set(2);

set(2);

set(2);

set(1);

set(1);

set(1);

set(1);

//Тут происходит следующее:

// Есть 4 матрицы: matrix,enemy_matrix,map,enemy_map

// для игрока инициализируется в map, а потом копируется в matrix.

// Для компьютера инициализация происходит в enemy_map,

// а потом это копируется в enemy_matrix. По другому почему то

// не работает. Я так и не смог решить эту проблему.

// Вот такой вот костыль.

memcpy(matrix,map,13*29*sizeof(char));

}

//

void init_enemy_map (void)

{

enemy_set(4);

enemy_set(3);

enemy_set(3);

enemy_set(2);

enemy_set(2);

enemy_set(2);

enemy_set(1);

enemy_set(1);

enemy_set(1);

enemy_set(1);

memcpy(enemy_matrix,enemy_map,13*29*sizeof(char));

}

// В set() из функции init_map() передается значение deck - количество палуб у корабля.

/* В программе используется цикл while.

Условие выполнения цикла - isset == 0; После того, как переменная isset != 0,

выходим из цикла. Это означает, что корабль был успешно установлен.

*/

void set (int deck)

{

int i,j;

bool isset = 0;

int s,c;

bool dir = 0;

int e;

srand((unsigned)time(NULL));

/* В общем случае генерация координат проходит одинаково для всех

кораблей: генерируется случайное направление (dir), а также координаты

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

а значит значение переменной dir может быть равно 0 или 1. Если dir = 0,

то корабль будет стоять горизонтально, если dir = 1 - вертикально. */

while (isset == 0)

{

/* Для кораблей с разными палубами немного по разному

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

ставить в (8;8), так как он тогда выйдет за пределы поля, поэтому

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

который может стоять где угодно */

switch (deck)

{

case 4:

{

dir = rand () % 2;

s = 2 + rand () % 7;

c = 2 + rand () % 7;

break;

}

case 3:

{

dir = rand () % 2;

s = 2 + rand () % 8;

c = 2 + rand () % 8;

break;

}

case 2:

{

dir = rand () % 2;

s = 2 + rand () % 9;

c = 2 + rand () % 9;

break;

}

case 1:

{

dir = rand () % 2;

s = 2 + rand () % 10;

c = 2 + rand () % 10;

break;

}

}

switch (dir)

{

case 0:

{

e = place(s,c,dir,deck);

if (e == 0)

{

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

{

map[s][c+i] = 'X';

}

isset = 1;

}

break;

}

case 1:

{

e = place (s,c,dir,deck);

if (e == 0)

{

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

{

map[s+i][c] = 'X';

}

isset = 1;

}

break;

}

}

}

}

/* Данная функция проверяет можно ли в принципе поставить

корабль в данное место. Если можно, функция возвращает 0,

если нельзя - 1

Подробнее и с картинками работа данной функции

рассмотрена в ПЗ */

int place (int s, int c, int dir, int deck)

{

int e=0;

int i;

switch (dir)

{

case 0:

if (map[s][c] == 'X')

e = 1;

if (map[s-1][c-1] == 'X')

e = 1;

if (map[s-1][c+deck] == 'X')

e = 1;

if (map[s+1][c-1] == 'X')

e = 1;

if (map[s+1][c+deck] == 'X')

e = 1;

if (map[s][c-1] == 'X')

e = 1;

if (map[s][c+deck] == 'X')

e = 1;

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

{

if (map[s-1][c+i] == 'X')

e = 1;

if (map[s+1][c+i] == 'X')

e = 1;

}

break;

case 1:

if (map[s][c] == 'X')

e = 1;

if (map[s-1][c-1] == 'X')

e = 1;

if (map[s-1][c+1] == 'X')

e = 1;

if (map[s+deck][c-1] == 'X')

e = 1;

if (map[s+deck][c+1] == 'X')

e = 1;

if (map[s-1][c] == 'X')

e = 1;

if (map[s+deck][c] == 'X')

e = 1;

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

{

if (map[s+i][c-1] == 'X')

e = 1;

if (map[s+i][c+1] == 'X')

e = 1;

}

break;

}

return e;

}

// Работа следующих функций абсолютно такая же, как и set() и place()

void enemy_set (int deck)

{

int i,j;

bool isset = 0;

int s,c;

bool dir = 0;

int e;

srand((unsigned)time(NULL));

while (isset == 0)

{

switch (deck)

{

case 4:

{

dir = rand () % 2;

s = 2 + rand () % 7;

c = 2 + rand () % 7;

break;

}

case 3:

{

dir = rand () % 2;

s = 2 + rand () % 8;

c = 2 + rand () % 8;

break;

}

case 2:

{

dir = rand () % 2;

s = 2 + rand () % 9;

c = 2 + rand () % 9;

break;

}

case 1:

{

dir = rand () % 2;

s = 2 + rand () % 10;

c = 2 + rand () % 10;

break;

}

}

switch (dir)

{

case 0:

{

e = enemy_place(s,c,dir,deck);

if (e == 0)

{

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

{

enemy_map[s][c+i] = 'X';

}

isset = 1;

}

break;

}

case 1:

{

e = enemy_place (s,c,dir,deck);

if (e == 0)

{

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

{

enemy_map[s+i][c] = 'X';

}

isset = 1;

}

break;

}

}

}

}

int enemy_place (int s, int c, int dir, int deck)

{

int e=0;

int i;

switch (dir)

{

case 0:

{

if (enemy_map[s][c] == 'X')

e = 1;

if (enemy_map[s-1][c-1] == 'X')

e = 1;

if (enemy_map[s-1][c+deck] == 'X')

e = 1;

if (enemy_map[s+1][c-1] == 'X')

e = 1;

if (enemy_map[s+1][c+deck] == 'X')

e = 1;

if (enemy_map[s][c-1] == 'X')

e = 1;

if (enemy_map[s][c+deck] == 'X')

e = 1;

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

{

if (enemy_map[s-1][c+i] == 'X')

e = 1;

if (enemy_map[s+1][c+i] == 'X')

e = 1;

}

break;

}

case 1:

{

if (enemy_map[s][c] == 'X')

e = 1;

if (enemy_map[s-1][c-1] == 'X')

e = 1;

if (enemy_map[s-1][c+1] == 'X')

e = 1;

if (enemy_map[s+deck][c-1] == 'X')

e = 1;

if (enemy_map[s+deck][c+1] == 'X')

e = 1;

if (enemy_map[s-1][c] == 'X')

e = 1;

if (enemy_map[s+deck][c] == 'X')

e = 1;

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

{

if (enemy_map[s+i][c-1] == 'X')

e = 1;

if (enemy_map[s+i][c+1] == 'X')

e = 1;

}

break;

}

}

return e;

}

Размещено на Allbest.ru

...

Подобные документы

  • Описание алгоритма хода ЭВМ в режиме "пользователь-компьютер" в игре "Морской бой". Описание совокупности классов, их полей и методов. Разработка интерфейса и руководства пользователя по проведению игры. Листинг программы, написанной на языке Java.

    курсовая работа [645,0 K], добавлен 26.03.2014

  • Разработка программы игры в крестики-нолики. Примеры игровой ситуации на игровом поле. Описание входных и выходных данных, переменных и функций программы. Реализация алгоритма работы программы на языке C++. Текст программы и примеры ее выполнения.

    курсовая работа [352,8 K], добавлен 14.04.2011

  • Описание правил игры "Морской бой". Особенности современных компьютеров и искусственного интеллекта. Создание общей блок-схемы программы, ее внешний вид. Необходимые переменные, процедуры и функции. Характеристика объектов, используемых в приложении.

    курсовая работа [950,1 K], добавлен 05.11.2012

  • Проектирование игры "Морской бой" путем составления диаграмм UML, IDEF0, DFD, моделирующих требования к программе. Разработка программы с использованием языка C# и фреймворка.NETFramework 3.5. Тестирование белого ящика и альфа-тестирование продукта.

    курсовая работа [3,9 M], добавлен 24.10.2013

  • Обоснование необходимости разработки программы для игры "Тетрис". Математическая и графическая части алгоритма. Выбор языка и среды программирования. Отладка текста программы, разработка интерфейса пользователя. Тестирование, руководство пользователя.

    курсовая работа [1,5 M], добавлен 17.01.2011

  • Приемы программирования в Delphi. Алгоритм поиска альфа-бета отсечения, преимущества. Описание программного средства. Разработка программы, реализующая алгоритм игры "реверси". Руководство пользователя. Листинг программы. Навыки реализации алгоритмов.

    курсовая работа [357,1 K], добавлен 28.02.2011

  • Приемы практического использования объектно-ориентированного подхода в создании законченного программного продукта. Разработка кроссплатформенной компьютерной игры "Морской бой". Принципы "хорошего стиля программирования C++/Qt". Описание классов игры.

    курсовая работа [2,7 M], добавлен 12.08.2014

  • Разработка программы логической игры в "крестики-нолики" пять в ряд на поле размера 15х15 клеток с применением графики на языке Pascal с использованием объектно-ориентированного программирования. Структура алгоритма программы и описание ее работы.

    курсовая работа [821,5 K], добавлен 13.02.2012

  • Разработка программы казуальной игры "Zuma Deluxe" на языке С\С++. Использование стиля древних инков и ацтеков, возможностей графического движка HGE version 1.53. Назначение основных классов игры. Руководство пользователя, содержание главного меню.

    курсовая работа [8,3 M], добавлен 28.10.2014

  • Описание принципа развивающей игры в слова "Виселица". Разработка программы, реализующей задачу данной игры на языке Delphi. Обоснование выбора среды программирования, листинг файла, результаты отладки и тестирования, руководство для пользователя.

    курсовая работа [572,7 K], добавлен 14.07.2012

  • Построение и анализ математической модели игры. Определение вероятности обнаружения кораблей при всевозможном их расположении и различных системах поиска. Разработка алгоритмов для работы искусственного интеллекта. Структура программы и ее компоненты.

    курсовая работа [2,5 M], добавлен 22.12.2012

  • Возможности для создания совершенно новых типов игр. Характеристики используемых при работе аппаратно-программных средств. Обоснование выбора среды программирования. Анализ входной и выходной информации, описание схемы алгоритма программы и схемы данных.

    курсовая работа [353,1 K], добавлен 25.07.2012

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

    курсовая работа [365,4 K], добавлен 20.01.2010

  • Применение программного обеспечения для разработки игры "Быки и коровы". Описание алгоритма и интерфейса пользователя программы. Назначение и область применения и описание возможностей программы. Рассмотрение списка сообщений об ошибках программы.

    курсовая работа [799,2 K], добавлен 26.04.2021

  • Особенности разработки компьютерной игры, в которой проводится чемпионат по волейболу. Список переменных и типов данных. Разработка текстового и графического алгоритма. Разбор основных этапов игры на примере. Основные положения руководства пользователя.

    курсовая работа [976,9 K], добавлен 09.06.2016

  • Технические и пользовательские характеристики игры, требования к программному обеспечению и среде разработки C#. Составление блок-схемы алгоритма, uml-диаграммы и текста программы, тестирование корректности компьютерного кода и результатов его работы.

    курсовая работа [1,8 M], добавлен 05.03.2013

  • Разработка компьютерной игры "Эволюция" с помощью игрового движка Unit. Сравнение критериев игры-аналога и разрабатываемой игры. Разработка графического интерфейса пользователя. Настройки камеры в редакторе Unity. Структура файла сохранения игры.

    дипломная работа [3,6 M], добавлен 11.02.2017

  • Этапы работы генетического алгоритма, область его применения. Структура данных, генерация первоначальной популяции. Алгоритм кроссинговера - поиск локальных оптимумов. Селекция особей в популяции. Техническое описание программы и руководство пользователя.

    реферат [1014,2 K], добавлен 14.01.2016

  • Проектирование программного средства "База данных". Классификация юнитов онлайн игры "World of Tanks". Разработка диаграмм прецедентов, развертывания и деятельности. Руководство пользователя. Тестирование приложения, программа и методика испытаний.

    курсовая работа [920,4 K], добавлен 17.08.2013

  • Разработка эскизного и технического проекта программы игры "Собери картинку". Назначение и область применения, основные технические характеристики. Разработка рабочего проекта, разработка и спецификация программы игры. Описание и тестирование программы.

    курсовая работа [22,6 K], добавлен 10.06.2010

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.