Index   Main   Namespaces   Classes   Hierarchy   Annotated   Files   Compound   Global   Pages  

SgEvaluatedMoves.cpp

Go to the documentation of this file.
00001 //----------------------------------------------------------------------------
00002 /** @file SgEvaluatedMoves.cpp
00003     See SgEvaluatedMoves.h
00004 */
00005 //----------------------------------------------------------------------------
00006 
00007 #include "SgSystem.h"
00008 #include "SgEvaluatedMoves.h"
00009 
00010 #include <iomanip>
00011 #include "SgDebug.h"
00012 #include "SgRandom.h"
00013 #include "SgWrite.h"
00014 
00015 using namespace std;
00016 
00017 //----------------------------------------------------------------------------
00018 
00019 void SgEvaluatedMoves::AddMove(SgPoint move, int value)
00020 {
00021     if (SgPointUtil::InBoardRange(move) && m_relevant[move])
00022     {
00023         if (value > m_bestValue)
00024         {
00025             m_bestValue = value;
00026             m_moveList.Clear();
00027         }
00028         if (value >= m_bestValue)
00029             m_moveList.PushBack(move);
00030     }
00031 }
00032 
00033 void SgEvaluatedMoves::AddMoves(const SgPointSet& moves, int value)
00034 {
00035     for (SgSetIterator it(moves); it; ++it)
00036         AddMove(*it, value);
00037 }
00038 
00039 void SgEvaluatedMoves::AddMoves(const SgVector<SgPoint>& moves, int value)
00040 {
00041     for (SgVectorIterator<SgPoint> it(moves); it; ++it)
00042         AddMove(*it, value);
00043 }
00044 
00045 SgPoint SgEvaluatedMoves::BestMove()
00046 {
00047     if (m_moveList.IsEmpty())
00048         return SG_PASS;
00049     else
00050         return m_moveList[SgRandom::Global().Int(m_moveList.Length())];
00051 }
00052 
00053 void SgEvaluatedMoves::BestMoves(SgVector<SgPoint>& best, int nuMoves) const
00054 {
00055     SG_UNUSED(nuMoves);
00056     best = m_moveList; // AR: cut off at 'nuMoves'??
00057 }
00058 
00059 //----------------------------------------------------------------------------
00060 
00061 SgEvaluatedMovesArray::SgEvaluatedMovesArray(const SgPointSet& relevant,
00062                                              int boardSize)
00063     : SgEvaluatedMoves(relevant),
00064       m_boardSize(boardSize)
00065 {
00066     for (int i = 0; i < SG_MAXPOINT; ++i)
00067         m_value[i] = 0;
00068 }
00069 
00070 void SgEvaluatedMovesArray::AddMove(SgPoint move, int value)
00071 {
00072     if (SgPointUtil::InBoardRange(move) && m_relevant[move])
00073     {
00074         m_value[move] += value;
00075         SgEvaluatedMoves::AddMove(move, m_value[move]);
00076     }
00077 }
00078 
00079 void SgEvaluatedMovesArray::ReduceMove(SgPoint move, int value)
00080 {
00081     if (SgPointUtil::InBoardRange(move) && m_relevant[move])
00082     {
00083         m_value[move] -= value;
00084         SgEvaluatedMoves::AddMove(move, m_value[move]);
00085     }
00086 }
00087 
00088 SgPoint SgEvaluatedMovesArray::SelectNextBest(SgVector<SgPoint>& bestSoFar)
00089     const
00090 {
00091     int bestValue = s_minValue; SgPoint best = 0;
00092     for (SgPoint p = 0; p < SG_MAXPOINT; ++p)
00093     {
00094         if ((m_value[p] > bestValue) && ! bestSoFar.Contains(p))
00095         {
00096             bestValue = m_value[p];
00097             best = p;
00098         }
00099     }
00100     return best;
00101 }
00102 
00103 void SgEvaluatedMovesArray::BestMoves(SgVector<SgPoint>& best, int nuMoves)
00104     const
00105 {
00106     best.Clear();
00107     while (--nuMoves >= 0)
00108     {
00109         int nextBest = SelectNextBest(best);
00110         best.PushBack(nextBest);
00111     }
00112 }
00113 
00114 void SgEvaluatedMovesArray::Write() const
00115 {
00116     int i, j;
00117     SgDebug() << "      ";
00118     for (j=1; j <= m_boardSize; ++j)
00119     {
00120         SgDebug() << SgPointUtil::Letter(j) << "    ";
00121     }
00122 
00123     for (i = 1; i <= m_boardSize; ++i)
00124     {
00125         SgDebug() << '\n' << setw(2) << i;
00126         for (j = 1; j <= m_boardSize; ++j)
00127             SgDebug() << setw(5) << m_value[SgPointUtil::Pt(j, i)];
00128         SgDebug() << '\n';
00129     }
00130 }
00131 
00132 void SgEvaluatedMovesArray::Clear()
00133 {
00134     for (SgPoint p = 0; p < SG_MAXPOINT; ++p)
00135         m_value[p] = 0;
00136 }
00137 
00138 //----------------------------------------------------------------------------
00139 


17 Jun 2010 Doxygen 1.4.7