Смекни!
smekni.com

Логическая игра Морской бой (стр. 4 из 7)

5.3 Итоги работы

Итогами данной работы являются углубление познаний в объектно-ориентированном программировании и проектировании, изучение работы с графикой, специальными компонентами windows-форм, основами искусственного интеллекта.

6. Список литературы

1. Страуструп Б. «Язык программирования С++.» – М: Бином, 1999. - 990с.

2. Уолнем К. «Объектно-ориентированное программирование на языке BORLANDC++» - Мн.: ООО «Попурри», 1997. – 640 с.:ил.

3. «Программирование в C++ Builder 6» [Электронный ресурс], формат pdf, 1150 с.

4. «BorlandС++ Builder. Освой самостоятельно» [Электронный ресурс], формат pdf, 705 с.


7. Приложение

Текст программы (основные моменты)

ResultsFrm.cpp

//Загрузка результатов

void TResultsForm::LoadRes ()

{

ifstream infile ("SeaButResults.txt");

if (!infile) return;

//Обнуление всех меток

Name1->Caption = '\0';

Name2->Caption = '\0';

Name3->Caption = '\0';

Name4->Caption = '\0';

Name5->Caption = '\0';

Name6->Caption = '\0';

Name7->Caption = '\0';

Name8->Caption = '\0';

Name9->Caption = '\0';

Name10->Caption = '\0';

S1->Caption = '\0';

S2->Caption = '\0';

S3->Caption = '\0';

S4->Caption = '\0';

S5->Caption = '\0';

S6->Caption = '\0';

S7->Caption = '\0';

S8->Caption = '\0';

S9->Caption = '\0';

S10->Caption = '\0';

char *temp;

temp = newchar [20];

//Загружаем в temp строки из файла и показываем их

//пока не конец файла

if (!infile.eof())

{

infile.getline(temp, 20, '\n');

Name1->Caption = temp;

infile >> temp;

S1->Caption = temp;

infile.seekg(infile.tellg()+2); //перемещаемся на 2 позиции вперед

}

else return;

if (!infile.eof())

{

infile.getline(temp, 20, '\n');

Name2->Caption = temp;

infile >> temp;

S2->Caption = temp;

infile.seekg(infile.tellg()+2);

}

else return;

if (!infile.eof())

{

infile.getline(temp, 20, '\n');

Name3->Caption = temp;

infile >> temp;

S3->Caption = temp;

infile.seekg(infile.tellg()+2);

}

else return;

if (!infile.eof())

{

infile.getline(temp, 20, '\n');

Name4->Caption = temp;

infile >> temp;

S4->Caption = temp;

infile.seekg(infile.tellg()+2);

}

else return;

if (!infile.eof())

{

infile.getline(temp, 20, '\n');

Name5->Caption = temp;

infile >> temp;

S5->Caption = temp;

infile.seekg(infile.tellg()+2);

}

else return;

if (!infile.eof())

{

infile.getline(temp, 20, '\n');

Name6->Caption = temp;

infile >> temp;

S6->Caption = temp;

infile.seekg(infile.tellg()+2);

}

else return;

if (!infile.eof())

{

infile.getline(temp, 20, '\n');

Name7->Caption = temp;

infile >> temp;

S7->Caption = temp;

infile.seekg(infile.tellg()+2);

}

else return;

if (!infile.eof())

{

infile.getline(temp, 20, '\n');

Name8->Caption = temp;

infile >> temp;

S8->Caption = temp;

infile.seekg(infile.tellg()+2);

}

else return;

if (!infile.eof())

{

infile.getline(temp, 20, '\n');

Name9->Caption = temp;

infile >> temp;

S9->Caption = temp;

infile.seekg(infile.tellg()+2);

}

else return;

if (!infile.eof())

{

infile.getline(temp, 20, '\n');

Name10->Caption = temp;

infile >> temp;

S10->Caption = temp;

infile.seekg(infile.tellg()+2);

}

else return;

delete [] temp;

infile.close();

}

SeaButFrm.cpp

//Создание новых кораблей

void TSeaButForm::NewShips (int number)

