Реферат: Создание сетевой игры

--PAGE_BREAK--NetBios
Протокол NetBios работает на трех уровнях семиуровневой модели OSI: сетевом уровне, транспортном уровне и на уровне каналов связи. Уровень каналов связи обеспечивает механизм обмена сообщениями между программами, работающими на станциях в рамках канала связи или сессии. NETBIOS может обеспечить интерфейс более высокого уровня, чем протоколы IPX и SPX.
Протокол NETBIOS поддерживается в сетях IBM (IBM PC LAN), Novell NetWare, Microsoft Windows for Workgroups и в других сетях. К сожалению, нет единого стандарта на протокол NETBIOS, поэтому в сетевом программном обеспечении разных фирм используются разные интерфейсы для вызова команд NETBIOS.
С нашей точки зрения, наибольший интерес представляет применение NETBIOS в сетях Novell NetWare и Microsoft Windows for Workgroups. Мы рассмотрим основные возможности NETBIOS, связанные с передачей данных между рабочими станциями в пределах одного логического сегмента сети. Использовать NETBIOS проще, чем IPX или SPX. Однако, так как в среде Novell NetWare нужен специальный эмулятор NETBIOS, эффективность работы программы может снизиться. Кроме того, для эмулятора нужна дополнительная память, так как он реализован в виде резидентной программы.
Адресация станций и программ
Для идентификации рабочей станции протоколы IPX и SPX используют номер сети, адрес станции в сети и сокет. Адрес станции определяется на аппаратном уровне и представляет собой число длиной 6 байт. Номер сети занимает 4 байта. Сокеты выделяются динамически драйвером протокола IPX или могут быть получены в Novell.
Протокол NETBIOS использует другой механизм адресации станций и программ. Для адресации станции используются имена размером 16 байт. Каждая станция имеет одно постоянное имя (permanent name), которое образуется из аппаратного адреса добавлением к нему слева десяти нулевых байт. Кроме постоянного имени протокол NETBIOS позволяет добавлять (и удалять) обычные имена и групповые имена. Обычные имена служат для идентификации рабочей станции, групповые могут служить для посылки пакетов одновременно нескольким станциям в сети. Постоянное имя удалить нельзя, так как оно полностью определяется аппаратным обеспечением станции.
При добавлении обычного имени протокол NETBIOS опрашивает всю сеть для проверки уникальности имени. Групповое имя может быть одинаковое на нескольких станциях, поэтому при добавлении группового имени опрос сети не выполняется.
После добавления нового имени этому имени присваивается так называемый номер имени (name number), который используется для передачи данных по сети.
Сравнивая методы адресации, используемые протоколами IPX/SPX и NETBIOS, нетрудно заметить, что метод адресации протокола NETBIOS более удобен. Вы можете адресовать данные не только одной станции (как в IPX и SPX) или всем станциям сразу (как в IPX), но и группам станций, имеющим одинаковое групповое имя. Это может быть удобно, если в сети работают несколько групп пользователей, которые интенсивно обмениваются данными между собой.
Другим преимуществом схемы адресации протокола NETBIOS перед схемой адресации протоколов IPX/SPX можно считать отсутствие необходимости получать в фирме Novell свой собственный номер сокета для идентификации вашего программного обеспечения. Вы можете придумать свое собственное уникальное групповое имя, включающее, например, название программы и вашей фирмы, и использовать его для работы по схеме клиент-сервер.

MailSlot Канал Mailslotxe «Mailslot» создается серверным процессом с помощью специально предназначенной для этого функции CreateMailslot. После создания серверный процесс получает идентификатор канала Mailslot. Пользуясь этим идентификатором, сервер может читать сообщения, посылаемые в канал клиентскими процессами. Однако сервер не может выполнять над каналом Mailslot операцию записи, так как этот канал предназначен только для односторонней передачи данных — от клиента к серверу. При ошибке функцией CreateMailslotxe «Mailslot» возвращается значение INVALID_HANDLE_VALUExe «INVALID_HANDLE_VALUE». Код ошибки можно определить при помощи функции GetLastErrorxe «GetLastError».
Прежде чем приступить к работе с каналом Mailslotxe «Mailslot», клиентский процесс должен его открыть. Для выполнения этой операции следует использовать функцию CreateFilexe «CreateFile». Запись сообщений в канал Mailslotxe «Mailslot» выполняет клиентский процесс, вызывая для этого функцию WriteFile.
Серверный процесс может читать сообщения из созданного им канала Mailslotxe «Mailslot» при помощи функции ReadFile. Заметим, что перед выполнением операции чтения следует проверить состояние канала Mailslotxe «Mailslot». Если в нем нет сообщений, то функцию ReadFilexe «ReadFile» вызывать не следует. Для проверки состояния канала вы должны воспользоваться функцией GetMailslotxe «GetMailslot»Info. С помощью функции SetMailslotxe «SetMailslot»xe «Mailslot»Info серверный процесс может изменить время ожидания для канала Mailslot уже после его создания.

