Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.04.2009, 12:32   #1
DiMoN2002
 
Регистрация: 28.04.2009
Сообщений: 7
По умолчанию Преобразование программы

В общем есть готовая программа реализующая игру в шахматы на одном компьютере между двумя людьми (без ИИ). Программа написана в структурной форме.
Есть необходимость преобразовать её в объектно-ориентированную. Т.е. чтобы были организованы классы. Нужно где-то 6 классов.
Реально ли это сделать? Или проще написать по новой с объектно-ориентированным подходом?
Заранее благодарен!!!
Вот код:
Код:
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "Unit2.h"

#pragma package(smart_init)
#pragma resource "*.dfm"

TForm1 *Form1;

//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{
    Form2= new TForm2(this);
    Form2->ShowModal();
    Form2->Free();
    Memo1->Lines->Add ( "Ходят белые" );
}

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    Initialize ( );
}

//---------------------------------------------------------------------------

void TForm1 :: Initialize ( )
{
    ThisX = 0;
    ThisY = 0;
    SelComplete = 0; // Для полноценого хода надо выбрать
                    // 2 координаты после того как SelComplete
                    // будет равен 2 можно ходить
    Flag = 0;
    NewX = NewY =0;
    ThisFigure = BEPesh;

    // Положительные - чёрный, а отрицательные - белые

    for ( int i=0; i<8; i++ )
    {
        Doska[0][i] = -i-9;  //Белые фигуры
        Doska[1][i] = -i-1;  //Белые пешки
        Doska[6][i] =  i+1;  //Чёрные пешки
        Doska[7][i] =  i+9;  //Чёрные фигуры
        for ( int j=2; j<6; j++)
            Doska[j][i] = 0; //Пусто
    }
}
//---------------------------------------------------------------------------

void TForm1 :: CheckGo ( )
{
    if ( IsGo ( ) )
        if ( ( Flag && Doska[ThisY][ThisX]>0 ) || ( !Flag && Doska[ThisY][ThisX]<0 ) )
        {
            VisHod ( );
            Perehod ( );
            Board->Enabled = true;
        }
}
//---------------------------------------------------------------------------

