summaryrefslogtreecommitdiffstats
path: root/kenolaba/EvalScheme.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kenolaba/EvalScheme.cpp')
-rw-r--r--kenolaba/EvalScheme.cpp231
1 files changed, 231 insertions, 0 deletions
diff --git a/kenolaba/EvalScheme.cpp b/kenolaba/EvalScheme.cpp
new file mode 100644
index 00000000..18ba5b43
--- /dev/null
+++ b/kenolaba/EvalScheme.cpp
@@ -0,0 +1,231 @@
+/**
+ * EvalScheme
+ *
+ * Configuration options for a Evaluation Scheme.
+ * Evaluation Schemes are used for evalution of a Abalone board position
+ *
+ * (C) JW, 2000
+ */
+
+#include <kapplication.h>
+#include <kconfig.h>
+
+#include "EvalScheme.h"
+
+// Default Values
+static int defaultRingValue[] = { 45, 35, 25, 10, 0 };
+static int defaultRingDiff[] = { 0, 10, 10, 8, 5 };
+static int defaultStoneValue[]= { 0,-800,-1800,-3000,-4400,-6000 };
+static int defaultMoveValue[Move::typeCount] = { 40,30,30, 15,14,13,
+ 5,5,5, 2,2,2, 1 };
+static int defaultInARowValue[InARowCounter::inARowCount]= { 2, 5, 4, 3 };
+
+
+/**
+ * Constructor: Set Default values
+ */
+EvalScheme::EvalScheme(QString n)
+{
+ _name = n;
+ setDefaults();
+}
+
+
+/**
+ * Copy Constructor
+ */
+EvalScheme::EvalScheme(EvalScheme& s)
+{
+ _name = s._name;
+
+ for(int i=0;i<6;i++)
+ _stoneValue[i] = s._stoneValue[i];
+
+ for(int i=0;i<Move::typeCount;i++)
+ _moveValue[i] = s._moveValue[i];
+
+ for(int i=0;i<InARowCounter::inARowCount;i++)
+ _inARowValue[i] = s._inARowValue[i];
+
+ for(int i=0;i<5;i++)
+ _ringValue[i] = s._ringValue[i];
+
+ for(int i=0;i<5;i++)
+ _ringDiff[i] = s._ringDiff[i];
+}
+
+
+void EvalScheme::setDefaults()
+{
+ for(int i=0;i<6;i++)
+ _stoneValue[i] = defaultStoneValue[i];
+
+ for(int i=0;i<Move::typeCount;i++)
+ _moveValue[i] = defaultMoveValue[i];
+
+ for(int i=0;i<InARowCounter::inARowCount;i++)
+ _inARowValue[i] = defaultInARowValue[i];
+
+ for(int i=0;i<5;i++)
+ _ringValue[i] = defaultRingValue[i];
+
+ for(int i=0;i<5;i++)
+ _ringDiff[i] = defaultRingDiff[i];
+}
+
+
+void EvalScheme::read(KConfig *config)
+{
+ QString confSection = QString("%1 Evaluation Scheme").arg(_name);
+ config->setGroup(confSection);
+
+ QStringList list;
+ QString tmp;
+
+ list = config->readListEntry("StoneValues");
+ if (list.count()>0) {
+ _stoneValue[0] = 0;
+ for(int i=1;i<6;i++)
+ _stoneValue[i] = list[i-1].toInt();
+ }
+
+ list = config->readListEntry("MoveValues");
+ if (list.count()>0) {
+ for(int i=0;i<Move::typeCount;i++)
+ _moveValue[i] = list[i].toInt();
+ }
+
+ list = config->readListEntry("InARowValues");
+ if (list.count()>0) {
+ for(int i=0;i<InARowCounter::inARowCount;i++)
+ _inARowValue[i] = list[i].toInt();
+ }
+
+ list = config->readListEntry("RingValues");
+ if (list.count()>0) {
+ for(int i=0;i<5;i++)
+ _ringValue[i] = list[i].toInt();
+ }
+
+ list = config->readListEntry("RingDiffs");
+ if (list.count()>0) {
+ for(int i=0;i<5;i++)
+ _ringDiff[i] = list[i].toInt();
+ }
+}
+
+
+void EvalScheme::save(KConfig* config)
+{
+ QString confSection = QString("%1 Evaluation Scheme").arg(_name);
+ config->setGroup(confSection);
+
+ QString entry;
+
+ entry.sprintf("%d,%d,%d,%d,%d", _stoneValue[1], _stoneValue[2],
+ _stoneValue[3], _stoneValue[4], _stoneValue[5]);
+ config->writeEntry("StoneValues", entry);
+
+ entry.sprintf("%d", _moveValue[0]);
+ for(int i=1;i<Move::typeCount;i++)
+ entry += QString(", %1").arg( _moveValue[i] );
+ config->writeEntry("MoveValues", entry);
+
+ entry.sprintf("%d", _inARowValue[0]);
+ for(int i=1;i<InARowCounter::inARowCount;i++)
+ entry += QString(", %1").arg( _inARowValue[i] );
+ config->writeEntry("InARowValues", entry);
+
+ entry.sprintf("%d,%d,%d,%d,%d", _ringValue[0], _ringValue[1],
+ _ringValue[2], _ringValue[3], _ringValue[4]);
+ config->writeEntry("RingValues", entry);
+
+ entry.sprintf("%d,%d,%d,%d,%d", _ringDiff[0], _ringDiff[1],
+ _ringDiff[2], _ringDiff[3], _ringDiff[4]);
+ config->writeEntry("RingDiffs", entry);
+}
+
+void EvalScheme::setRingValue(int ring, int value)
+{
+ if (ring >=0 && ring <5)
+ _ringValue[ring] = value;
+}
+
+void EvalScheme::setRingDiff(int ring, int value)
+{
+ if (ring >=1 && ring <5)
+ _ringDiff[ring] = value;
+}
+
+void EvalScheme::setStoneValue(int stoneDiff, int value)
+{
+ if (stoneDiff>0 && stoneDiff<6)
+ _stoneValue[stoneDiff] = value;
+}
+
+void EvalScheme::setMoveValue(int type, int value)
+{
+ if (type>=0 && type<Move::typeCount)
+ _moveValue[type] = value;
+}
+
+void EvalScheme::setInARowValue(int stones, int value)
+{
+ if (stones>=0 && stones<InARowCounter::inARowCount)
+ _inARowValue[stones] = value;
+}
+
+/**
+ * Create a EvalScheme out of a String of format
+ *
+ * <SchemeName>=<v1>,<v2>,<v3>,<v4>,... (34 values)
+ *
+ */
+
+EvalScheme* EvalScheme::create(QString scheme)
+{
+ int pos = scheme.find('=');
+ if (pos<0) return 0;
+
+ EvalScheme* evalScheme = new EvalScheme( scheme.left(pos) );
+ evalScheme->setDefaults();
+
+ QStringList list = QStringList::split( QString(","), scheme.right(pos+1) );
+
+ int i=0;
+ while(i<list.count()) {
+ if (i<5)
+ evalScheme->_stoneValue[i+1] = list[i].toInt();
+ else if (i<10)
+ evalScheme->_ringValue[i-5] = list[i].toInt();
+ else if (i<15)
+ evalScheme->_ringDiff[i-10] = list[i].toInt();
+ else if (i<15+Move::typeCount)
+ evalScheme->_moveValue[i-15] = list[i].toInt();
+ else if (i<15+Move::typeCount+InARowCounter::inARowCount)
+ evalScheme->_inARowValue[i-15-Move::typeCount] = list[i].toInt();
+ i++;
+ }
+
+ return evalScheme;
+}
+
+QString EvalScheme::ascii()
+{
+ QString res;
+ int i;
+
+ res.sprintf("%s=%d", _name.ascii(), _stoneValue[1]);
+ for(i=1;i<6;i++)
+ res += QString(",%1").arg( _stoneValue[i] );
+ for(i=0;i<Move::typeCount;i++)
+ res += QString(",%1").arg( _moveValue[i] );
+ for(i=0;i<InARowCounter::inARowCount;i++)
+ res += QString(",%1").arg( _inARowValue[i] );
+ for(i=0;i<5;i++)
+ res += QString(",%1").arg( _ringValue[i] );
+ for(i=0;i<5;i++)
+ res += QString(",%1").arg( _ringDiff[i] );
+
+ return res;
+}