Исходники
Main.cpp
#include <vcl.h>
#include <stdlib.h>
#include <StrUtils.hpp>
#pragma hdrstop
#include «Main.h»
#include «Podkluch.h»
#include «GameParam.h»
#include «About.h»
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link «LMDCustomBevelPanel»
#pragma link «LMDCustomControl»
#pragma link «LMDCustomPanel»
#pragma link «LMDSimplePanel»
#pragma link «LMDBackPanel»
#pragma link «LMDCustomParentPanel»
#pragma link «LMDBaseControl»
#pragma link «LMDBaseGraphicControl»
#pragma link «LMDBaseLabel»
#pragma link «LMDControl»
#pragma link «LMDCustomSimpleLabel»
#pragma link «LMDSimpleLabel»
#pragma link «lmdcont»
#pragma link «LMDCustomComponent»
#pragma link «LMDCustomStatusBar»
#pragma link «LMDStatusBar»
#pragma link «LMDCustomPanelFill»
#pragma link «LMDPanelFill»
#pragma link «LMDCustomScrollBox»
#pragma link «LMDListBox»
#pragma link «LMDCustomFormFill»
#pragma link «LMDFormFill»
#pragma link «LMDWndProcComponent»
#pragma link «LMDBaseShape»
#pragma link «LMDShapeControl»
#pragma link «LMDCustomLabel»
#pragma link «LMDDrawEdge»
#pragma link «LMDLabel»
#pragma link «LMDBaseImage»
#pragma link «LMDCustomGroupBox»
#pragma link «LMDCustomLImage»
#pragma link «LMDGraphicControl»
#pragma link «LMDGroupBox»
#pragma link «LMDLImage»
#pragma link «LMDBaseGraphicButton»
#pragma link «LMDCustomShapeButton»
#pragma link «LMDShapeButton»
#pragma resource "*.dfm"
TMainForm *MainForm;
extern bool IsServer;
extern AnsiString Protocoli[];
extern int KolKub;
extern int MaxOch;
extern int choosenProt;
extern AnsiString ServerHostName;
extern AnsiString ServerHostIP;
extern bool IsHostName;
extern bool IsIgrayut;
extern int NomHoda;
extern int MyCurOch;
extern int MyWholeOch;
extern int HisWholeOch;
extern bool IsYaFixed;
extern bool IsHeFixed;
extern int HisWinPoPartiam;
extern int MyWinPoPartiam;
extern int NomPartia;
int *MasPriem;
//---------------------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner)
       : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::FormCreate(TObject *Sender)
{
    FirstTimeShow=true;
    IsVisitApplicationBox=false;
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::FormActivate(TObject *Sender)
{
    if(FirstTimeShow)
    {
        FirstTimeShow=false;
        InterfaceBezIgri();
        menuBeginClick(this);
    }
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::menuBeginClick(TObject *Sender)
{
    if (IsIgrayut)
    {
        menuStopClick(this);
        if (IsIgrayut) return;
    }
    if (UstanParametrov())     //вызов 2-х форм для установки параметров
    {
        //----подключение----
        switch(choosenProt)
        {
            case 0:
                 IPXConnect();
                 break;
            case 1:
                 TCPIPConnect();
                 break;
            case 2:
                 NetBiosConnect();
                 break;
            case 3:
                 MailSlotConnect();
                 break;
            case 4:
                 PipeConnect();
                 break;
        }
        if(IsServer) lbStat->Caption=«Ожидается соединение с клиентом...»;
    }
}
//---------------------------------------------------------------------------
bool __fastcall TMainForm::UstanParametrov(void)
{
 int md1,md2;
 for(;;)
 {
        md1=FormParamConnect->ShowModal();
        FormParamConnect->Close();
        if (md1==mrOk)
        {
           if (IsServer)
           {
                md2=FormGameParam->ShowModal();
                if (md2==mrOk) return 1;
                else continue;
           }
           else return 1;
        }
        else return 0;
 }
}
void __fastcall TMainForm::OtobrazhDannihSopernika(int *MasPriem)
{
 Graphics::TBitmap *Bitmap2 = new Graphics::TBitmap();
 AnsiString strCat;
 if(IsServer)
 {
   strCat="_2";
 }
 else
 {
   strCat="";
 }
if(KolKub==1)
{
  Bitmap2->LoadFromResourceName((unsigned int)HInstance,«KUB»+IntToStr(MasPriem[3])+strCat);
  Kubiki2[0]->Picture->Bitmap=Bitmap2;
  Kubiki2[0]->Left=MasPriem[4];
  Kubiki2[0]->Top=MasPriem[5];
  Kubiki2[0]->Visible=true;
}
else if (KolKub==2)
{
  Bitmap2->LoadFromResourceName((unsigned int)HInstance,«KUB»+IntToStr(MasPriem[3])+strCat);
  Kubiki2[0]->Picture->Bitmap=Bitmap2;
  Kubiki2[0]->Left=MasPriem[4];
  Kubiki2[0]->Top=MasPriem[5];
  Kubiki2[0]->Visible=true;
  Bitmap2->LoadFromResourceName((unsigned int)HInstance,«KUB»+IntToStr(MasPriem[6])+strCat);
  Kubiki2[1]->Picture->Bitmap=Bitmap2;
  Kubiki2[1]->Left=MasPriem[7];
  Kubiki2[1]->Top=MasPriem[8];
  Kubiki2[1]->Visible=true;
}
else if (KolKub==3)
{
  Bitmap2->LoadFromResourceName((unsigned int)HInstance,«KUB»+IntToStr(MasPriem[3])+strCat);
  Kubiki2[0]->Picture->Bitmap=Bitmap2;
  Kubiki2[0]->Left=MasPriem[4];
  Kubiki2[0]->Top=MasPriem[5];
  Kubiki2[0]->Visible=true;
  Bitmap2->LoadFromResourceName((unsigned int)HInstance,«KUB»+IntToStr(MasPriem[6])+strCat);
  Kubiki2[1]->Picture->Bitmap=Bitmap2;
  Kubiki2[1]->Left=MasPriem[7];
  Kubiki2[1]->Top=MasPriem[8];
  Kubiki2[1]->Visible=true;
  Bitmap2->LoadFromResourceName((unsigned int)HInstance,«KUB»+IntToStr(MasPriem[9])+strCat);
  Kubiki2[2]->Picture->Bitmap=Bitmap2;
  Kubiki2[2]->Left=MasPriem[10];
  Kubiki2[2]->Top=MasPriem[11];
  Kubiki2[2]->Visible=true;
}
else
{
  Bitmap2->LoadFromResourceName((unsigned int)HInstance,«KUB»+IntToStr(MasPriem[3])+strCat);
  Kubiki2[0]->Picture->Bitmap=Bitmap2;
  Kubiki2[0]->Left=MasPriem[4];
  Kubiki2[0]->Top=MasPriem[5];
  Kubiki2[0]->Visible=true;
  Bitmap2->LoadFromResourceName((unsigned int)HInstance,«KUB»+IntToStr(MasPriem[6])+strCat);
  Kubiki2[1]->Picture->Bitmap=Bitmap2;
  Kubiki2[1]->Left=MasPriem[7];
  Kubiki2[1]->Top=MasPriem[8];
  Kubiki2[1]->Visible=true;
  Bitmap2->LoadFromResourceName((unsigned int)HInstance,«KUB»+IntToStr(MasPriem[9])+strCat);
  Kubiki2[2]->Picture->Bitmap=Bitmap2;
  Kubiki2[2]->Left=MasPriem[10];
  Kubiki2[2]->Top=MasPriem[11];
  Kubiki2[2]->Visible=true;
  Bitmap2->LoadFromResourceName((unsigned int)HInstance,«KUB»+IntToStr(MasPriem[12])+strCat);
  Kubiki2[3]->Picture->Bitmap=Bitmap2;
  Kubiki2[3]->Left=MasPriem[13];
  Kubiki2[3]->Top=MasPriem[14];
  Kubiki2[3]->Visible=true;
}
  HisWholeOch=MasPriem[2];
  lbHisWholeOch->Caption=IntToStr(MasPriem[2]);
delete Bitmap2;
}
//-----------пришли данные соперника--------------------------------------------
void __fastcall TMainForm::Priem(int *MasPriem)
{
  if(MasPriem[0]==0) //первый ответ сервера клиенту
  {
        AnsiString mess;
        mess=«Ваш соперник выбрал следующие параметры игры:\nКоличество кубиков: „+IntToStr(MasPriem[1])+“\nМаксимальное количество очков: „+IntToStr(MasPriem[2]);
        IsVisitApplicationBox=true;
        Application->MessageBoxA(mess.c_str(),“Параметры игры»,MB_OK);
        KolKub=MasPriem[1];
        MaxOch=MasPriem[2];
        InterfaceBeginNewGame();
        ChangeInterfacePerehodHoda(0);
        IsVisitApplicationBox=false;
  }
  else if (MasPriem[0]==1)  //соперник бросил
  {
     shapeBrosil->Brush->Color=0x0000CE00;
     OtobrazhDannihSopernika(MasPriem);
     if(!IsServer)
     {
        NomHoda++;
     }
     enum TypeDannihForTabl DannieForTabl;
     DannieForTabl=hebrosil;
     ZapolnTabl(DannieForTabl);
     if(IsYaFixed && HisWholeOch>MyWholeOch && HisWholeOch<=MaxOch)
     {
        ViProigrali();
     }
     else if (HisWholeOch>MaxOch)
     {
        lbHisWholeOch->Font->Color=clRed;
        ViViigrali();
     }
     else if(IsYaFixed && HisWholeOch<=MyWholeOch)
     {
        ChangeInterfacePerehodHoda(0);
     }
     else
     {
        ChangeInterfacePerehodHoda(1);
     }
  }
  else if (MasPriem[0]==2)  //соперник зафиксировал
  {
     IsHeFixed=true;
     lbHisWholeOch->Font->Color=clRed;
     shapeFixed->Brush->Color=0x000000CE;
     if(!IsServer)
     {
        NomHoda++;
     }
     enum TypeDannihForTabl DannieForTabl;
     DannieForTabl=hefixed;
     ZapolnTabl(DannieForTabl);
     if(IsYaFixed && MyWholeOch==HisWholeOch)
     {
        Nichia();
     }
     else if(MyWholeOch>HisWholeOch)
     {
        ViViigrali();
     }
     else
     {
        ChangeInterfacePerehodHoda(1);
     }
  }
  else if (MasPriem[0]==3) //соперник разорвал соединение
  {
      IsVisitApplicationBox=true;
      Application->MessageBoxA(«Ваш соперник разорвал соединение.\nИгра окончена.»,«Разрыв соединения»,MB_OK);
      switch(choosenProt)
      {
         case 0:
            IPXCloseConnection();
            break;
         case 1:
            TCPIPCloseConnection();
            break;
         case 2:
            NetBiosCloseConnection();
            break;
         case 3:
            MailSlotCloseConnection();
            break;
         case 4:
            PipeCloseConnection();
            break;
      }
      for (int i=0;i<KolKub;i++)
      {
          delete Kubiki1[i];
          delete Kubiki2[i];
      }
      IsIgrayut=false;
      InterfaceBezIgri();
      IsVisitApplicationBox=false;
  }
  delete [] MasPriem;
}
//----------------процедура заполнения таблицы----------------------------------
void __fastcall TMainForm::ZapolnTabl(enum TypeDannihForTabl DannieForTabl)
{
  if(IsServer)
  {
     if(DannieForTabl==yabrosil)
     {
        listboxOchki->Items->Add("          "+IntToStr(NomHoda)+";         "+IntToStr(MyCurOch));
        listboxOchki->TopIndex=NomHoda-1;
        if(NomHoda==9)
        {
            listboxOchki->Width=236;
    продолжение
--PAGE_BREAK--            listboxOchki->Left=14;
        }
     }
     else if (DannieForTabl==yafixed)
     {
        listboxOchki->Items->Add("          "+IntToStr(NomHoda)+";         0");
        listboxOchki->TopIndex=NomHoda-1;
        if(NomHoda==9)
        {
            listboxOchki->Width=236;
            listboxOchki->Left=14;
        }
     }
     else if (DannieForTabl==hebrosil)
     {
        listboxOchki->SetItemPart(NomHoda-1,2,"         "+IntToStr(MasPriem[1]));
        listboxOchki->TopIndex=NomHoda-1;
     }
     else
     {
        listboxOchki->SetItemPart(NomHoda-1,2,"         0");
        listboxOchki->TopIndex=NomHoda-1;
     }
  }
  else
  {
     if(DannieForTabl==yabrosil)
     {
        listboxOchki->SetItemPart(NomHoda-1,1,"         "+IntToStr(MyCurOch));
        listboxOchki->TopIndex=NomHoda-1;
     }
     else if (DannieForTabl==yafixed)
     {
        listboxOchki->SetItemPart(NomHoda-1,1,"         0");
        listboxOchki->TopIndex=NomHoda-1;
     }
     else if (DannieForTabl==hebrosil)
     {
        listboxOchki->Items->Add("          "+ IntToStr(NomHoda)+";;         "+IntToStr(MasPriem[1]));
        listboxOchki->TopIndex=NomHoda-1;
        if(NomHoda==9)
        {
            listboxOchki->Width=236;
            listboxOchki->Left=14;
        }
     }
     else
     {
        listboxOchki->Items->Add("          "+ IntToStr(NomHoda)+";;         0");
        listboxOchki->TopIndex=NomHoda-1;
        if(NomHoda==9)
        {
            listboxOchki->Width=236;
            listboxOchki->Left=14;
        }
     }
   }
}
//------------------------------Результаты--------------------------------------
void __fastcall TMainForm::ViProigrali(void)
{
  IsVisitApplicationBox=true;
  HisWinPoPartiam++;
  Application->MessageBoxA(«Вы проиграли!\nИграем дальше!»,«Поражение»,MB_OK+MB_ICONEXCLAMATION);
  InterfaceIgraemDalshe();
  IsVisitApplicationBox=false;
}
//---------------------------------
void __fastcall TMainForm::ViViigrali(void)
{
  IsVisitApplicationBox=true;
  MyWinPoPartiam++;
  Application->MessageBoxA(«Вы выиграли!\nИграем дальше!»,«Победа!!»,MB_OK+MB_ICONEXCLAMATION);
  InterfaceIgraemDalshe();
  IsVisitApplicationBox=false;
}
//----------------------------------
void __fastcall TMainForm::Nichia(void)
{
  IsVisitApplicationBox=true;
  MyWinPoPartiam++;
  HisWinPoPartiam++;
  Application->MessageBoxA(«Вы сыграли вничью!\nИграем дальше!»,«Ничья»,MB_OK+MB_ICONEXCLAMATION);
  InterfaceIgraemDalshe();
  IsVisitApplicationBox=false;
}
//----------------------------------------------------------------------------
void __fastcall TMainForm::menuOProgrClick(TObject *Sender)
{
FormAbout->ShowModal();
}
//----------------------------Интерфейсы---------------------------------------
void __fastcall TMainForm::InterfaceBezIgri(void)
{
   MyWholeOch=0;
   HisWholeOch=0;
   MyCurOch=0;
   NomHoda=0;
   IsYaFixed=false;
   IsHeFixed=false;
   NomPartia=0;
   MyWinPoPartiam=0;
   HisWinPoPartiam=0;
   ServerHostName="";
   ServerHostIP="";
   IsIgrayut=false;
   menuStop->Enabled=false;
   panParam->Visible=false;
   lbNomPartia->Visible=false;
   panSchetPoPartiam->Visible=false;
   gbPole1->Top=15;
   gbPole2->Top=15;
   gbTabl->Top=15;
   this->Height=400;
   this->Caption=«Игровое поле»;
   btBrosit->Enabled=false;
   btFix->Enabled=false;
   btBrosit->Color=clCream;
   btFix->Color=clCream;
   shapeBrosil->Brush->Color=clSilver;
   shapeFixed->Brush->Color=clSilver;
   shapeBrosil->Caption->Font->Color=clWhite;
   shapeFixed->Caption->Font->Color=clWhite;
   lbMyWholeOch->Caption=«0»;
   lbHisWholeOch->Caption=«0»;
   lbMaxOch2->Caption="";
   listboxOchki->Clear();
   listboxOchki->Width=218;
   listboxOchki->Left=23;
   AnsiString tmp=AnsiQuotedStr(«Игра->Начать новую игру»,'"');
   lbStat->Caption=«Для начала новой игры выберете пункт меню „+tmp;
}
//--------------------------------------------------------------
void __fastcall TMainForm::InterfaceBeginNewGame(void)
{
  menuStop->Enabled=true;
  if(IsServer)
  {
    Caption=Caption+“ Сервер»;
    imStolServer->Parent=panPole1;
    imStolClient->Parent=panPole2;
  }
  else
  {
    Caption=Caption+" Клиент";
    imStolClient->Parent=panPole1;
    imStolServer->Parent=panPole2;
  }
  for (int i=0;i<KolKub;i++)
  {
     Kubiki1[i] = new TImage(this);
     Kubiki1[i]->Parent=panPole1;
     Kubiki1[i]->Transparent=true;
     Kubiki2[i] = new TImage(this);
     Kubiki2[i]->Parent=panPole2;
     Kubiki2[i]->Transparent=true;
  }
  panParam->Visible=true;
  lbNomPartia->Visible=true;
  panSchetPoPartiam->Visible=true;
  gbPole1->Top=80;
  gbTabl->Top=80;
  gbPole2->Top=80;
  this->Height=470;
  lbKolKub->Caption=IntToStr(KolKub);
  lbMaxOch->Caption=IntToStr(MaxOch);
  lbMaxOch2->Caption=IntToStr(MaxOch);
  lbNomPartia->Caption=«Партия № 1»;
  lbSchetPoPartiam->Caption=«0  :  0»;
  NomPartia=1;
  IsIgrayut=true;
}
//---------------------------------------------------------
void __fastcall TMainForm::ChangeInterfacePerehodHoda(bool HozhuYa)
{
 if(HozhuYa)
 {
   btBrosit->Enabled=true;
   btFix->Enabled=true;
   btBrosit->Color=clCream;
   btFix->Color=clCream;
   shapeBrosil->Caption->Font->Color=clWhite;
   shapeFixed->Caption->Font->Color=clWhite;
   lbStat->Caption=«Твой ход...»;
   if (MyWholeOch>MaxOch-KolKub)
   {
        IsVisitApplicationBox=true;
        Application->MessageBoxA(«Единственно верный вариант для Вас сейчас — зафиксировать очки!»,«Предупреждение»,MB_OK+MB_ICONEXCLAMATION);
        IsVisitApplicationBox=false;
   }
 }
 else
 {
   btBrosit->Enabled=false;
   btFix->Enabled=false;
   shapeBrosil->Brush->Color=clSilver;
   shapeFixed->Brush->Color=clSilver;
   shapeBrosil->Caption->Font->Color=clBlack;
   shapeFixed->Caption->Font->Color=clBlack;
   lbStat->Caption=«Ход соперника...»;
 }
}
 //--------------------------------------------------------------------------
void __fastcall TMainForm::InterfaceIgraemDalshe(void)
{
   NomPartia++;
   MyWholeOch=0;
   HisWholeOch=0;
   MyCurOch=0;
   NomHoda=0;
   IsYaFixed=false;
   IsHeFixed=false;
   IsIgrayut=true;
  
   lbNomPartia->Caption=«Партия № „+IntToStr(NomPartia);
   lbSchetPoPartiam->Caption=IntToStr(MyWinPoPartiam)+“  :  „+IntToStr(HisWinPoPartiam);
   listboxOchki->Clear();
   listboxOchki->Width=218;
   listboxOchki->Left=23;
   lbMyWholeOch->Caption=“0»;
   lbHisWholeOch->Caption=«0»;
   lbMyWholeOch->Font->Color=clGreen;
   lbHisWholeOch->Font->Color=clGreen;
   btBrosit->Color=clCream;
   btFix->Color=clCream;
   shapeBrosil->Brush->Color=clSilver;
   shapeFixed->Brush->Color=clSilver;
   for (int i=0;i<KolKub;i++)
   {
      Kubiki1[i]->Visible=false;
      Kubiki2[i]->Visible=false;
   }
   if(IsServer)
   {
    ChangeInterfacePerehodHoda(1);
   }
   else
   {
    ChangeInterfacePerehodHoda(0);
   }
}
//-----------------------Завершение игры---------------------------------------
void __fastcall TMainForm::menuStopClick(TObject *Sender)
{
 IsVisitApplicationBox=true;
 if(Application->MessageBoxA(«Вы действительно хотите завершить игру?»,«Завершение игры»,MB_YESNO)==IDYES)
 {
    for (int i=0;i<KolKub;i++)
    {
        delete Kubiki1[i];
        delete Kubiki2[i];
    }
   
    switch(choosenProt)
    {
        case 0:
             IPXSend(«3;»);
             IPXCloseConnection();
             break;
        case 1:
             TCPIPSend(«3;»);
             TCPIPCloseConnection();
             break;
        case 2:
             NetBiosSend(«3;»);
             NetBiosCloseConnection();
             break;
        case 3:
             MailSlotSend(«3;»);
             MailSlotCloseConnection();
             break;
        case 4:
             PipeSend(«3;»);
             PipeCloseConnection();
             break;
    }
    IsIgrayut=false;
    InterfaceBezIgri();
 }
IsVisitApplicationBox=false;
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::menuQuitClick(TObject *Sender)
{
  Close();
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::FormCloseQuery(TObject *Sender, bool &CanClose)
{
  if (IsIgrayut)
  {
    menuStopClick(this);
    if(IsIgrayut) CanClose=false;
  }
}
//-------------------служебные функции преобразования типов---------------------
char* __fastcall TMainForm::DannieToChar(int Type, int MyCurOch, int MyWholeOch,
                                  int ZnachKub1,int XKub1,int YKub1,
                                  int ZnachKub2,int XKub2,int YKub2,
                                  int ZnachKub3,int XKub3,int YKub3,
                                  int ZnachKub4,int XKub4,int YKub4
                                 )
{
 AnsiString strTmp=IntToStr(Type)+";"+IntToStr(MyCurOch)+";"+IntToStr(MyWholeOch)+";"+
                   IntToStr(ZnachKub1)+";"+IntToStr(XKub1)+";"+IntToStr(YKub1)+";"+
                   IntToStr(ZnachKub2)+";"+IntToStr(XKub2)+";"+IntToStr(YKub2)+";"+
                   IntToStr(ZnachKub3)+";"+IntToStr(XKub3)+";"+IntToStr(YKub3)+";"+
                   IntToStr(ZnachKub4)+";"+IntToStr(XKub4)+";"+IntToStr(YKub4)+";";
 return strTmp.c_str();
}
//---------------------------------------------------------------------------
int* __fastcall TMainForm::CharToMas(char* charPriem)
{
  AnsiString strPriem=charPriem;
  MasPriem=new int[15];
  int y=0;
  int PrevDelim=0;
  int CurDelim;
  for(int i=1;i<=strPriem.Length();i++)
  {
        if(IsDelimiter(";",strPriem,i))
        {
                MasPriem[y++]=StrToInt(MidStr(strPriem,PrevDelim+1,i-PrevDelim-1));
                PrevDelim=i;
        }
  }
  return MasPriem;
}
//Бросить---------------------------------------------------------------------------
//Закогнчить--------------------------------------------------------------------------
void __fastcall TMainForm::btBrosit2Click(TObject *Sender)
{
Graphics::TBitmap *Bitmap1 = new Graphics::TBitmap();
char strSend[70];
AnsiString strCat;
if(IsServer)
{
    NomHoda++;
    strCat="";
}
else
{
    strCat="_2";
}
if(KolKub==1)
{
  int ZnachKub, XKub, YKub;
  randomize();
  ZnachKub = random(6)+1;
  XKub=random(126)+14;
  YKub=random(126)+14;
  Bitmap1->LoadFromResourceName((unsigned int)HInstance,«KUB»+IntToStr(ZnachKub)+strCat);
  Kubiki1[0]->Picture->Bitmap=Bitmap1;
  Kubiki1[0]->Left=XKub;
  Kubiki1[0]->Top=YKub;
  Kubiki1[0]->Visible=true;
  MyCurOch=ZnachKub;
  MyWholeOch=MyWholeOch+MyCurOch;
  strcpy(strSend,DannieToChar(1, MyCurOch, MyWholeOch, ZnachKub, XKub, YKub));
}
else if (KolKub==2)
{
  int ZnachKub1, XKub1, YKub1, ZnachKub2, XKub2, YKub2;
  randomize();
  ZnachKub1 = random(6)+1;
  XKub1=random(126)+14;
  YKub1=random(52)+14;
  Bitmap1->LoadFromResourceName((unsigned int)HInstance,«KUB»+IntToStr(ZnachKub1)+strCat);
  Kubiki1[0]->Picture->Bitmap=Bitmap1;
  Kubiki1[0]->Left=XKub1;
  Kubiki1[0]->Top=YKub1;
  Kubiki1[0]->Visible=true;
  ZnachKub2 = random(6)+1;
  XKub2=random(126)+14;
  YKub2=random(52)+88;
  Bitmap1->LoadFromResourceName((unsigned int)HInstance,«KUB»+IntToStr(ZnachKub2)+strCat);
  Kubiki1[1]->Picture->Bitmap=Bitmap1;
  Kubiki1[1]->Left=XKub2;
  Kubiki1[1]->Top=YKub2;
  Kubiki1[1]->Visible=true;
  MyCurOch=ZnachKub1+ZnachKub2;
  MyWholeOch=MyWholeOch+MyCurOch;
  strcpy(strSend,DannieToChar(1, MyCurOch, MyWholeOch, ZnachKub1, XKub1, YKub1, ZnachKub2, XKub2, YKub2));
}
else if (KolKub==3)
{
  int ZnachKub1, XKub1, YKub1, ZnachKub2, XKub2, YKub2, ZnachKub3, XKub3, YKub3;
  randomize();
  ZnachKub1 = random(6)+1;
  XKub1=random(126)+14;
  YKub1=random(27)+14;
  Bitmap1->LoadFromResourceName((unsigned int)HInstance,«KUB»+IntToStr(ZnachKub1)+strCat);
  Kubiki1[0]->Picture->Bitmap=Bitmap1;
  Kubiki1[0]->Left=XKub1;
  Kubiki1[0]->Top=YKub1;
  Kubiki1[0]->Visible=true;
  ZnachKub2 = random(6)+1;
  XKub2=random(126)+14;
  YKub2=random(27)+63;
  Bitmap1->LoadFromResourceName((unsigned int)HInstance,«KUB»+IntToStr(ZnachKub2)+strCat);
  Kubiki1[1]->Picture->Bitmap=Bitmap1;
  Kubiki1[1]->Left=XKub2;
  Kubiki1[1]->Top=YKub2;
  Kubiki1[1]->Visible=true;
  ZnachKub3 = random(6)+1;
  XKub3=random(126)+14;
  YKub3=random(28)+112;
  Bitmap1->LoadFromResourceName((unsigned int)HInstance,«KUB»+IntToStr(ZnachKub3)+strCat);
  Kubiki1[2]->Picture->Bitmap=Bitmap1;
  Kubiki1[2]->Left=XKub3;
  Kubiki1[2]->Top=YKub3;
  Kubiki1[2]->Visible=true;
  MyCurOch=ZnachKub1+ZnachKub2+ZnachKub3;
  MyWholeOch=MyWholeOch+MyCurOch;
  strcpy(strSend,DannieToChar(1, MyCurOch, MyWholeOch, ZnachKub1, XKub1, YKub1, ZnachKub2, XKub2, YKub2, ZnachKub3, XKub3, YKub3));
}
else
{
  int ZnachKub1, XKub1, YKub1,  ZnachKub2, XKub2, YKub2, ZnachKub3, XKub3, YKub3, ZnachKub4, XKub4, YKub4;
  randomize();
  ZnachKub1 = random(6)+1;
  XKub1=random(52)+14;
  YKub1=random(52)+14;
  Bitmap1->LoadFromResourceName((unsigned int)HInstance,«KUB»+IntToStr(ZnachKub1)+strCat);
  Kubiki1[0]->Picture->Bitmap=Bitmap1;
  Kubiki1[0]->Left=XKub1;
  Kubiki1[0]->Top=YKub1;
  Kubiki1[0]->Visible=true;
  ZnachKub2 = random(6)+1;
  XKub2=random(52)+88;
  YKub2=random(52)+14;
  Bitmap1->LoadFromResourceName((unsigned int)HInstance,«KUB»+IntToStr(ZnachKub2)+strCat);
  Kubiki1[1]->Picture->Bitmap=Bitmap1;
  Kubiki1[1]->Left=XKub2;
  Kubiki1[1]->Top=YKub2;
  Kubiki1[1]->Visible=true;
  ZnachKub3 = random(6)+1;
  XKub3=random(52)+14;
  YKub3=random(52)+88;
  Bitmap1->LoadFromResourceName((unsigned int)HInstance,«KUB»+IntToStr(ZnachKub3)+strCat);
  Kubiki1[2]->Picture->Bitmap=Bitmap1;
  Kubiki1[2]->Left=XKub3;
  Kubiki1[2]->Top=YKub3;
  Kubiki1[2]->Visible=true;
  ZnachKub4 = random(6)+1;
  XKub4=random(52)+88;
  YKub4=random(52)+88;
  Bitmap1->LoadFromResourceName((unsigned int)HInstance,«KUB»+IntToStr(ZnachKub4)+strCat);
  Kubiki1[3]->Picture->Bitmap=Bitmap1;
  Kubiki1[3]->Left=XKub4;
  Kubiki1[3]->Top=YKub4;
  Kubiki1[3]->Visible=true;
  MyCurOch=ZnachKub1+ZnachKub2+ZnachKub3+ZnachKub4;
  MyWholeOch=MyWholeOch+MyCurOch;
  strcpy(strSend,DannieToChar(1, MyCurOch, MyWholeOch, ZnachKub1, XKub1, YKub1, ZnachKub2, XKub2, YKub2,ZnachKub3, XKub3, YKub3, ZnachKub4, XKub4, YKub4));
}
  switch(choosenProt)
  {
    case 0:
        IPXSend(strSend);
        break;
    продолжение
--PAGE_BREAK--
еще рефераты
Еще работы по коммуникациям