⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 weiqibrd.cpp

📁 此代码是用BCB做的围棋代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
  TBlock *pNewBlock = new( TBlock );
  pNewBlock->nNo = Order;
  pNewBlock->nX = ai.nX;
  pNewBlock->nY = ai.nY;
  pNewBlock->pNext = NULL;

//  TSituationTree *pModifiedTree = pSituationTree;
  TBlock *pTailOfBlock = pAdjBlock;
  while( pTailOfBlock->pNext != NULL )
    pTailOfBlock = pTailOfBlock->pNext;
//  TBlock *pHeadOfBlock = pModifiedTree->pBlock;
  pTailOfBlock->pNext = pNewBlock;
/*  while( pModifiedTree->pBlock->pNext != pAdjBlock )
  {
    pModifiedTree = pModifiedTree->pNext;
  }
  TBlock *pHeadOfBlock = pModifiedTree->pBlock;
  while( pModifiedTree->pBlock != NULL )
    pModifiedTree->pBlock = pModifiedTree->pBlock->pNext;
  pModifiedTree->pBlock->pNext = pNewBlock;
  pModifiedTree->pBlock = pHeadOfBlock;*/
  return( pAdjBlock );
}
//---------------------------------------------------------------------------
TBlock * TWeiqiBoard::MergeBlocks( TBlock *pAdjBlock1, TBlock *pAdjBlock2 )
{
  // Declare two pointers:
  // One(pLastBlock) is for the last branch(block) of the TBlock,
  // The other(pNewblock) is for the new TBlock.
  // A new pointer pNewBlock is neccessary that points to the new stone.
  if( pAdjBlock1 == pAdjBlock2 )
    return( pAdjBlock2 );
  TSituationTree *pTree1 = new( TSituationTree );
  pTree1 = pSituationTree;
  while( pTree1->pNext->pBlock != pAdjBlock2 )
    pTree1 = pTree1->pNext;
  TSituationTree *pTree2 = new( TSituationTree );
  pTree2 = pTree1->pNext;
  TBlock *pTailOfBlock1 = pAdjBlock1;
  while( pTailOfBlock1->pNext != NULL )
    pTailOfBlock1 = pTailOfBlock1->pNext;
  pTailOfBlock1->pNext = pAdjBlock2;
  pTree1->pNext = pTree2->pNext;

//  pTree2->pBlock = NULL;
//  delete pTree2->pBlock;
//  pTree2->pNext = NULL;
//  delete pTree2->pNext;
  delete pTree2;
#if defined( __DEBUG__ )
/*  TSituationTree *p3 = new( TSituationTree );
  p3 = pSituationTree->pNext;
  TBlock *p4 = new( TBlock );
  MainFormWeiqi->MemoTip->SelectAll();
  MainFormWeiqi->MemoTip->ClearSelection();
  while( p3 != NULL )
  {
    if( p3->WhichSide == wqSideBlack )
      MainFormWeiqi->MemoTip->Lines->Add( "Black Block:" );
    else if( p3->WhichSide == wqSideWhite )
      MainFormWeiqi->MemoTip->Lines->Add( "White Block:" );
    p4 = p3->pBlock;
    while( p4 != NULL )
    {
      AnsiString as;
      as = AnsiString( p4->nX ) + ", " + AnsiString( p4->nY );
      MainFormWeiqi->MemoTip->Lines->Add( as );
      p4 = p4->pNext;
    }
    MainFormWeiqi->MemoTip->Lines->Add( "-----------" );
    p3 = p3->pNext;
  }*/
#endif
  return( pAdjBlock1 );
}
//---------------------------------------------------------------------------
bool TWeiqiBoard::UpdateSituationTree( int X, int Y )
{
  bool bAdded = false;
/*
  TBlock *pNewBlock = new( TBlock );
  pNewBlock->nX = X;
  pNewBlock->nY = Y;
  pNewBlock->pNext = 0;
  TSituationTree *pSTree = new( TSituationTree );
  pSTree = pSituationTree;
*/
  TAdjacentInformation ai = GetAdjacentInformation( X, Y );
#if defined( __DEBUG__ )
  AnsiString as;
  if( ai.bTop )
    as += " Top ";
  if( ai.bBottom )
    as += "Bottom ";
  if( ai.bLeft )
    as += "Left ";
  if( ai.bRight )
    as += "Right ";
//  ShowMessage(IntToStr(ai.nX)+", "+IntToStr(ai.nY)+as);
#endif
//  for( TAdjacentDirection ad=adTop; ad<=adRight; ad++ )
  TBlock *pAdjBlock1 = new( TBlock );
//  pAdjBlock1 = NULL;
  TBlock *pAdjBlock2 = new( TBlock );
//  pAdjBlock2 = NULL;
  if( !( ai.bTop | ai.bBottom | ai.bLeft | ai.bRight ) )
  {
    pAdjBlock1 = AddToNewBlock( ai );
    bAdded = true;
  }
  else
  {
    if( ai.bTop )
    {
      pAdjBlock2 = SearchAdjacentBlock( X, Y, adTop );
      if( !bAdded )
      {
        pAdjBlock1 = AddToExistedBlock( ai, pAdjBlock2 );
        bAdded = !bAdded;
      }
      else
        pAdjBlock1 = MergeBlocks( pAdjBlock1, pAdjBlock2 );
    }
    if( ai.bBottom )
    {
      pAdjBlock2 = SearchAdjacentBlock( X, Y, adBottom );
      if( !bAdded )
      {
        pAdjBlock1 = AddToExistedBlock( ai, pAdjBlock2 );
        bAdded = !bAdded;
      }
      else
        pAdjBlock1 = MergeBlocks( pAdjBlock1, pAdjBlock2 );
    }
    if( ai.bLeft )
    {
      pAdjBlock2 = SearchAdjacentBlock( X, Y, adLeft );
      if( !bAdded )
      {
        pAdjBlock1 = AddToExistedBlock( ai, pAdjBlock2 );
        bAdded = !bAdded;
      }
      else
        pAdjBlock1 = MergeBlocks( pAdjBlock1, pAdjBlock2 );
    }
    if( ai.bRight )
    {
      pAdjBlock2 = SearchAdjacentBlock( X, Y, adRight );
      if( !bAdded )
      {
        pAdjBlock1 = AddToExistedBlock( ai, pAdjBlock2 );
        bAdded = !bAdded;
      }
      else
        pAdjBlock1 = MergeBlocks( pAdjBlock1, pAdjBlock2 );
    }
  }
  UpdateBreath();
// Update breathes of stones again, if some dead stones are moved.
  if( RemoveDeadStones( Phase[X][Y] ) )
    UpdateBreath();
  UpdateMemoTip( X, Y );
  return( true );
}
//---------------------------------------------------------------------------
bool TWeiqiBoard::RemoveDeadStones( TWhichSide WhichSide )
{
//  TSituationTree *p1 = new( TSituationTree );
  TSituationTree *p1 = pSituationTree;
//  TSituationTree *p2 = new( TSituationTree );
//  TBlock *q1 = new( TBlock );
//  TBlock *q1;
//  TBlock *q2 = new( TBlock );
  if( WhichSide == wqSideBlack )
  {
    if( p1 == NULL ) return( false );
    while( p1->pNext != NULL )
    {
//  Computer breath of the added block.
      TSituationTree *p2 = p1->pNext;
      if( ( p2->nBreath == 0 ) && ( p2->WhichSide == wqSideWhite ) )
      {
//        TBlock *q1 = p2->pBlock;
        while( p2->pBlock /* q1 */ != NULL )
        {
          TBlock *q1 = p2->pBlock;
          WhiteDeadStones += 1;
          Phase[ q1->nX ][ q1->nY ] = wqSideNone;
          MainFormWeiqi->RedrawFrontier( q1->nNo, q1->nX, q1->nY );
//          TBlock *q2 = q1;
//          q1 = q1->pNext;
//          delete q2;
          p2->pBlock = q1->pNext;
          delete q1;
        }
//        delete p2->pBlock;
        p1->pNext = p2->pNext;
        delete p2;
      }
      else
        p1 = p1->pNext;
    }
    return( true );
  }
  else if( WhichSide == wqSideWhite )
  {
    if( p1 == NULL ) return( false );
    while( p1->pNext != NULL )
    {
//  Computer breath of the added block.
      TSituationTree *p2 = p1->pNext;
      if( ( p2->nBreath == 0 ) && ( p2->WhichSide == wqSideBlack ) )
      {
//        q1 = p2->pBlock;
        while( p2->pBlock/*q1*/ != NULL )
        {
          TBlock *q1 = p2->pBlock;
          WhiteDeadStones += 1;
          Phase[ q1->nX ][ q1->nY ] = wqSideNone;
          MainFormWeiqi->RedrawFrontier( q1->nNo, q1->nX, q1->nY );
//          TBlock *q2 = q1;
//          q1 = q1->pNext;
//          delete q2;
          p2->pBlock = q1->pNext;
          delete q1;
        }
//        delete p2->pBlock;
        p1->pNext = p2->pNext;
        delete p2;
      }
      else
        p1 = p1->pNext;
/*      TSituationTree *p2 = p1->pNext;
//      p2 = p1->pNext;
      if( ( p2->nBreath == 0 ) && ( p2->WhichSide == wqSideBlack ) )
      {
        q1 = p2->pBlock;
        while( q1 != NULL )
        {
          BlackDeadStones += 1;
          Phase[ q1->nX ][ q1->nY ] = wqSideNone;
          MainFormWeiqi->RedrawFrontier( q1->nNo, q1->nX, q1->nY );
          TBlock *q2 = q1;
//          q2 = q1;
          q1 = q1->pNext;
          delete q2;
        }
        p1->pNext = p2->pNext;
        delete p2;
      }
      p1 = p1->pNext;*/
    }
    return( true );
  }
  else
    return( false );
}
//---------------------------------------------------------------------------
bool TWeiqiBoard::UpdateBreath()
{
  bool bVisited[21][21];
//  Deaclare two pointers to search the just added block.
  TSituationTree *p1 = new( TSituationTree );
  TBlock *q1 = new( TBlock );
  p1 = pSituationTree->pNext;
  while( p1 != NULL )
  {
//  Computer breath of the added block.
    int nBreath = 0;
    for( int i=0; i<=20; i++ )
      for( int j=0; j<=20; j++ )
        bVisited[i][j] = false;
    q1 = p1->pBlock;
    while( q1 != NULL )
    {
      if( !bVisited[q1->nX][q1->nY-1] && ( Phase[q1->nX][q1->nY-1] == wqSideNone ) )
      {
        bVisited[q1->nX][q1->nY-1] = true;
        nBreath += 1;
      }
      if( !bVisited[q1->nX][q1->nY+1] && ( Phase[q1->nX][q1->nY+1] == wqSideNone ) )
      {
        bVisited[q1->nX][q1->nY+1] = true;
        nBreath += 1;
      }
      if( !bVisited[q1->nX-1][q1->nY] && ( Phase[q1->nX-1][q1->nY] == wqSideNone ) )
      {
        bVisited[q1->nX-1][q1->nY] = true;
        nBreath += 1;
      }
      if( !bVisited[q1->nX+1][q1->nY] && ( Phase[q1->nX+1][q1->nY] == wqSideNone ) )
      {
        bVisited[q1->nX+1][q1->nY] = true;
        nBreath += 1;
      }
      q1 = q1->pNext;
    }
    p1->nBreath = nBreath;
    p1 = p1->pNext;
  }
  return( true );
}

