История.
Игра была "придумана" в 1931 году Милтоном Брэдли (Milton Bradley). Точнее "настольная игра" выпущена его компанией как коммерческий продукт. Идея игры пришла во время первой мировой войны, в которой было много морских сражений. Хотя есть данные, что игра существовала в "бумажном" варианте (как мы в школьные годы играли) существенно раньше, еще до Первой мировой войны, и истинный автор неизвестен.
АНАЛИЗ ТЕХНИЧЕСКОГО ЗАДАНИЯ
Запуск программы осуществляется следующим образом: необходимо открыть папку, содержащую данную игру, и найти исполняемый файл. Сначала необходимо указать количество и размер кораблей, при расстановки кораблей используются кнопки мыши (правая- повернуть корабль на 900, левая зафиксировать корабль на поле), затем выбираешь кто стреляет первый и начинаешь играть. При попадании в корабль противника ставиться крестик и закрашиваются клетки в которых не может быть других кораблей. Когда заканчивается игра открывается поле противника и выводится сообщение о победе или поражении.
Тестинг программы
В ходе работы приложения мы получим выходной файл с нашей реализацией морского боя, в формате .xmp, который мы можем просмотреть простым блокнотом или при помощи Total Commander.
XMP – гибкая платформа метаданных (Extensible Metadata Platform – XMP). Этот формат создан для добавления информации в файл. Формат XMP разработан так, что файл может прочитать любая программа, в том числе не умеющая работать с XMP. XMP используется в PDF, фотографии и редактировании изображений.
БЛОК-СХЕМА ПРОГРАММЫ
ИСХОДНЫЙ ТЕКСТ ПРОГРАММЫ
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "shipsu.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "CSPIN"
#pragma resource "*.dfm"
#include "AboutForm.cpp"
//---------------------------------------------------------------------------
TForm1 *Form1;
//-------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::side_x(int x,int y,int a,int b,int c,int d,int f)
{
if ( x>=a )
{
comp.put_bit(x+b,y,3);
}
comp.put_bit(x+c, y,3);
IComp->Canvas->Draw((x+d)*25,y*25,BitMapm);
IComp->Canvas->Draw((x+f)*25,y*25,BitMapm);
}
void __fastcall TForm1::side_y(int x,int y,int a,int b,int c,int d,int g)
{
if ( y>=a )
{
comp.put_bit(x,y+b,3);
}
comp.put_bit(x, y+c, 3);
IComp->Canvas->Draw(x*25,(y+d)*25,BitMapm);
IComp->Canvas->Draw(x*25,(y+g)*25,BitMapm);
}
void __fastcall TForm1::side(int x, int y, int control)
{
int vector_free2_w=0;
int vector_free3_w=0;
int vector_free2_o=0;
int vector_free3_o=0;
int vector_free2_n=0;
int vector_free3_n=0;
int vector_free2_s=0;
int vector_free3_s=0;
int vect_w=0; // для выбора направления по массиву
int vect_n=0; // для выбора направления по массиву
int vect_o=0; // для выбора направления по массиву
int vect_s=0; // для выбора направления по массиву
int vect_1w=0; // для выбора направления по массиву
int vect_1n=0; // для выбора направления по массиву
int vect_1o=0; // для выбора направления по массиву
int vect_1s=0; // для выбора направления по массиву
int vect_2w=0; // для выбора направления по массиву
int vect_2n=0; // для выбора направления по массиву
int vect_2o=0; // для выбора направления по массиву
int vect_2s=0; // для выбора направления по массиву
int array_around[12][2]={{ 0,-1},
{ 0,-2},
{ 0,-3},
{ 0, 1}, // 3 3 3 3 3 3 3 3 3 3
{ 0, 2}, //
{ 0, 3}, // 1 2 * 0 1 2 * 3 3 2 * 0 3 2 * 1 3 2 * 0
{-1, 0}, // 0 3 0 3 0 3 0 3 0 3
{-2, 0}, //
{-3, 0},
{ 1, 0},
{ 2, 0},
{ 3, 0}};
vect_12_wm=0; // 1 max 1
vect_13_wm=0;
vect_14_wm=0;
vect_12_om=0;
vect_13_om=0;
vect_14_om=0;
vect_12_nm=0;
vect_13_nm=0;
vect_14_nm=0;
vect_12_sm=0;
vect_13_sm=0;
vect_14_sm=0;
for ( int i=0;i<12;i++ )
{
if ( comp.show_bit(x+array_around[i][1],y+array_around[i][0])==1 )
{
switch ( i ) //
{
case 0:
vect_12_wm++;
break;
case 1:
vect_13_wm++;
break;
case 2:
vect_14_wm++;
break;
case 3:
vect_12_om++;
break;
case 4:
vect_13_om++;
break;
case 5:
vect_14_om++;
break;
case 6:
vect_12_nm++;
break;
case 7:
vect_13_nm++;
break;
case 8:
vect_14_nm++;
break;
case 9:
vect_12_sm++;
break;
case 10:
vect_13_sm++;
break;
case 11:
vect_14_sm++;
}
}
if ( comp.show_bit(x+array_around[i][1],y+array_around[i][0])==2)
{
switch ( i )
{
case 0:
vect_1w++;
case 1:
vect_2w++;
case 2:
vect_w++;
break;
case 3:
vect_1o++;
case 4:
vect_2o++;
case 5:
vect_o++;
break;
case 6:
vect_1n++;
case 7:
vect_2n++;
case 8:
vect_n++;
break;
case 9:
vect_1s++;
case 10:
vect_2s++;
case 11:
vect_s++;
}
}
//--------------------------------------------------------------------
void __fastcall TForm1::TimerThinkCompTimer(TObject *Sender)
{
count_think++;
IComp->Picture->Assign(BitMap);
for (int x=0;x<10;x++)
{
for (int y=0;y<10;y++)
{
paint_array(x,y);
}
}
comp.next_ship(RadioGroup1->ItemIndex,1);
if (count_think==30) // 50 75
{
if (!Easily1->Checked)
{
comp.next_ship(RadioGroup1->ItemIndex,radar_sensitivity);
}
else
{
comp.next_ship(RadioGroup1->ItemIndex,1);
}
count_think=0;
PIThink->Visible=false;
TimerThinkComp->Enabled=false;
PNowYou->Visible=true;
cover=0;
IComp->Picture->Assign(BitMap);
Kind1->Enabled=true;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
BitMap=new Graphics::TBitmap;
BitMap->Width=250;
BitMap->Height=250;
BitMap->Assign(IComp->Picture);
BitMapl=new Graphics::TBitmap;
BitMapl->Width=250;
BitMapl->Height=250;
BitMapl->Assign(IMan->Picture);
BitMaplr=new Graphics::TBitmap;
BitMaplr->Width=250;
BitMaplr->Height=250;
BitMaplr->Assign(IMan->Picture);
BitMaprr=new Graphics::TBitmap;
BitMaprr->Width=250;
BitMaprr->Height=250;
BitMaprr->Assign(IComp->Picture);
BitMapm=new Graphics::TBitmap;
BitMapm->Width=25;
BitMapm->Height=25;
BitMapm->Assign(Milk->Picture);
BitMapb=new Graphics::TBitmap;
BitMapb->Width=25;
BitMapb->Height=25;
BitMaprs=new Graphics::TBitmap;
BitMaprs->Width=8;
BitMaprs->Height=8;
BitMaprs->Assign(IShip->Picture);
BitMaprz=new Graphics::TBitmap;
BitMaprz->Width=8;
BitMaprz->Height=8;
BitMaprz->Assign(IZero->Picture);
BitMaprc=new Graphics::TBitmap;
BitMaprc->Width=8;
BitMaprc->Height=8;
BitMaprc->Assign(IClose->Picture);
BitMaprf=new Graphics::TBitmap;
BitMaprf->Width=120;
BitMaprf->Height=120;
BitMapw=new Graphics::TBitmap;
BitMapw->Width=25;
BitMapw->Height=25;
BitMapw->Assign(IFold->Picture);
BitMapLm=new Graphics::TBitmap;
BitMapLm->Width=25;
BitMapLm->Height=25;
BitMapLc=new Graphics::TBitmap;
BitMapLc->Width=25;
BitMapLc->Height=25;
IRadarMan->Picture->Assign(IRadarBattle->Picture);
IRadarComp->Picture->Assign(IRadarBattle->Picture);
Screen->Cursors[crMyCursor]=LoadCursor(HInstance,"TARGET");
Screen->Cursors[crMyCursorh]=LoadCursor(HInstance,"HOOK");
IMan->Cursor=(TCursor)crMyCursorh;
IComp->Cursor=(TCursor)crMyCursor;
srand(time(0));
}
//--------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
BitMap->Free();
BitMapl->Free();
BitMaplr->Free();
BitMaprr->Free();
BitMapm->Free();
BitMapb->Free();
BitMaprs->Free();
BitMaprz->Free();
BitMaprc->Free();
BitMapw->Free();
BitMapLm->Free();
BitMapLc->Free();
Application->HelpCommand(HELP_QUIT,0);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::paint_array(int x, int y)
{
if (comp.show_bit(x,y)==1||comp.show_bit(x,y)==2) //comp
{
if (School1->Checked)
{
IComp->Canvas->Pen->Width=3;
IComp->Canvas->Pen->Color=clNavy;
IComp->Canvas->Brush->Color=clGray;
IComp->Canvas->Rectangle(x*25+1,y*25+1,x*25+25-1,y*25+25-1);
}
else if (Windows1->Checked)
IComp->Canvas->Draw(x*25,y*25,BitMapw);
else
{
IComp->Canvas->Brush->Color = clTeal;
IComp->Canvas->Pen->Color = clTeal;
IComp->Canvas->Rectangle(x*25,y*25,x*25+25,y*25+25 );
}
}
}
void __fastcall TForm1::Exit1Click(TObject *Sender)
{
Close();
}
//--------------------------------------------------------------------
void __fastcall TForm1::IManMouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
if (PNowYou->Visible&&(count_sh-cover)) //||!PMyShoot->Visible)
{
IMan->Picture->Assign(BitMapl);
if (Button==mbRight)
switch(vector)
{
case 0:
vector=1;
shift_X=0;
switch(fign[cover])
{
case 1:
if (X>224)
shift_Y=-3;
else if (Y>199)
shift_Y=-2;
else if (Y>174)
shift_Y=-1;
break;
case 2:
if (Y>224)
shift_Y=-2;
else if (Y>199)
shift_Y=-1;
break;
case 3:
if (Y>224)
shift_Y=-1;
break;
case 4:
shift_Y=0;
break;
}
{
case 1:
mouse_down_right_y(X,Y,174,100,150);
break;
case 2:
mouse_down_right_y(X,Y,199,75,175);
break;
case 3:
mouse_down_right_y(X,Y,224,50,200);
break;
case 4:
if (Windows1->Checked)
{
IMan->Canvas->Draw(X/25*25,Y/25*25,BitMapw);
}
switch(fign[cover])
{
case 1:
mouse_down_right_x(X,Y,174,100,150);
break;
case 2:
mouse_down_right_x(X,Y,199,75,175);
break;
case 3:
mouse_down_right_x(X,Y,224,50,200);
break;
case 4:
if (Windows1->Checked)
{
IMan->Canvas->Draw(X/25*25,Y/25*25,BitMapw);
}
else
{
IMan->Picture->Assign(BitMapl);
choice_coclour();
IMan->Canvas->Rectangle(X/25*25,Y/25*25,X/25*25+25,Y/25*25+25 );
}
break;
}
break;
}
}
else if (Button == mbLeft)
{
if (!man.control(X/25+shift_X, Y/25+shift_Y, vector, fign[cover],1)) // not 2,1 !!!
{
switch(vector)
{
case 0:
switch(fign[cover])
{
case 1:
mouse_down_left_0(X,Y,100,1);
break;
case 2:
mouse_down_left_0(X,Y,75,2);
break;
case 3:
mouse_down_left_0(X,Y,50,3);
break;
case 4:
mouse_down_left_0(X,Y,25,4);
break;
}
break;
case 1:
switch(fign[cover])
{
case 1:
mouse_down_left_1(X,Y,100,1);
break;
case 2:
mouse_down_left_1(X,Y,75,2);
break;
case 3:
mouse_down_left_1(X,Y,50,3);
break;
case 4:
mouse_down_left_1(X,Y,25,4);
break;
}
break;
}
if (cover==count_sh-1)
{
BitMapl->Assign(IMan->Picture); // if not shape!!!
BOkFull->Visible=true;
last_ship[0]=X/25+shift_X;
last_ship[1]=Y/25+shift_Y;
last_ship[2]=vector;
last_ship[3]=5-fign[cover];
BDelLastShip->Visible=true;
cover++;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ICompMouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
if (!TimerMachine->Enabled&&!ButtonChoiceScheme->Visible&&
!ButtonOwnScheme->Visible&&!PIThink->Visible&&!PNowYou->Visible&&
!PBegin->Visible&&!TimerAroundBrok->Enabled&&!BHideMap->Visible&&
!TimerTrassa->Enabled&&!TimerGo->Enabled&&!PWin->Visible&&
!TimerFlash->Enabled&&!TimerStart->Enabled&&!TimerRestart->Enabled)
{
int sum_brok=0;
left_right=1;
LastShoot1->Enabled=false;
switch (comp.show_bit(X/25,Y/25))
{
case 0:
result=0;
right_x=X/25;
right_y=Y/25;
comp.put_bit(right_x,right_y,3);
side(X/25,Y/25,0);
shoot_man++;
covered_man++;
need_man=0;
if (English1->Checked)
{
PManShoots->Caption="Shoots: "+IntToStr(shoot_man);
PManCovered->Caption="Covered: "+IntToStr(covered_man)+" % ";
}
else
{
PManShoots->Caption="Выстрелы: "+IntToStr(shoot_man);
PManCovered->Caption="Накрыто: "+IntToStr(covered_man)+" % ";
}
TimerAroundBrok->Enabled=true;
Kind1->Enabled=false;
break;
case 1:
LastShoot1->Enabled=true;
result=1;
right_x=X/25;
right_y=Y/25;
comp.put_bit(right_x,right_y,2);
side(X/25,Y/25,1);
review(X/25,Y/25);
shoot_man++;
covered_man=0;
for (int i=0;i<10;i++)
{
for (int j=0;j<10;j++)
{
if (comp.show_bit(i,j)==2)
{
covered_man++;
sum_brok++;
}
if (comp.show_bit(i,j)==3)
{
covered_man++;
}
}
}
need_man=1;
if (English1->Checked)
{
PManShoots->Caption="Shoots: "+IntToStr(shoot_man);
PManCovered->Caption="Covered: "+IntToStr(covered_man)+" % ";
}
else
{
PManShoots->Caption="Выстрелы: "+IntToStr(shoot_man);
PManCovered->Caption="Накрыто: "+IntToStr(covered_man)+" % ";
}
switch(count-sum_brok)
{
case 0:
Image56->Picture->Assign(IRed->Picture);
case 1:
Image55->Picture->Assign(IRed->Picture);
case 2:
Image54->Picture->Assign(IRed->Picture);
case 3:
Image53->Picture->Assign(IRed->Picture);
case 4:
Image52->Picture->Assign(IRed->Picture);
case 5:
Image51->Picture->Assign(IRed->Picture);
case 6:
Image50->Picture->Assign(IRed->Picture);
case 7:
Image49->Picture->Assign(IRed->Picture);
case 8:
Image48->Picture->Assign(IRed->Picture);
case 9:
Image47->Picture->Assign(IRed->Picture);
case 10:
Image46->Picture->Assign(IRed->Picture);
case 11:
Image45->Picture->Assign(IRed->Picture);
case 12:
Image44->Picture->Assign(IRed->Picture);
case 13:
Image43->Picture->Assign(IRed->Picture);
case 14:
Image42->Picture->Assign(IRed->Picture);
case 15:
Image41->Picture->Assign(IRed->Picture);
case 16:
Image40->Picture->Assign(IRed->Picture);
case 17:
Image39->Picture->Assign(IRed->Picture);
case 18:
Image38->Picture->Assign(IRed->Picture);
case 19:
Image37->Picture->Assign(IRed->Picture);
case 20:
Image36->Picture->Assign(IRed->Picture);
case 21:
Image35->Picture->Assign(IRed->Picture);
case 22:
Image34->Picture->Assign(IRed->Picture);
case 23:
Image33->Picture->Assign(IRed->Picture);
case 24:
Image32->Picture->Assign(IRed->Picture);
case 25:
Image31->Picture->Assign(IRed->Picture);
case 26:
Image30->Picture->Assign(IRed->Picture);
case 27:
Image29->Picture->Assign(IRed->Picture);
}
TimerAroundBrok->Enabled=true;
Kind1->Enabled=false;
break;
case 2:
case 3:
LastShoot1->Enabled=true;
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::marker_move(int x, int y)
{
IMan->Picture->Assign(BitMapl);
IMan->Canvas->Pen->Width=2;
IMan->Canvas->Pen->Mode=pmMergeNotPen;
IMan->Canvas->Ellipse(x-3,y-3,x+29,y+29);
IMan->Canvas->Pen->Width=1;
IMan->Canvas->Rectangle(x+12,y+12,x+14,y+14);
IMan->Canvas->Rectangle(x+12,y+6,x+14,y+9); //n
IMan->Canvas->Rectangle(x+12,y,x+14,y+4); //u
IMan->Canvas->Rectangle(x+12,y+16,x+14,y+19); //s
IMan->Canvas->Rectangle(x+12,y+21,x+14,y+25); //d
IMan->Canvas->Rectangle(x+6,y+12,x+9,y+14); //w
IMan->Canvas->Rectangle(x,y+12,x+4,y+14); //l
IMan->Canvas->Rectangle(x+16,y+12,x+19,y+14); //o
IMan->Canvas->Rectangle(x+21,y+12,x+25,y+14); //r
}
//--------------------------------------------------------------------
void __fastcall TForm1::TimerMachineTimer(TObject *Sender)
{
static int step_x;
static int step_y;
static int add_x_or_y;
int arr_tired[198]={0};
if (first==0&&tired_x<0)
{
first=1;
for (int i=0;i<10;i++)
{
for (int j=0;j<10;j++)
{
if (man.show_bit(i,j)==0||man.show_bit(i,j)==1)
{
arr_tired[tired*2]=i;
arr_tired[tired*2+1]=j;
tired++;
}
}
}
tired=(rand()%tired)*2;
step_x=arr_tired[tired];
step_y=arr_tired[tired+1];
tired=0;
PMyShoot->Visible=true;
PYourShoot->Visible=false;
marker_move(step_x*25,step_y*25);
}
else
{
if (tired_x<0)
{
count_mach++;
if (!(count_mach%2)&&!ms)
{
int step=rand()%100;
if (step<25)
{
if (step_x>0)
{
step_x--;
add_x_or_y=2;
}
else
{
step_x++;
add_x_or_y=1;
}
}
else if (step<50)
{
if (step_x<9)
{
step_x++;
add_x_or_y=1;
}
else
{
step_x--;
add_x_or_y=2;
}
}
else if (step<75)
{
if (step_y>0)
{
step_y--;
add_x_or_y=4;
}
else
{
step_y++;
add_x_or_y=3;
}
}
else
{
if (step_y<9)
{
step_y++;
add_x_or_y=3;
}
else
{
step_y--;
add_x_or_y=4;
}
}
}
if (count_mach%2)
{
marker_move(step_x*25,step_y*25);
}
else
{
count_mach--;
ms++;
if (ms>3)
{
count_mach++;
ms=0;
}
else
{
switch(add_x_or_y)
{
case 1:
marker_move(step_x*25-(24-6*ms),step_y*25);
break;
case 2:
marker_move(step_x*25+(24-6*ms),step_y*25);
break;
case 3:
marker_move(step_x*25,step_y*25-(24-6*ms));
break;
case 4:
marker_move(step_x*25,step_y*25+(24-6*ms));
break;
}
}
}
}
else
{
tired=0;
count_mach=19;
tired_x=-1;
step_x=need_x;
step_y=need_y;
PYourShoot->Visible=false;
PMyShoot->Visible=true;
}
if (count_mach==19) //20
{
left_right=0;
if (man.show_bit_deep(step_x,step_y)==1&&man.show_bit(step_x,step_y)!=1)
{
write_read_arr_tired(arr_tired);
}
else
{
switch (man.show_bit(step_x,step_y))
{
case 0:
tired=0;
result=0;
man.put_bit(step_x,step_y,3);
IMan->Picture->Assign(BitMapl);
mside(step_x,step_y,0);
first=0;
count_mach=0;
brok_milk(step_x,step_y);
if (radar_sensitivity&&Heavily1->Checked)
{
switch (radar_sensitivity)
{
case 3:
write_deep(step_x,step_y,3);
break;
case 2:
write_deep(step_x,step_y,2);
break;
case 1:
write_deep(step_x,step_y,1);
break;
}
}
PMyShoot->Visible=false;
PYourShoot->Visible=true;
break;
case 1:
need=1;
tired=0;
result=1;
man.put_bit(step_x,step_y,2);
//---------------------------------------------------------------------------
void __fastcall TForm1::BNemoClick(TObject *Sender)
{
begin_move();
PYourShoot->Visible=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BMachineClick(TObject *Sender)
{
begin_move();
PMyShoot->Visible=true;
TimerMachine->Enabled=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TimerAroundBrokTimer(TObject *Sender)
{
if (!repeat)
{
case 0:
switch(repeat)
{
case 0:
{
explotion(1);
}
if (School1->Checked)
BitMapb->Assign(IMS1->Picture);
else if (Windows1->Checked)
BitMapb->Assign(IRecy1->Picture);
else
BitMapb->Assign(Milk01->Picture);
break;
}
repeat++;
if (left_right==0)
{
IMan->Canvas->Draw(need_x*25,need_y*25,BitMapb); // */
last_x_show=need_x;
last_y_show=need_y;
}
else
IComp->Canvas->Draw(right_x*25,right_y*25,BitMapb); // */
BitMapl->Assign(IMan->Picture); // if not shape!!!
if (repeat==10)
{
repeat=0;
NewGame1->Enabled=true;
TimerAroundBrok->Enabled=false;
Kind1->Enabled=true;
if (left_right==0)
}
switch(result)
{
case 0:
if (need==1)
{
need_x=last_x;
need_y=last_y;
}
if (side_x_y==1)
{
side_x_y=0;
need=0;
int game_end=0; //0;
for (int i=0;i<10;i++)
{
for (int j=0;j<10;j++)
{
if (man.show_bit(i,j)==1)
game_end=1;
}
}
if (!game_end)
end_game(1);
else
{
if (!RadarOFF1->Checked&&set_radar)
{
need=1;
serch_near_target();
}
else
{
TimerMachine->Enabled=true;
Kind1->Enabled=false;
}
}
}
else
{
serch_near_target();
}
break;
}
}
else
{
int game_end=0;
if (result==0)
{
TimerMachine->Enabled=true;
Kind1->Enabled=false;
}
else
{
for (int i=0;i<10;i++)
{
for (int j=0;j<10;j++)
{
if (comp.show_bit(i,j)==1)
game_end=1;
}
}
if (!game_end)
end_game(0);
}
if (need_man==0&&need==1)
serch_near_target();
}
}
if (tired_x==0) //&&need==0)
{
TimerMachine->Enabled=false;
TimerGo->Enabled=true;
Kind1->Enabled=false;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Example1Click(TObject *Sender)
{
if (BHideExample->Visible)
{
Kind1->Enabled=true;
ButtonChoiceScheme->Enabled=true;
BHideExample->Visible=false;
IMan->Canvas->Draw(0,0,BitMapl);
cover=0;
count=0;
count_sh=0;
vector=1;
for ( int i=0;i<16;i++ )
{
fign[i]=0;
}
for (int x=0;x<10;x++)
{
for (int y=0;y<10;y++)
{
man.put_bit(x,y,0);
}
}
}
else
{
Kind1->Enabled=false;
switch (RadioGroup1->ItemIndex)
{
case 0:
count=20;
count_sh=10;
break;
case 1:
count=25;
count_sh=9;
break;
case 2:
count=20;
count_sh=12;
break;
case 3:
count=20;
count_sh=10;
RadioGroup1->ItemIndex=0;
break;
}
ButtonChoiceScheme->Enabled=false;
BHideExample->Visible=true;
man.next_ship(RadioGroup1->ItemIndex,1);
show_example();
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BHideExampleClick(TObject *Sender)
{
Kind1->Enabled=true;
ButtonChoiceScheme->Enabled=true;
BHideExample->Visible=false;
IMan->Canvas->Draw(0,0,BitMapl);
cover=0;
count=0;
count_sh=0;
vector=1;
for ( int i=0;i<16;i++ )
{
fign[i]=0;
}
for (int x=0;x<10;x++)
{
for (int y=0;y<10;y++)
{
man.put_bit(x,y,0);
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ShowMap1Click(TObject *Sender)
{
if (BHideMap->Visible)
{
Kind1->Enabled=true;
IComp->Picture->Assign(BitMap);
BHideMap->Visible=false;
PCompCovered->Visible=true;
PCompShoots->Visible=true;
BCompResults->Visible=true;
}
else
{
con_man=1;
Kind1->Enabled=false;
BHideMap->Visible=true;
PCompCovered->Visible=false;
PCompShoots->Visible=false;
BCompResults->Visible=false;
BitMap->Assign(IComp->Picture);
if (School1->Checked)
IComp->Picture->Assign(ISchool->Picture);
else if (Windows1->Checked)
IComp->Picture->Assign(IWindows->Picture);
else
IComp->Picture->Assign(BitMaprr);
for (int x=0;x<10;x++)
{
for (int y=0;y<10;y++)
{
paint_array(x,y);
}
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BHideMapClick(TObject *Sender)
{
Kind1->Enabled=true;
IComp->Picture->Assign(BitMap);
BHideMap->Visible=false;
PCompCovered->Visible=true;
PCompShoots->Visible=true;
BCompResults->Visible=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::brok_milk(int x, int y)
{
need_x=x;
need_y=y;
shoot_comp++;
covered_comp=0;
for (int i=0;i<10;i++)
{
for (int j=0;j<10;j++)
{
if (man.show_bit(i,j)==2)
{
covered_comp++;
}
if (man.show_bit(i,j)==3)
{
covered_comp++;
}
}
}
if (English1->Checked)
{
PCompShoots->Caption="Shoots: "+IntToStr(shoot_comp);
PCompCovered->Caption="Covered: "+IntToStr(covered_comp)+" % ";
}
else
{
PCompShoots->Caption="Выстрелы: "+IntToStr(shoot_comp);
PCompCovered->Caption="Накрыто: "+IntToStr(covered_comp)+" % ";
}
TimerMachine->Enabled=false;
TimerAroundBrok->Enabled=true;
Kind1->Enabled=false;
}
//--------------------------------------------------------------------------
void __fastcall TForm1::end_game(int man_com)
{
if(man_com)
{
for (int i=0;i<10;i++)
{
for (int j=0;j<10;j++)
{
if (comp.show_bit(i,j)==1)
{
if (School1->Checked)
{
IComp->Canvas->Pen->Width=3;
IComp->Canvas->Pen->Color=clBlue; //Navy;
IComp->Canvas->Brush->Color=clGray;
IComp->Canvas->Rectangle(i*25+1,j*25+1,i*25+25-1,j*25+25-1);
}
else if (Windows1->Checked)
IComp->Canvas->Draw(i*25,j*25,BitMapw);
else
{
IComp->Canvas->Brush->Color = clTeal;
IComp->Canvas->Pen->Color = clTeal;
IComp->Canvas->Rectangle(i*25,j*25,i*25+25,j*25+25);
}
}
}
}
PWin->Visible=true;
Win->Caption="Я Выиграл!!!";
PMyShoot->Visible= false;
Language1->Enabled=false;
Kind1->Enabled=false;
OwnMap1->Enabled=false;
ShowMap1->Enabled=false;
count_man_com(1);
}
else
{
if (Show1->Enabled)
{
for (int i=0;i<10;i++)
{
for (int j=0;j<10;j++)
{
if (man.show_bit(i,j)==1)
{
if (School1->Checked)
{
IMan->Canvas->Pen->Width=3;
IMan->Canvas->Pen->Color=clBlue; //Navy;
IMan->Canvas->Brush->Color=clGray;
IMan->Canvas->Rectangle(i*25+1,j*25+1,i*25+25-1,j*25+25-1);
}
else if (Windows1->Checked)
IMan->Canvas->Draw(i*25,j*25,BitMapw);
else
{
IMan->Canvas->Brush->Color = clTeal;
IMan->Canvas->Pen->Color = clTeal;
IMan->Canvas->Rectangle(i*25,j*25,i*25+25,j*25+25);
}
}
}
}
}
PWin->Visible=true;
if (con_man)
{
else
PWin->Caption="Вы Выиграли!!!";
count_man_com(0);
}
PYourShoot->Visible=false;
Language1->Enabled=false;
Kind1->Enabled=false;
OwnMap1->Enabled=false;
ShowMap1->Enabled=false;
}
PWont->Visible=true;
BYes->Visible=true;
BNo->Visible=true;
}
//---------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "AboutForm.h"
//---------------------------------------------------------------------
#pragma resource "*.dfm"
TAboutBox *AboutBox;
//---------------------------------------------------------------------
__fastcall TAboutBox::TAboutBox(TComponent* AOwner)
: TForm(AOwner)
{
}
//---------------------------------------------------------------------
void __fastcall TAboutBox::OKButtonClick(TObject *Sender)
{
Timer1->Enabled=false;
AboutBox->Hide();
}
//---------------------------------------------------------------------------
void __fastcall TAboutBox::Timer1Timer(TObject *Sender)
{
static int animation;
switch (animation)
{
case 0:
Image1->Show();
Image2->Hide();
break;
case 1:
Image2->Show();
Image1->Hide();
break;
case 2:
Image3->Show();
Image2->Hide();
break;
case 3:
Image4->Show();
Image3->Hide();
break;
case 4:
Image5->Show();
Image4->Hide();
break;
case 5:
Image6->Show();
Image5->Hide();
break;
animation=-1;
break;
}
animation++;
}
//---------------------------------------------------------------------------
Заключение
Результаты тестирования показывают, что программа работает корректно и выполняет поставленную задачу, а именно реализует игру сапер. В чем мы и убедились в ходе тестирования данного программного обеспечения.
Список использованных источников
-
Создание приложений на GTK+ с использованием среды Glade
-
Krause, A. Foundations of GTK+ Development. Apress, 2007.
-
Мэтью Н., Стоунс Р. Основы программирования в Linux: 4-е издание. С-Пб: БХВ-Петербург, 2009. – 896 с.
-
Руководство GTK+ 2.0
-
Примеры использования Cairo
-
Краткое руководство по Cairo
-
Кроссплатформенный анимированный осциллограф на GTK+
-
М. Эллис, Б. Строуструп. Справочное руководство по языку C++ с комментариями: Пер. с англ. - Москва: Мир, 1992. 445с.
-
Стенли Б. Липпман. C++ для начинающих: Пер. с англ. 2тт. - Москва: Унитех; Рязань: Гэлион, 1992, 304-345сс.
-
Бруно Бабэ. Просто и ясно о Visual C++: Пер. с англ. - Москва: БИНОМ, 1994. 400с.