{

if (number == 1) //Проверка номера поля (1 или 2), если 1ое поле

{

DelShips (1); //Удалить корабли

Ships1 = newTDrawGrid * [10]; //Создать динамические корабли

for (inti = 0; i < 10; i++) //Придаем им необходимый внешний вид

{

Ships1[i] = new TDrawGrid (SeaButForm);

Ships1[i]->Left = 0;

Ships1[i]->Top = 29*i;

Ships1[i]->DragMode = dmAutomatic;

Ships1[i]->Height = 29;

Ships1[i]->DefaultColWidth = 27;

Ships1[i]->DefaultDrawing = false;

Ships1[i]->DefaultRowHeight = 27;

Ships1[i]->FixedCols = 0;

Ships1[i]->FixedRows = 0;

Ships1[i]->GridLineWidth = 2;

Ships1[i]->RowCount = 1;

Ships1[i]->ScrollBars = ssNone;

Ships1[i]->BevelInner = bvNone;

Ships1[i]->BevelOuter = bvNone;

Ships1[i]->BorderStyle = bsSingle;

Ships1[i]->Color = clYellow;

Ships1[i]->FixedColor = clYellow;

Ships1[i]->OnDragOver = ShipsDragOver;

Ships1[i]->OnMouseDown = ShipsMouseDown;

Ships1[i]->Parent = Field1;

Ships1[i]->Cursor = (Controls::TCursor)4;

Ships1[i]->DragCursor = (Controls::TCursor)5;

}

Ships1[0]->Tag = 410 + number;

Ships1[1]->Tag = 310 + number;

Ships1[2]->Tag = 320 + number;

Ships1[3]->Tag = 210 + number;

Ships1[4]->Tag = 220 + number;

Ships1[5]->Tag = 230 + number;

Ships1[6]->Tag = 110 + number;

Ships1[7]->Tag = 120 + number;

Ships1[8]->Tag = 130 + number;

Ships1[9]->Tag = 140 + number;

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

{

Ships1[i]->Width = 29*(int)(Ships1[i]->Tag/100);

Ships1[i]->ColCount = (int)(Ships1[i]->Tag/100);

}

}

else //Если 2ое поле, делать для него то же самое

{………

}

}

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

boolTSeaButForm::CheckShips (intnumber)

{

if (number == 1) //Если для 1го поля

{

Newfield (1); //Создаем массив 1го поля

intx = 0, y = 0;

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

{

x = Ships1[i]->Left/29; //Определяем координаты кораблей

y = Ships1[i]->Top/29;

//Переменные для перехода вокруг корабля, длины сторон

//площадей вокруг кораблей. Как по x, так и по y

int y_temp = 0, x_temp = 0, x_len, y_len;

//Проверка на расположение корабля у границ

x == 9 ? x_len = 2 : x_len = 3;

y == 9 ? y_len = 2 : y_len = 3;

if (y)

y_temp = y - 1;

else

y_len = 2;

if (x)

x_temp = x - 1;

else

x_len = 2;

//Проверка расстояний между кораблями и 1 полем проверяемого корабля

for (int ky = 0; ky < y_len; ky++)

{

for (int kx = 0; kx < x_len; kx++)

{

//Если есть рядом

if (field1[y_temp][x_temp])

{

//звук

PlaySound("Sounds&bsol;SOUNMETA.WAV", 0, SND_ASYNC);

//показать сообщение

MessageDlgPos("Корабли не должны соприкасаться!!!", mtWarning,

TMsgDlgButtons() << mbRetry, 0, SeaButForm->Left + SeaButForm->Width/2 - 120,

SeaButForm->Top + SeaButForm->Height - 130);

return false;

}

x_temp += 1;

}

y_temp += 1;

x_temp -= x_len;

}

field1[y][x] = 1; //Если все в порядке, то занимаем поле

//Проверка ширины корабля, если больше 1 поля в ширину

if (Ships1[i]->Width > 30)

{

x++; //Переходим правее и проводим проверку для остальных полей корабля

for (int j = 0; j < Ships1[i]->ColCount - 1; j++)

{

y_temp = 0, x_temp = 0;

x == 9 ? x_len = 2 : x_len = 3;

if (y)

y_temp = y - 1;

x_temp = x - 1;

for (int ky = 0; ky < y_len; ky++)

{

for (int kx = 0; kx < x_len; kx++)

{

//Проверка на расположение корабля у границ

if (!kx && y_temp == y)

{

kx++;

x_temp++;

}

if (field1[y_temp][x_temp])

{

PlaySound("Sounds&bsol;SOUNMETA.WAV", 0, SND_ASYNC);

MessageDlgPos("Корабли не должны соприкасаться!!!", mtWarning,

TMsgDlgButtons() << mbRetry, 0, SeaButForm->Left + SeaButForm->Width/2 - 120,

SeaButForm->Top + SeaButForm->Height - 130);

return false;

}

x_temp += 1;

}

y_temp += 1;

x_temp -= x_len;

}

field1[y][x++] = 1; //Отмечаем поле и переходим правее

}

}

//Иначе больше 1го поля в высоту

else

{

y++; //Проводим аналогичные операции, только в высоту

for (int j = 0; j < Ships1[i]->RowCount - 1; j++)

{

y_temp = 0, x_temp = 0;

y == 9 ? y_len = 2 : y_len = 3;

y_temp = y - 1;

if (x)

x_temp = x - 1;

for (int ky = 0; ky < y_len; ky++)

{

for (int kx = 0; kx < x_len; kx++)

{

if (x_temp == x && !ky)

{

x_temp++;

continue;

}

if (field1[y_temp][x_temp])

{

PlaySound("Sounds&bsol;SOUNMETA.WAV", 0, SND_ASYNC);

MessageDlgPos("Корабли не должны соприкасаться!!!", mtWarning,

TMsgDlgButtons() << mbRetry, 0, SeaButForm->Left + SeaButForm->Width/2 - 120,

SeaButForm->Top + SeaButForm->Height - 130);

return false;

}

x_temp += 1;

}

y_temp += 1;

x_temp -= x_len;

}

field1[y++][x] = 1;

}

}

}

}

else //Иначе для 2го поля боя, повторяем аналогичные процессы

{………..

}

returntrue;

}

