WEB开发网
开发学院软件开发VC 利用SDK实现智能五子棋 阅读

利用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;
}

第二步,电脑计算玩家下棋状态采取进攻或防守的策略,这是五子棋的关键所在,这儿给出实现的伪代码.

Tags:利用 SDK 实现

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接