📄 weiqibrd.cpp
字号:
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 + -