//Случайное создание кораблей компьютером

voidTSeaButForm::CreateShips ()

{

NewShips (2);

//Скрытие кораблей 2 поля

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

Ships2[i]->Visible = false;

Newfield (2); //Создание массива 2го поля боя

intxc = -1, dir = -1, xx = -1; //Выбранная координата, направление

boolcl = false; //Переменная для проверки условий

intarr[100], arrdir[4] = {0,1,2,3}; //Для сверки с недоступными полями и направлениями

for (inti = 0; i < 100; i++) //Заполнение массива доступных полей

arr[i] = i;

//Процесс создания 10 кораблей

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

{

int count; //Вид корабля

switch (sh)

{

case 0: count = 3; break;

case 1: count = 2; break;

case 2: count = 2; break;

case 3: count = 1; break;

case 4: count = 1; break;

case 5: count = 1; break;

default: count = 0;

}

cl = false;

//Заполнение массива доступных направлений

for (int k = 0; k < 4; k++)

arrdir[k] = k;

//Выбор случайного поля

M2: do

{

Randomize();

xc = Random(100);

//Сверить, доступно ли оно

if (xc == arr[xc])

{

cl = true;

xx = xc;

}

}

while (!cl);

//Выбор направления корабля

M1: do

{

cl = false;

xx = xc; //Запомнить выбранное поле

//Проверка на существование невыбранных направлений

for (intm = 0; m < 4; m++)

if (arrdir[m] != -1) { cl = true; break; }

if (!cl)

{

//Заполнение массива направлений

for (intk = 0; k < 4; k++)

arrdir[k] = k;

gotoM2; //Переход к выбору нового поля

}

//Выбор направления

do

{

cl = false;

Randomize();

dir = Random(4);

//Проверка на доступность направления

if (dir == arrdir[dir])

{

arrdir[dir] = -1;

cl = true;

}

}

while (!cl);

//Проверка на то, впишется ли корабль

cl = false;

switch (dir)

{

case 0: if (xx%10 >= count) cl = true; break;

case 1: if (xx - 10*count >= 0) cl = true; break;

case 2: if (xx%10 <= 9 - count) cl = true; break;

case 3: if (99 - xx >= 10*count) cl = true; break;

}

}

while (!cl);

//Проверка расположения других кораблей относительно полей данного

for (int j = 0; j < count + 1; j++)

{

cl = false;

//Переход в зависимости от направления

switch (dir)

{

case 0: if (xx%10) xx -= 1; break;

case 1: if ((int)(xx/10)) xx -= 10; break;

case 2: if ((xx%10) != 9) xx += 1; break;

case 3: if ((int)(xx/10) != 9 )xx += 10; break;

}

//Проверка на доступность

if (xx == arr[xx])

cl = true;

//Иначе переход к выбору другого направления

if (!cl) gotoM1;

}

//Заполнение массива в соответствии с положением корабля

//и прорисовка кораблей

int coor_x = xc%10, coor_y = (int)(xc/10);

switch (dir)

{

case 0: Ships2[sh]->Width = (count+1)*29;

Ships2[sh]->Height = 29;

Ships2[sh]->Left = (coor_x-count)*29;

Ships2[sh]->Top = coor_y*29;

Ships2[sh]->ColCount = count+1;

Ships2[sh]->RowCount = 1; break;

case 1: Ships2[sh]->Width = 29;

Ships2[sh]->Height = (count+1)*29;

Ships2[sh]->Left = coor_x*29;

Ships2[sh]->Top = (coor_y-count)*29;

Ships2[sh]->ColCount = 1;

Ships2[sh]->RowCount = count+1; break;

case 2: Ships2[sh]->Width = (count+1)*29;

Ships2[sh]->Height = 29;

Ships2[sh]->Left = coor_x*29;

Ships2[sh]->Top = coor_y*29;

Ships2[sh]->ColCount = count+1;

Ships2[sh]->RowCount = 1; break;

case 3: Ships2[sh]->Width = 29;

Ships2[sh]->Height = (count+1)*29;

Ships2[sh]->Left = coor_x*29;

Ships2[sh]->Top = coor_y*29;