48222 (Программа "Морской бой"), страница 2

2016-07-30СтудИзба

Описание файла

Документ из архива "Программа "Морской бой"", который расположен в категории "". Всё это находится в предмете "информатика" из 1 семестр, которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "курсовые/домашние работы", в предмете "информатика, программирование" в общих файлах.

Онлайн просмотр документа "48222"

Текст 2 страницы из документа "48222"

Если первым свои корабли потерял игрок, ему выводится сообщение о проигрыше

Рис. 8. Сообщение о проигрыше

В начале игры выводится приглашение к расстановке кораблей:

Рис. 9. Расстановка кораблей

Если игрок выполнил недопустимое действие (например, попытался «наложить» корабль на корабль) ему будет выведено предупреждающее сообщение о его ошибке.

Если расстановка кораблей закончилась выводится приглашение к началу игры

Рис. 10. Начало игры

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

Рис. 11. Сообщение о промахе

В случае попадания игроку выводится сообщение о попадании

Рис. 12 Сообщение о попадании

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

Рис. 13. Сообщение о выстреле в обстрелянную ячейку

Анализ работы

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

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

Во время написания программы я получил навыки по использованию некоторых, ранее не использованных мной, компонентов среды программирования С++ Builder 6.

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


Приложение: Текст программы

Текст программы состоит из следующих модулей: UShipBattle.h, UShipBattle.cpp, ShipBattle.cpp

ShipBattle.cpp

 // –

#include

#pragma hdrstop

 // –

USEFORM («UShipBattle.cpp», Form1);

 // –

WINAPI WinMain (HINSTANCE, HINSTANCE, LPSTR, int)

{

try

{

Application->Initialize();

Application->CreateForm (__classid(TForm1), &Form1);

Application->Run();

}

catch (Exception &exception)

{

Application->ShowException(&exception);

}

catch (…)

{

try

{

throw Exception(«»);

}

catch (Exception &exception)

{

Application->ShowException(&exception);

}

}

return 0;

}

 // –

UShipBattle.cpp

 // –

#include

#pragma hdrstop

#include «UShipBattle.h»

 // –

#pragma package (smart_init)

#pragma resource «*.dfm»

TForm1 *Form1;

 // –

__fastcall TForm1:TForm1 (TComponent* Owner)

: TForm(Owner)

{

HE = new HandlersOfEvents (Fild1, Fild2);

}

 // –

int Flot: GetStatus()

{

destroy = true;

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

for (i = 0; i < ship[j].col_deck; i++)

if (ship[j].decks[i])

{

destroy = false;

return 1;

}

return 0;

}

 // –

int AI: Generation (Flot *CPU, int col_ship, int col_deck)

{

int x1, y1, k, i, j;

bool vertical = false, regen;

do {

randomize();

x1 = rand()% 10;

y1 = rand()% 10;

regen = false;

for (k = 0; k < col_deck; k++)

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

for (j = 0; j ship[i].col_deck; j++)

{

if(regen) break;

if(! vertical)

{

if((CPU -> ship[i].desp_of_part[j].x == x1 + k &&

CPU -> ship[i].desp_of_part[j].y == y1) || (x1 + k >= 10))

{

vertical = true;

regen = true;

continue;

}

if((CPU -> ship[i].desp_of_part[j].x – 1 == x1 + k ||

CPU -> ship[i].desp_of_part[j].x + 1 == x1 + k) &&

(CPU -> ship[i].desp_of_part[j].y – 1 == y1 ||

CPU -> ship[i].desp_of_part[j].y + 1 == y1))

{

vertical = true;

regen = true;

continue;

}

}

if(vertical)

{

if((CPU -> ship[i].desp_of_part[j].x == x1 &&

CPU -> ship[i].desp_of_part[j].y == y1 + k) ||

(y1 + k >= 10))

{

vertical = false;

regen = true;

continue;

}

if((CPU -> ship[i].desp_of_part[j].x – 1 == x1 ||

CPU -> ship[i].desp_of_part[j].x + 1 == x1) &&

(CPU -> ship[i].desp_of_part[j].y – 1 == y1 + k ||

CPU -> ship[i].desp_of_part[j].y + 1 == y1 + k))

{

vertical = true;

regen = true;

continue;

}

}

}

} while(regen);

if(! vertical)

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

{

CPU -> ship [col_ship – 1].desp_of_part[i].x = x1 + i;

CPU -> ship [col_ship – 1].desp_of_part[i].y = y1;

}

else

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

{

CPU -> ship [col_ship – 1].desp_of_part[i].x = x1;

CPU -> ship [col_ship – 1].desp_of_part[i].y = y1 + i;

}

return 0;

}

 // –

int Referee: GoChecking (int x, int y, int n)

{

if (n == 1)

if (! Check(net1, x, y))

return 0;

if (n == 2)

if (! Check(net2, x, y))

return 0;

return 1;

}

 // –

int Referee: Check (bool net[10] [10], int x, int y)

{

x /= 20; y /= 20;

if (! net[x] [y]) return 0;

return 1;

}

 // –

int Referee: GoScaning (int x, int y, int n)

{

if (n == 1)

if (! Scan(player, x, y))

return 0;

if (n == 2)

if (! Scan(CPU, x, y))

return 0;

return 1;

}

 // –

int Referee: Scan (Flot *fl, int x, int y)

{

x /= 20; y /= 20;

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

for (j = 0; j ship[i].col_deck; j++)

if (fl -> ship[i].desp_of_part[j].x == x &&

fl -> ship[i].desp_of_part[j].y == y)

{

fl -> ship[i].decks[j] = false;

return 0;

}

return 1;

}

 // –

int Referee: Miss (int x, int y, int n)

