Итогами данной работы являются углубление познаний в объектно-ориентированном программировании и проектировании, изучение работы с графикой, специальными компонентами windows-форм, основами искусственного интеллекта.
1. Страуструп Б. «Язык программирования С++.» – М: Бином, 1999. - 990с.
2. Уолнем К. «Объектно-ориентированное программирование на языке BORLANDC++» - Мн.: ООО «Попурри», 1997. – 640 с.:ил.
3. «Программирование в C++ Builder 6» [Электронный ресурс], формат pdf, 1150 с.
4. «BorlandС++ Builder. Освой самостоятельно» [Электронный ресурс], формат pdf, 705 с.
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\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\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\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;