void TForm1 :: Perehod ( )
{
    if ( Flag )
        Memo1->Lines->Add ( "Ходят белые" );
    else
        Memo1->Lines->Add ( "Ходят чёрные" );
    Flag = !Flag;
}
//---------------------------------------------------------------------------
void TForm1::DrawRect ( int X , int Y , TColor Color )
{
    Canvas->Pen->Color = Color;
    Canvas->MoveTo ( X*40+32 , Y*40+32 );
    Canvas->LineTo ( X*40+72 , Y*40+32 );
    Canvas->LineTo ( X*40+72 , Y*40+72 );
    Canvas->LineTo ( X*40+32 , Y*40+72 );
    Canvas->LineTo ( X*40+32 , Y*40+32 );
}
//---------------------------------------------------------------------------
void TForm1 :: VisHod ( )
{   //Делаем не видимой фигуру которую побили 
    ThisFigure = WhoIsClicked ( NewY, NewX );
    if ( ThisFigure == WLKing )
    {
        Memo1->Lines->Add( "Чёрные победили" );
        MessageBox( NULL , "Чёрные победили" , ".:МАТ:." , MB_OK );
        Form1->Repaint();
        Close();
    }

    if ( ThisFigure == BLKing )
    {
        Memo1->Lines->Add( "Белые победили" );
        MessageBox( NULL , "Белые победили" , ".:МАТ:." , MB_OK );
        Close();
    }

    if ( ThisFigure!=Null_Image )
        ThisFigure->Visible = false;

    //Визуализация хода
    ThisFigure = WhoIsClicked ( ThisY, ThisX );
    ThisFigure->Left = NewX*40+32;
    ThisFigure->Top  = NewY*40+32;


    // Редактирование фиртуальной шахматной доски Doska [][]
    Doska[NewY][NewX]=Doska[ThisY][ThisX];
    Doska[ThisY][ThisX]=0;
}
//--------------------------------------------------------------------------
void __fastcall TForm1::BoardMouseUp(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
{
    if ( ( X>352 )
      || ( X<32  )
      || ( Y<32  )
      || ( Y>352 ) )
        return;
    SelComplete++;

    switch ( SelComplete )
    {
        case 1:
            ThisX = div ( X-32,40 ).quot;
            ThisY = div ( Y-32,40 ).quot;
            DrawRect ( ThisX , ThisY , clRed );
        break;

        case 2:
            DrawRect ( ThisX , ThisY , clLtGray );
            NewX  = div ( X-32,40 ).quot;
            NewY  = div ( Y-32,40 ).quot;
            SelComplete = 0;
            CheckGo ( );
        break;
        default: SelComplete = 0;
    }

}
DiMoN2002 вне форума Ответить с цитированием
Старый 28.04.2009, 12:34   #2
DiMoN2002
 
Регистрация: 28.04.2009
Сообщений: 7
По умолчанию

Продолжение
Код:
TImage* TForm1 :: WhoIsClicked ( __int8 Y, __int8 X )
{
    switch ( Doska[Y][X] )
    {
        case -9  : return WLTura;
        case  9  : return BLTura;
        case -16 : return WRTura;
        case  16 : return BRTura;

        case -10 : return WLHors;
        case  10 : return BLHors;
        case -15 : return WRHors;
        case  15 : return BRHors;

        case -11 : return WLSlon;
        case  11 : return BLSlon;
        case -14 : return WRSlon;
        case  14 : return BRSlon;

        case -12 : return WLKing;
        case  12 : return BLKing;
        case -13 : return WRQuen;
        case  13 : return BRQuen;


        case -1  : return WAPesh;
        case -2  : return WBPesh;
        case -3  : return WCPesh;
        case -4  : return WDPesh;
        case -5  : return WEPesh;
        case -6  : return WFPesh;
        case -7  : return WGPesh;
        case -8  : return WHPesh;

        case  1  : return BAPesh;
        case  2  : return BBPesh;
        case  3  : return BCPesh;
        case  4  : return BDPesh;
        case  5  : return BEPesh;
        case  6  : return BFPesh;
        case  7  : return BGPesh;
        case  8  : return BHPesh;
        default  : return Null_Image;
    };
}
//---------------------------------------------------------------------------

bool TForm1 :: IsGo ( )
{
    if ( ( ( Doska[NewY][NewX]>=0 ) && ( Doska[ThisY][ThisX]<0 ) )
      || ( ( Doska[NewY][NewX]<=0 ) && ( Doska[ThisY][ThisX]>0 ) ) )

        switch ( Doska[ThisY][ThisX] )
        {
            // Это ходы ферзя комбинация туры и слона
            case -13 :
            case  13 :

            // Это обработка хода турой
            case -9  :
            case -16 :
            case  9  :
            case  16 :
                // если ход по вертикали
                if ( ThisX == NewX )
                {
                    if ( ThisY < NewY )
                    {
                        for ( int i=ThisY+1; i<NewY; i++)
                            if ( Doska[i][ThisX]!=0 )
                                return false;
                        // Всё OK ходить можно
                        return true;
                    }

                    if ( ThisY > NewY )
                    {
                        for ( int i=ThisY-1; i>NewY; i--)
                            if ( Doska[i][ThisX]!=0 )
                                return false;
                        // Всё OK ходить можно
                        return true;
                    }
                }

                // если ход по горизонтали
                if ( ThisY == NewY )
                {
                    if ( ThisX < NewX )
                    {
                        for ( int i=ThisX+1; i<NewX; i++)
                            if ( Doska[ThisX][i]!=0 )
                                return false;
                        // Всё OK ходить можно
                        return true;
                    }

                    if ( ThisX > NewX )
                    {
                        for ( int i=ThisX-1; i>NewX; i--)
                            if ( Doska[ThisX][i]!=0 )
                                return false;
                        // Всё OK ходить можно
                        return true;
                    }
                }
            // case 16

            case -11 :
            case -14 :
            case  11 :
            case  14 : //Ходы слонов
            if ( abs( ThisY-NewY )==abs ( ThisX-NewX ) )
            {
                if ( NewY > ThisY )
                {
                    if ( NewX > ThisX )
                    {
                        for (int i=ThisY+1 , j=ThisX+1; i<NewY , j<NewX; i++ , j++)
                            if ( Doska[i][j]!=0 )
                                return false;
                    }
                    else
                        for (int i=ThisY+1, j=ThisX-1; i<NewY, j>NewX; i++ , j-- )
                            if ( Doska[i][j]!=0 )
                                return false;
                }


                else
                {
                    if ( NewX > ThisX )
                    {
                        for (int i=ThisY-1, j=ThisX+1; i>NewY, j<NewX; i--, j++ )
                            if ( Doska[i][j]!=0 )
                                return false;

                    }
                    else
                        for (int i=ThisY-1, j=ThisX-1; i>NewY, j>NewX; i--, j-- )
                            if ( Doska[i][j]!=0 )
                                return false;
                }

                return true; // if после case 14
            }
DiMoN2002 вне форума Ответить с цитированием
Старый 28.04.2009, 12:35   #3
DiMoN2002
 
Регистрация: 28.04.2009
Сообщений: 7
По умолчанию

И еще
Код:
 break;  // case 9 -9 11 -11 13 -13 14 -14 16 -16
                    // тут заканчиваеться обработка ходов и белых и чёрных
                    // туры слона и ферзя

            case -10 :
            case  10 :
            case -15 :
            case  15 :
                if ( ( abs ( NewX-ThisX )==1 && abs ( NewY-ThisY )==2 )
                  || ( abs ( NewX-ThisX )==2 && abs ( NewY-ThisY )==1 ) )
                    return true;
            break; // лошади 8)


            case -12 :
            case  12 :
                if ( ( abs ( ThisY-NewY )<=1 )
                  & ( abs ( ThisX-NewX )<=1 ) )
                    return true;
            else
            break; //case 12 -12 короли


            case -1  :
            case -2  :
            case -3  :
            case -4  :
            case -5  :
            case -6  :
            case -7  :
            case -8  :
                if ( ( Doska[NewY][NewX]==0 )
                  && ( NewX==ThisX )
                  && ( ( NewY-ThisY==1 )
                    || ( ( NewY==3 ) && ( ThisY == 1 ) ) ) )
                {
                    return true;
                }
                else if ( ( Doska[NewY][NewX]>0 )
                       && ( abs ( NewX-ThisX )==1 )
                       && ( NewY-ThisY ==1 ) )
                        return true;

            break; // case -8

            case  1  :
            case  2  :
            case  3  :
            case  4  :
            case  5  :
            case  6  :
            case  7  :
            case  8  :
                if ( ( Doska[NewY][NewX]==0 )
                  && ( NewX==ThisX )
                  && ( ( NewY-ThisY==-1 )
                    || ( ( NewY==4 ) && ( ThisY == 6 ) ) ) )
                {
                    return true;
                }
                else if ( ( Doska[NewY][NewX]<0 )
                       && ( abs ( NewX-ThisX )==1 )
                       && ( NewY-ThisY ==-1 ) )
                        return true;

            break; // case 8
            default  : return false;
        } //switch

    return false;
}

//---------------------------------------------------------------------------

void __fastcall TForm1::Main1Click(TObject *Sender)
{
    Form1->Close();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::N4Click(TObject *Sender)
{
    MessageBox ( NULL , "Chess ver 1.0\n\nFreeware" , "About" , MB_ICONINFORMATION );
}
DiMoN2002 вне форума Ответить с цитированием
Старый 28.04.2009, 15:01   #4
DiMoN2002
 
Регистрация: 28.04.2009
Сообщений: 7
По умолчанию

Я так понимаю ответить никто не может
Просто очень нужно программу переделать. Скажите хотя бы с какой стороны начать?
Я просто с классами не очень знаком, так чисто теоретически.
DiMoN2002 вне форума Ответить с цитированием
Старый 28.04.2009, 17:32   #5
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

http://yandex.ru/yandsearch?text=%D0...1&stpar1=%2Fu0
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 28.04.2009, 18:31   #6
DiMoN2002
 
Регистрация: 28.04.2009
Сообщений: 7
По умолчанию

Спасибо огромное. Только поисковыми машинами я умею пользоваться. Я просто просил подсказать путь по которому пойти.
Переписывать весь код заново. Или можно переделать существующий.
DiMoN2002 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Преобразование текста программы в RTF Kostj@n Общие вопросы Delphi 3 27.12.2011 11:44
преобразование программы Ananim-Pbl6ak Помощь студентам 1 02.04.2009 22:37
Преобразование типов DeFace Общие вопросы C/C++ 4 24.03.2009 17:06
Преобразование чисел artemavd Общие вопросы Delphi 15 30.07.2008 15:48
Преобразование... prizrak1390 Общие вопросы Delphi 2 02.04.2008 11:24