{

x /= 20; y /= 20;

if (n == 1) net1 [x] [y] = false;

if (n == 2) net2 [x] [y] = false;

return 1;

}

 // –

int Referee: EndRaund (int n)

{

if (n == 2)

Form1 -> Panel2 -> Caption = «Вы победили!»;

if (n == 1)

Form1 -> Panel2 -> Caption = «Вы проиграли!»;

game_over = true;

return 0;

}

 // –

int HandlersOfEvents: Play (TImage *Im1, TImage *Im2)

{

Im1 -> Enabled = true;

Im2 -> Enabled = true;

return 0;

}

 // –

int HandlersOfEvents: Desposition (int x, int y, TMouseButton Button)

{

if(play) return 0;

x /= 20; y /= 20;

for (k = 0; k < col_deck; k++)

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

for (j = 0; j ship[i].col_deck; j++)

{

if (Button == mbLeft)

{

if (player -> ship[i].desp_of_part[j].x == x + k &&

player -> ship[i].desp_of_part[j].y == y)

{

ShowMessage («Невозможно выполнить действие!»);

return 0;

}

if (x + k >= 10)

{

ShowMessage («Невозможно выполнить действие!»);

return 0;

}

if((player -> ship[i].desp_of_part[j].x – 1 == x + k ||

player -> ship[i].desp_of_part[j].x + 1 == x + k) &&

(player -> ship[i].desp_of_part[j].y – 1 == y ||

player -> ship[i].desp_of_part[j].y + 1 == y))

{

ShowMessage («Невозможно выполнить действие!»);

return 0;

}

}

if (Button == mbRight)

{

if (player -> ship[i].desp_of_part[j].x == x &&

player -> ship[i].desp_of_part[j].y == y + k)

{

ShowMessage («Невозможно выполнить действие!»);

return 0;

}

if (y + k >= 10)

{

ShowMessage («Невозможно выполнить действие!»);

return 0;

}

if((player -> ship[i].desp_of_part[j].x – 1 == x ||

player -> ship[i].desp_of_part[j].x + 1 == x) &&

(player -> ship[i].desp_of_part[j].y – 1 == y + k ||

player -> ship[i].desp_of_part[j].y + 1 == y + k))

{

ShowMessage («Невозможно выполнить действие!»);

return 0;

}

}

}

if (Button == mbLeft)

Draw («position_h», x*20, y*20, 1);

else

Draw («position_v», x*20, y*20, 1);

Generation (CPU, col_ship, col_deck);

if (col_ship == 1) col_deck –;

if (col_ship == 3) col_deck –;

if (col_ship == 6) col_deck –;

if (col_ship == 10) play = true;

if(play) Form1 -> Panel2 -> Caption = «Поехали»;

col_ship++;

return 0;

};

 // –

int HandlersOfEvents: Shoot (int x, int y)

{

if (game_over) return 0;

int shoot_player = ShootPlayer (x, y, 2);

if (shoot_player > 0)

do {

x = rand()% 200;

y = rand()% 200;

int shoot_cpu = ShootPlayer (x, y, 1);

if (shoot_cpu > 0)

break;

if (shoot_cpu < 0)

player -> GetStatus();

if (player -> destroy || target_CPU > 19)

{

EndRaund(1);

return 0;

}

} while(true);

else

{

if (shoot_player < 0)

CPU -> GetStatus();

if (CPU -> destroy || target_player > 19)

{

EndRaund(2);

return 0;

}

}

return 0;

}

 // –

int HandlersOfEvents: ShootPlayer (int x, int y, int n)

{

if(! play) return 0;

if (! GoChecking(x, y, n))

{

if (n == 2) Form1 -> Panel2 -> Caption = «Ещё раз! Туда уже стреляли!»;

return 0;

}

else if (! GoScaning(x, y, n))

{

Draw («target», x, y, n);

Miss (x, y, n);

if (n == 2)

{

Form1 -> Panel2 -> Caption = «Попал! Ещё раз!»;

target_player++;

}

else target_CPU++;

return -1;

}

Miss (x, y, n);

if (n == 2) Form1 -> Panel2 -> Caption = «Мимо! Ход опонента»;

Draw («miss», x, y, n);

return 1;

}

 // –

int HandlersOfEvents: Draw (String key, int x, int y, int n)

{

TImage *Im;

x /= 20; y /= 20;

if (n == 1) Im = Form1 -> Fild1;

if (n == 2) Im = Form1 -> Fild2;

if (key == «target»)

{

Im -> Canvas -> Rectangle (x*20, y*20, x*20 + 20, y*20 + 20);

Im -> Canvas -> Brush -> Color = clYellow;

Im -> Canvas -> Rectangle (x*20, y*20 + 20, x*20 + 20, y*20);

Im -> Canvas -> Brush -> Color = clWhite;

}

if (key == «miss»)

{

Im -> Canvas -> Ellipse (x*20, y*20, x*20 + 20, y*20 + 20);

Im -> Canvas -> Ellipse (x*20 + 5, y*20 + 5, x*20 + 15, y*20 + 15);

}

if (key == «position_h»)

{

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

{

Im -> Canvas -> Brush -> Color = clBlue;

Im -> Canvas -> Rectangle (x*20 + i*20, y*20, x*20 + 20 + i*20, y*20 + 20);

player -> ship [col_ship – 1].desp_of_part[i].x = x + i;

player -> ship [col_ship – 1].desp_of_part[i].y = y;

Im -> Canvas -> Brush -> Color = clWhite;

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Нет! Мы не выполняем работы на заказ, однако Вы можете попросить что-то выложить в наших социальных сетях.
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
4125
Авторов
на СтудИзбе
667
Средний доход
с одного платного файла
Обучение Подробнее