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