//---------------------------------------------------------------------------
int TWeiqiBoard::UpdateBreath( TBlock *pBlock )
{
  int nBreath = 0;
  bool bVisited[21][21];
  for( int i=0; i<=20; i++ )
    for( int j=0; j<=20; j++ )
      bVisited[i][j] = false;
//  Deaclare two pointers to search the just added block.
  TSituationTree *p1 = new( TSituationTree );
  TBlock *q1 = new( TBlock );
  p1 = pSituationTree->pNext;
  while( p1->pBlock != pBlock )
    p1 = p1->pNext;
//  Computer breath of the added block.
  q1 = p1->pBlock;
  while( q1 != NULL )
  {
    if( !bVisited[q1->nX][q1->nY-1] && ( Phase[q1->nX][q1->nY-1] == wqSideNone ) )
    {
      bVisited[q1->nX][q1->nY-1] = true;
      nBreath += 1;
    }
    if( !bVisited[q1->nX][q1->nY+1] && ( Phase[q1->nX][q1->nY+1] == wqSideNone ) )
    {
      bVisited[q1->nX][q1->nY+1] = true;
      nBreath += 1;
    }
    if( !bVisited[q1->nX-1][q1->nY] && ( Phase[q1->nX-1][q1->nY] == wqSideNone ) )
    {
      bVisited[q1->nX-1][q1->nY] = true;
      nBreath += 1;
    }
    if( !bVisited[q1->nX+1][q1->nY] && ( Phase[q1->nX+1][q1->nY] == wqSideNone ) )
    {
      bVisited[q1->nX+1][q1->nY] = true;
      nBreath += 1;
    }
    q1 = q1->pNext;
  }
  p1->nBreath = nBreath;
  return( nBreath );
}

