利用SDK实现智能五子棋
2006-07-23 11:33:53 来源:WEB开发网核心提示: //知道所有的胜利组合状态,我们可以定义一个数组记录这些组合.BOOLbArrPlayerWin[ 10 ][ 10 ][ 192 ] = { FALSE };BOOLbArrComWin[ 10 ][ 10 ][ 192 ] = { FALSE };这是一个三维数组, 记录了在棋盘中所有
//知道所有的胜利组合状态,我们可以定义一个数组记录这些组合.
BOOL bArrPlayerWin[ 10 ][ 10 ][ 192 ] = { FALSE };
BOOL bArrComWin[ 10 ][ 10 ][ 192 ] = { FALSE };
这是一个三维数组, 记录了在棋盘中所有的胜利组合.如玩家在棋盘 列1 行1的位置,则有三种胜利组合,如图:
可能为bArrPlayer[1][1][3] = TRUE,bArrPlayer[1][1][6] = TRUE,bArrPlayer[1][1][9] = TRUE如果电脑在标记为绿色的位置的地方放了棋子,则破坏了这种获胜组合,玩家不可能在这种组合中获胜,所以把其值设成 FALSE,则电脑可以不用在这儿再放置棋子了,同样,玩家可以破坏电脑的获胜组合。
计算所有的胜利的组合在 InitWinStatus()函数中,这些代码很简单,所以不讲解了,请读者自已理解这些代码!
void InitWinStatus()
{
int nCount = 0;
// Set the vertical combinations winning status.
for ( int i = 0; i < 10; i++ )
for ( int j = 0; j < 6; j++ )
{
for ( int k = 0; k < 5; k++ )
{
bArrPlayerWin[ j + k ][ i ][ nCount ] = TRUE;
bArrComWin[ j + k ][ i ][ nCount ] = TRUE;
}
nCount++;
}
// Vertical has 60 winning status.
assert( nCount == 60 );
// Set the horizontal combinations winning status.
for ( i = 0; i < 10; i++ )
for ( int j = 0; j < 6; j++ )
{
for ( int k = 0; k < 5; k++ )
{
bArrPlayerWin[ i ][ j + k ][ nCount ] = TRUE;
bArrComWin[ i ][ j + k ][ nCount ] = TRUE;
}
nCount++;
}
// Horizontal has 60 winning status
assert( nCount == 120 );
// Set the positive diagonal winning status.
for ( i = 0; i < 6; i++ )
for ( int j = 0; j < 6; j++ )
{
for ( int k = 0; k < 5; k++ )
{
bArrPlayerWin[ j + k ][ i + k ][ nCount ] = TRUE;
bArrComWin[ j + k ][ i + k ][ nCount ] = TRUE;
}
nCount++;
}
// Positive diagonal has 36 winning status.
assert( nCount == 156 );
// Set the negative diagonal winning status.
for ( i = 0; i < 6; i++ )
for ( int j = 9; j > 3; j-- )
{
for ( int k = 0; k < 5; k++ )
{
bArrPlayerWin[ j - k ][ i + k ][ nCount ] = TRUE;
bArrComWin[ j - k ][ i + k ][ nCount ] = TRUE;
}
nCount++;
}
// Negative diagonal has 36 winning status.
assert( nCount == 192 );
// Who is the first ?
if ( rand() % 2 == 0 )
bPlayerDo = TRUE;
else
bComputerDo = TRUE;
}
第二步,电脑计算玩家下棋状态采取进攻或防守的策略,这是五子棋的关键所在,这儿给出实现的伪代码.
更多精彩
赞助商链接