00001
00002
00003
00004
00005
00006
00007 #ifndef SG_EVALUATEDMOVES_H
00008 #define SG_EVALUATEDMOVES_H
00009
00010 #include "SgPointSet.h"
00011 #include "SgVector.h"
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 class SgEvaluatedMoves
00022 {
00023 public:
00024 explicit SgEvaluatedMoves(const SgPointSet& relevant)
00025 : m_bestValue(s_minValue),
00026 m_relevant(relevant)
00027 { }
00028
00029 SgEvaluatedMoves(const SgEvaluatedMoves& original)
00030 : m_bestValue(original.m_bestValue),
00031 m_moveList(original.m_moveList),
00032 m_relevant(original.m_relevant)
00033 { }
00034
00035 virtual ~SgEvaluatedMoves()
00036 { }
00037
00038 virtual void AddMove(SgPoint move, int value);
00039
00040 virtual void AddMoves(const SgPointSet& moves, int value);
00041
00042 virtual void AddMoves(const SgVector<SgPoint>& moves, int value);
00043
00044 virtual void Clear()
00045 {
00046 m_bestValue = s_minValue;
00047 m_moveList.Clear();
00048 }
00049
00050 SgPoint BestMove();
00051
00052 int BestValue()
00053 {
00054 return m_bestValue;
00055 }
00056
00057 const SgPointSet& Relevant() const
00058 {
00059 return m_relevant;
00060 }
00061
00062 bool IsRelevant(SgPoint p) const
00063 {
00064 return m_relevant[p];
00065 }
00066
00067 void Disable(SgPoint p)
00068 {
00069 m_relevant.Exclude(p);
00070 }
00071
00072 void Enable(SgPoint p)
00073 {
00074 m_relevant.Include(p);
00075 }
00076
00077 virtual SgEvaluatedMoves* Duplicate() const
00078 {
00079 return new SgEvaluatedMoves(*this);
00080 }
00081
00082 virtual int GetEvaluation(SgPoint p) const
00083 {
00084 if (m_moveList.Contains(p))
00085 return m_bestValue;
00086 else
00087 return 0;
00088 }
00089
00090
00091 virtual void BestMoves(SgVector<SgPoint>& best, int nuMoves) const;
00092
00093 protected:
00094 int m_bestValue;
00095
00096 SgVector<SgPoint> m_moveList;
00097
00098 SgPointSet m_relevant;
00099
00100
00101 static const int s_minValue = INT_MIN + 1;
00102 };
00103
00104
00105
00106
00107
00108
00109 class SgEvaluatedMovesArray
00110 : public SgEvaluatedMoves
00111 {
00112 public:
00113 explicit SgEvaluatedMovesArray(const SgPointSet& relevant,
00114 int boardSize = SG_MAX_SIZE);
00115
00116 virtual ~SgEvaluatedMovesArray()
00117 { }
00118
00119 SgEvaluatedMovesArray(const SgEvaluatedMovesArray& original)
00120 : SgEvaluatedMoves(original),
00121 m_boardSize(original.m_boardSize)
00122 {
00123 for (int i = 0; i < SG_MAXPOINT; ++i)
00124 m_value[i] = original.m_value[i];
00125 }
00126
00127 virtual void AddMove(SgPoint move, int value);
00128
00129 virtual void ReduceMove(SgPoint move, int value);
00130
00131 virtual void Clear();
00132
00133 void Write() const;
00134
00135 virtual SgEvaluatedMoves* Duplicate() const
00136 {
00137 return new SgEvaluatedMovesArray(*this);
00138 }
00139
00140 virtual int GetEvaluation(SgPoint p) const
00141 {
00142 return m_value[p];
00143 }
00144
00145 virtual void BestMoves(SgVector<SgPoint>& best, int nuMoves) const;
00146
00147 private:
00148 int m_value[SG_MAXPOINT];
00149
00150 int m_boardSize;
00151
00152 SgPoint SelectNextBest(SgVector<SgPoint>& bestSoFar) const;
00153 };
00154
00155
00156
00157 #endif // SG_EVALUATEDMOVES_H