//---------------------------------------------------------------------------
bool TWeiqiBoard::UpdateMemoTip( int X, int Y )
{
  TSituationTree *p1 = new( TSituationTree );
  TBlock *q1 = new( TBlock );

  MainFormWeiqi->MemoTip->Clear();
  p1 = pSituationTree->pNext;
  while( p1 != NULL )
  {
    if( p1->WhichSide == wqSideBlack )
      MainFormWeiqi->MemoTip->Lines->Add( "Black Block:" + IntToStr(p1->nBreath) );
    else if( p1->WhichSide == wqSideWhite )
      MainFormWeiqi->MemoTip->Lines->Add( "White Block:" + IntToStr(p1->nBreath) );
    q1 = p1->pBlock;
    while( q1 != NULL )
    {
      AnsiString as;
      as = AnsiString( q1->nX ) + ", " + AnsiString( q1->nY );
      MainFormWeiqi->MemoTip->Lines->Add( as );
      q1 = q1->pNext;
    }
    MainFormWeiqi->MemoTip->Lines->Add( "-----------" );
    p1 = p1->pNext;
  }
//  delete q1;
//  delete p1;
}
//---------------------------------------------------------------------------
TWeiqiBoard *WeiqiBoard = new( TWeiqiBoard );

//---------------------------------------------------------------------------
#pragma package(smart_init)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -