Проектирование и разработка программных продуктов на примере разработки игрового приложения «Reversi», страница 3

}

// функция сохранения игры в файл name, возвращает статус успешности сохранения

int cReversi::SaveGame(char *name)

{

 FILE *f;

 f=fopen(name,"wb");

 if (f==NULL)

  return 0;

 fwrite(&numTurns,sizeof(int),1,f);    

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

 {

  fwrite(turn+i,sizeof(cTurn),1,f);

 }

 fclose(f);

 return 1;

}

//  функция рисования области игрового поля

void __fastcall TForm1::PaintBox1Paint(TObject *Sender)

{

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

        {

         PaintBox1->Canvas->MoveTo(50*i+50,0);

         PaintBox1->Canvas->LineTo(50*i+50,450);

         PaintBox1->Canvas->MoveTo(0,50*i+50);

        PaintBox1->Canvas->LineTo(450,50*i+50);

        }

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

  for (int j=0; j<8; j++)

  {

   if (Game.getPlayer(i,j)==0)

    PaintBox1->Canvas->Draw(i*50+50,j*50+50,RedC->Picture->Graphic);

   if (Game.getPlayer(i,j)==1)

    PaintBox1->Canvas->Draw(i*50+50,j*50+50,BlueC->Picture->Graphic);

  }

}

// функция замены цветов шарика для текущего хода thisTurn

void cReversi::SetColor(cTurn thisTurn)

{

 int flag=0;

 if(CanMoveTo(thisTurn.x,thisTurn.y,thisTurn.player))

  Table[thisTurn.x][thisTurn.y]=thisTurn.player;

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

  for (int j=0; j<Width; j++)

   if (Table[i][j]==thisTurn.player)

   {

    if (i==thisTurn.x)

    {

     flag=0;

     for (int k=min(j,thisTurn.y)+1;k<max(j,thisTurn.y);k++)

      if (Table[i][k]==-1)

       flag=1;

     if (!flag)

     for (int k=min(j,thisTurn.y)+1;k<max(j,thisTurn.y);k++)

      Table[i][k]=thisTurn.player;

      continue;

    }

    if (j==thisTurn.y)

    {

     flag=0;

     for (int k=min(i,thisTurn.x)+1;k<max(i,thisTurn.x);k++)

      if (Table[k][j]==-1)

        flag=1;

     if (!flag)

     for (int k=min(i,thisTurn.x)+1;k<max(i,thisTurn.x);k++)

      Table[k][j]=thisTurn.player;

      continue;

    }

    int dx,dy;

    dx=i-thisTurn.x;

    dy=j-thisTurn.y;

    if (abs(dx)==abs(dy))

    {

     flag=0;

     for (int k=0; k<abs(dx); k++)

      if (Table[i+k*sign(-dx)][j+k*sign(-dy)]==-1)

        flag=1;

     if (!flag)

     for (int k=0; k<abs(dx); k++)

      Table[i+k*sign(-dx)][j+k*sign(-dy)]=thisTurn.player;

    }

   }

}

//функция загрузки фонового рисунка

void __fastcall TForm1::N5Click(TObject *Sender)

{

 if (OpenDialog2->Execute())

  {

    ImageFon->Picture->LoadFromFile(OpenDialog2->FileName);

  }

 ReBuildList();

 PaintBox1->Refresh();

}

// функция обработки ситуации при отсутствии ходов

void __fastcall TForm1::CheckGame()

{

 if (Game.isGameOver())

 {

  AnsiString s;

  s="Счет(К:С):"+IntToStr(Game.GetNum(0));

  s+=":"+IntToStr(Game.GetNum(1));

  MessageBox(Handle,s.c_str(),"Игра Окончена",0);

  return;

 }

 if (Game.GetMoveTable(player,movs)==0)

 {

  MessageBoxA(Handle,"У игрока нет возможных ходов","Предупреждение",0);

  player=oplayer(player);

  Game.GetMoveTable(player,movs);

 }

}

// функция возврата игры к выбранному ходу

void __fastcall TForm1::ListBox1DblClick(TObject *Sender)

{

 if (ListBox1->ItemIndex==-1)

  return;

 if (ListBox1->ItemIndex==0)

  Game.NewGame();

 Game.SetTurn(ListBox1->ItemIndex);

 player=oplayer(Game.GetTurn(Game.GetNumTurns()-1).player);