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

📄 engine.cpp

📁 Siemens 的SIMpad是一个多媒体设备
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	      if (val > maxval)		{		  maxval = val;		  max_x = x;		  max_y = y;		  number_of_maxval = 1;		}	      else if (val == maxval) number_of_maxval++;	    }	  if (GetInterrupt()) break;	}  // long endtime = times(&tmsdummy);  if (number_of_maxval > 1)    {      int r = (rand() % number_of_maxval) + 1;      int i;      for (i=0; i < number_of_moves; i++)	if (moves[i].m_value == maxval && --r <= 0) break;      max_x = moves[i].m_x;      max_y = moves[i].m_y;    }  if (GetInterrupt()) {           return Move(-1, -1, -1);  } else if (maxval != -LARGEINT) {    return Move(max_x, max_y, player);  } else {    return Move(-1, -1, -1);  }}Move Engine::ComputeFirstMove(Game g) {  int r;  int player = g.GetWhoseTurn();  r = (rand() % 4) + 1;  if (player == Score::WHITE)    {      if (r == 1) return Move(3, 5, player);      else if (r == 2) return  Move(4, 6, player);      else if (r == 3) return  Move(5, 3, player);      else return  Move(6, 4, player);    }  else    {      if (r == 1) return  Move(3, 4, player);      else if (r == 2) return  Move(5, 6, player);      else if (r == 3) return  Move(4, 3, player);      else return  Move(6, 5, player);    }}int Engine::ComputeMove2(int xplay, int yplay, int player, int level,			 int cutoffval, ULONG64 playerbits, 			 ULONG64 opponentbits){  int number_of_turned = 0;  SquareStackEntry mse;  int opponent = Score::GetOpponent(player);  m_nodes_searched++;  m_board[xplay][yplay] = player;  playerbits |= m_coord_bit[xplay][yplay];  m_score.ScoreAdd(player, 1);  m_bc_score.ScoreAdd(player, m_bc_board[xplay][yplay]);  ///////////////////  // Turn all pieces:  ///////////////////  for (int xinc=-1; xinc<=1; xinc++)    for (int yinc=-1; yinc<=1; yinc++)      if (xinc != 0 || yinc != 0)	{	  int x, y;	  for (x = xplay+xinc, y = yplay+yinc; m_board[x][y] == opponent;	       x += xinc, y += yinc)	    ;	  if (m_board[x][y] == player)	    for (x -= xinc, y -= yinc; x != xplay || y != yplay;		 x -= xinc, y -= yinc)	      {		m_board[x][y] = player;		playerbits |= m_coord_bit[x][y];		opponentbits &= ~m_coord_bit[x][y];		m_squarestack.Push(x, y);		m_bc_score.ScoreAdd(player, m_bc_board[x][y]);		m_bc_score.ScoreSubtract(opponent, m_bc_board[x][y]);		number_of_turned++;	      }	}  int retval = -LARGEINT;  if (number_of_turned > 0)    {      //////////////      // Legal move:      //////////////      m_score.ScoreAdd(player, number_of_turned);      m_score.ScoreSubtract(opponent, number_of_turned);      if (level >= m_depth) retval = EvaluatePosition(player); // Terminal node      else	{	  int maxval = TryAllMoves(opponent, level, cutoffval, opponentbits,				   playerbits);	  if (maxval != -LARGEINT) retval = -maxval;	  else	    {	      ///////////////////////////////////////////////////////////////	      // No possible move for the opponent, it is players turn again:	      ///////////////////////////////////////////////////////////////	      retval= TryAllMoves(player, level, -LARGEINT, playerbits,				  opponentbits);	      if (retval == -LARGEINT)		{		  ///////////////////////////////////////////////		  // No possible move for anybody => end of game:		  ///////////////////////////////////////////////		  int finalscore =		    m_score.GetScore(player) - m_score.GetScore(opponent);		  if (m_exhaustive) retval = finalscore;		  else		    {		      // Take a sure win and avoid a sure loss (may not be optimal):		      if (finalscore > 0) retval = LARGEINT - 65 + finalscore;		      else if (finalscore < 0) retval = -(LARGEINT - 65 + finalscore);		      else retval = 0;		    }		}	    }	}      m_score.ScoreAdd(opponent, number_of_turned);      m_score.ScoreSubtract(player, number_of_turned);    }  /////////////////  // Restore board:  /////////////////  for (int i = number_of_turned; i > 0; i--)    {      mse = m_squarestack.Pop();      m_bc_score.ScoreAdd(opponent, m_bc_board[mse.m_x][mse.m_y]);      m_bc_score.ScoreSubtract(player, m_bc_board[mse.m_x][mse.m_y]);      m_board[mse.m_x][mse.m_y] = opponent;    }  m_board[xplay][yplay] = Score::NOBODY;  m_score.ScoreSubtract(player, 1);  m_bc_score.ScoreSubtract(player, m_bc_board[xplay][yplay]);  if (number_of_turned < 1 || GetInterrupt()) return ILLEGAL_VALUE;  else return retval;}int Engine::TryAllMoves(int opponent, int level, int cutoffval,			ULONG64 opponentbits, ULONG64 playerbits){  int maxval = -LARGEINT;  // keep GUI alive  yield();  ULONG64 null_bits;  null_bits = 0;  for (int x=1; x<9; x++)    {      for (int y=1; y<9; y++)	if (m_board[x][y] == Score::NOBODY &&	    (m_neighbor_bits[x][y] & playerbits) != null_bits)	  {	    int val = ComputeMove2(x, y, opponent, level+1, maxval, opponentbits,				   playerbits);	    if (val != ILLEGAL_VALUE && val > maxval)	      {		maxval = val;		if (maxval > -cutoffval || GetInterrupt()) break;	      }	  }      if (maxval > -cutoffval || GetInterrupt()) break;    }  if (GetInterrupt()) return -LARGEINT;  return maxval;}int Engine::EvaluatePosition(int player){  int retval;  int opponent = Score::GetOpponent(player);  int score_player = m_score.GetScore(player);  int score_opponent = m_score.GetScore(opponent);  if (m_exhaustive) retval = score_player - score_opponent;  else    {      retval = (100-m_coeff) *	(m_score.GetScore(player) - m_score.GetScore(opponent)) +	m_coeff * BC_WEIGHT *	(m_bc_score.GetScore(player)-m_bc_score.GetScore(opponent));    }  return retval;}void Engine::SetupBits(){  //m_coord_bit = new long[9][9];  //m_neighbor_bits = new long[9][9];  ULONG64 bits = 1;  for (int i=1; i < 9; i++)    for (int j=1; j < 9; j++)      {	m_coord_bit[i][j] = bits;#if !defined(__GNUC__)	bits.shl();#else	bits *= 2;#endif      }  for (int i=1; i < 9; i++)    for (int j=1; j < 9; j++)      {	m_neighbor_bits[i][j] = 0;	for (int xinc=-1; xinc<=1; xinc++)	  for (int yinc=-1; yinc<=1; yinc++)	    if (xinc != 0 || yinc != 0)	      if (i + xinc > 0 && i + xinc < 9 && j + yinc > 0 && j + yinc < 9)		m_neighbor_bits[i][j] |= m_coord_bit[i + xinc][j + yinc];      }}void Engine::SetupBcBoard(){  // JAVA m_bc_board = new int[9][9];  for (int i=1; i < 9; i++)    for (int j=1; j < 9; j++)      {	if (i == 2 || i == 7) m_bc_board[i][j] = -2; else m_bc_board[i][j] = 0;	if (j == 2 || j == 7) m_bc_board[i][j] -= 2;      }  m_bc_board[1][1] = 20;  m_bc_board[8][1] = 20;  m_bc_board[1][8] = 20;  m_bc_board[8][8] = 20;  m_bc_board[1][2] = -2;  m_bc_board[2][1] = -2;  m_bc_board[1][7] = -2;  m_bc_board[7][1] = -2;  m_bc_board[8][2] = -2;  m_bc_board[2][8] = -2;  m_bc_board[8][7] = -2;  m_bc_board[7][8] = -2;}int Engine::CalcBcScore(int player){  int sum = 0;  for (int i=1; i < 9; i++)    for (int j=1; j < 9; j++)      if (m_board[i][j] == player) 	sum += m_bc_board[i][j];  return sum;}ULONG64 Engine::ComputeOccupiedBits(int player){  ULONG64 retval = 0;  for (int i=1; i < 9; i++)    for (int j=1; j < 9; j++)      if (m_board[i][j] == player) retval |= m_coord_bit[i][j];  return retval;}

⌨️ 快捷键说明

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