|
|
|
/**
|
|
|
|
* 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(TQString 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)
|
|
|
|
{
|
|
|
|
TQString confSection = TQString("%1 Evaluation Scheme").arg(_name);
|
|
|
|
config->setGroup(confSection);
|
|
|
|
|
|
|
|
TQStringList list;
|
|
|
|
TQString 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)
|
|
|
|
{
|
|
|
|
TQString confSection = TQString("%1 Evaluation Scheme").arg(_name);
|
|
|
|
config->setGroup(confSection);
|
|
|
|
|
|
|
|
TQString 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 += TQString(", %1").arg( _moveValue[i] );
|
|
|
|
config->writeEntry("MoveValues", entry);
|
|
|
|
|
|
|
|
entry.sprintf("%d", _inARowValue[0]);
|
|
|
|
for(int i=1;i<InARowCounter::inARowCount;i++)
|
|
|
|
entry += TQString(", %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(TQString scheme)
|
|
|
|
{
|
|
|
|
int pos = scheme.find('=');
|
|
|
|
if (pos<0) return 0;
|
|
|
|
|
|
|
|
EvalScheme* evalScheme = new EvalScheme( scheme.left(pos) );
|
|
|
|
evalScheme->setDefaults();
|
|
|
|
|
|
|
|
TQStringList list = TQStringList::split( TQString(","), 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;
|
|
|
|
}
|
|
|
|
|
|
|
|
TQString EvalScheme::ascii()
|
|
|
|
{
|
|
|
|
TQString res;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
res.sprintf("%s=%d", _name.ascii(), _stoneValue[1]);
|
|
|
|
for(i=1;i<6;i++)
|
|
|
|
res += TQString(",%1").arg( _stoneValue[i] );
|
|
|
|
for(i=0;i<Move::typeCount;i++)
|
|
|
|
res += TQString(",%1").arg( _moveValue[i] );
|
|
|
|
for(i=0;i<InARowCounter::inARowCount;i++)
|
|
|
|
res += TQString(",%1").arg( _inARowValue[i] );
|
|
|
|
for(i=0;i<5;i++)
|
|
|
|
res += TQString(",%1").arg( _ringValue[i] );
|
|
|
|
for(i=0;i<5;i++)
|
|
|
|
res += TQString(",%1").arg( _ringDiff[i] );
|
|
|
|
|
|
|
|
return res;
|
|
|
|
}
|