Index   Main   Namespaces   Classes   Hierarchy   Annotated   Files   Compound   Global   Pages  

SpMaxEyePlayer.cpp

Go to the documentation of this file.
00001 //----------------------------------------------------------------------------
00002 /** @file SpMaxEyePlayer.cpp */
00003 //----------------------------------------------------------------------------
00004 
00005 #include "SgSystem.h"
00006 #include "SpMaxEyePlayer.h"
00007 
00008 #include "GoEyeUtil.h"
00009 
00010 //----------------------------------------------------------------------------
00011 
00012 using namespace std;
00013 
00014 //----------------------------------------------------------------------------
00015 
00016 float SpMaxEyeMoveGenerator::Heuristic(SgPoint p, SgBlackWhite colour)
00017 {
00018     // Score is inversely proportional to number of moves to make eye
00019     int nummoves;
00020     bool eyepossible = 
00021         GoEyeUtil::NumberOfMoveToEye2(m_board, colour, p, nummoves);
00022 
00023     // Impossible eyes are not urgent
00024     if (! eyepossible)
00025         return 0.0f;
00026 
00027     // Otherwise the fewer moves to completion, the more urgent to play
00028     if (colour == m_board.Opponent())
00029         return 1.0f / (static_cast<float>(nummoves) + 1.0f);
00030 
00031     // Opponent is to play, so urgency is half a move greater
00032     else
00033         return 1.0f / (static_cast<float>(nummoves) + 0.5f);
00034 }
00035 
00036 int SpMaxEyeMoveGenerator::Evaluate()
00037 {
00038     // We are Opponent since this is after executing our move
00039     SgBlackWhite player = m_board.Opponent();
00040     SgBlackWhite opponent = m_board.ToPlay();
00041  
00042     float sign = 0;
00043     float maxeyescore = -1;
00044     float totaleyescore = 0;
00045     
00046     for (GoBoard::Iterator iBoard(m_board); iBoard; ++iBoard)
00047     {
00048         float playerscore = Heuristic(*iBoard, player);
00049         float oppscore = Heuristic(*iBoard, opponent);
00050 
00051         totaleyescore += playerscore - oppscore;
00052 
00053         if (playerscore > maxeyescore)
00054         {
00055             maxeyescore = playerscore;
00056             sign = 1;
00057         }
00058             
00059         if (oppscore > maxeyescore)
00060         {
00061             maxeyescore = oppscore;
00062             sign = -1;
00063         }
00064     }
00065 
00066     // Find the point with the maximum eye score
00067     // Tie-break using the total eye score
00068     if (m_eyeGo)
00069         return static_cast<int>(
00070             maxeyescore * sign * 10000.0f + totaleyescore * 100.0f);
00071 
00072     // Play to score the most eye-ishly overall
00073     else
00074         return static_cast<int>(
00075             totaleyescore * 100.0f);
00076 }
00077 
00078 //----------------------------------------------------------------------------
00079 


Sun Mar 13 2011 Doxygen 1.7.1