Source Code (Use browser search to find items of interest.)
Class Index
ksirtet'AI (./kdegames/ksirtet/ai.h:44)
class AI : public QObject
{
Q_OBJECT
public:
AI(uint thinkTime, uint orderTime);
virtual ~AI();
void add(const QString &description, const AIElementInfo &,
int (*)(const Board &, const Board &) = 0);
bool configDialog(QWidget *parent);
void configChanged();
void launch(const Board *main);
void stop();
void start();
signals:
void rotateLeft();
void rotateRight();
void moveRight();
void moveLeft();
void dropDown();
private slots:
void timeout();
protected:
virtual void initThink();
virtual Board *createAIBoard() = 0;
static int nbOccupiedLines(const Board &, const Board &);
static int nbHoles(const Board &, const Board &);
static int nbSpaces(const Board &, const Board &);
static int peakToPeak(const Board &, const Board &);
static int mean(const Board &, const Board &);
static int nbRemoved(const Board &, const Board &);
private:
bool think();
void startTimer();
bool emitOrder();
double points() const;
QTimer timer;
enum ThinkState { Thinking, GivingOrders };
ThinkState state;
uint thinkTime, orderTime;
bool stopped;
QValueList<AIPiece> pieces;
QList<AIElement> elts;
Board *board;
const Board *main;
};
//-----------------------------------------------------------------------------
ksirtet'AI::AI() (./kdegames/ksirtet/ai.cpp:81)
AI::AI(uint tTime, uint oTime)
: timer(this), thinkTime(tTime), orderTime(oTime), stopped(FALSE), board(0)
{
connect(&timer, SIGNAL(timeout()), SLOT(timeout()));
add(i18n("Thinking depth"), THINKING_DEPTH);
add(i18n("Number of occupied lines"), OCC_LINES, nbOccupiedLines);
add(i18n("Peak-to-peak distance"), PEAK_TO_PEAK, peakToPeak);
add(i18n("Number of holes"), HOLES, nbHoles);
add(i18n("Number of spaces (under the mean height)"), SPACES, nbSpaces);
add(i18n("Mean height"), MEAN, mean);
}
ksirtet'AI::~AI() (./kdegames/ksirtet/ai.cpp:94)
AI::~AI()
{
delete board;
}
ksirtet'AI::add() (./kdegames/ksirtet/ai.cpp:99)
void AI::add(const QString &d, const AIElementInfo &i,
int (*f)(const Board &, const Board &))
{
elts.append(new AIElement(d, i, f));
}
ksirtet'AI::initThink() (./kdegames/ksirtet/ai.cpp:105)
void AI::initThink()
{
board->copy(*main);
}
ksirtet'AI::launch() (./kdegames/ksirtet/ai.cpp:110)
void AI::launch(const Board *m)
{
if ( board==0 ) board = createAIBoard();
timer.stop(); // clean eventual pending orders
main = m;
pieces.clear();
pieces.append( AIPiece(main->currentPiece(), main) );
pieces[0].reset();
// pieces.append( Piece(main->nextPiece(), main) );
// pieces[1].reset();
state = Thinking;
startTimer();
}
ksirtet'AI::stop() (./kdegames/ksirtet/ai.cpp:126)
void AI::stop()
{
if ( timer.isActive() ) {
timer.stop();
stopped = TRUE;
}
}
ksirtet'AI::start() (./kdegames/ksirtet/ai.cpp:134)
void AI::start()
{
if (stopped) {
startTimer();
stopped = FALSE;
}
}
ksirtet'AI::startTimer() (./kdegames/ksirtet/ai.cpp:142)
void AI::startTimer()
{
switch (state) {
case Thinking: timer.start(thinkTime, TRUE); break;
case GivingOrders: timer.start(orderTime, TRUE); break;
}
}
ksirtet'AI::timeout() (./kdegames/ksirtet/ai.cpp:150)
void AI::timeout()
{
switch (state) {
case Thinking:
if ( think() ) state = GivingOrders;
break;
case GivingOrders:
if ( emitOrder() ) return;
break;
}
startTimer();
}
ksirtet'AI::emitOrder() (./kdegames/ksirtet/ai.cpp:164)
bool AI::emitOrder()
{
switch (pieces[0].emitOrder()) {
case AIPiece::RotateRight: emit rotateRight(); return FALSE;
case AIPiece::RotateLeft: emit rotateLeft(); return FALSE;
case AIPiece::MoveRight: emit moveRight(); return FALSE;
case AIPiece::MoveLeft: emit moveLeft(); return FALSE;
case AIPiece::NoOrderLeft: emit dropDown(); return TRUE;
}
return TRUE; //dummy
}
ksirtet'AI::think() (./kdegames/ksirtet/ai.cpp:176)
bool AI::think()
{
initThink();
pieces[0].place(board);
// pieces[1].place(board);
pieces[0].setPoints( points() );
// if ( pieces[1].increment() ) {
// pieces[1].reset();
return pieces[0].increment();
// }
// return FALSE;
}
ksirtet'AI::points() (./kdegames/ksirtet/ai.cpp:190)
double AI::points() const
{
double pts = 0;
QListIterator<AIElement> it(elts);
for (; it.current(); ++it) pts += it.current()->points(*main, *board);
return pts;
}
ksirtet'AI::configDialog() (./kdegames/ksirtet/ai.cpp:198)
bool AI::configDialog(QWidget *parent)
{
AIConfigDialog acd(elts, parent);
return acd.exec()==QDialog::Accepted;
}
ksirtet'AI::configChanged() (./kdegames/ksirtet/ai.cpp:204)
void AI::configChanged()
{
QListIterator<AIElement> it(elts);
for (; it.current(); ++it) it.current()->readConfig();
}
ksirtet'AI::nbOccupiedLines() (./kdegames/ksirtet/ai.cpp:210)
int AI::nbOccupiedLines(const Board &, const Board ¤t)
{
return current.matrix().height() - current.nbClearLines();
}
ksirtet'AI::nbHoles() (./kdegames/ksirtet/ai.cpp:215)
int AI::nbHoles(const Board &, const Board ¤t)
{
uint nb = 0;
for (uint i=0; i<current.matrix().width(); i++) {
for (int j=current.firstColumnBlock(i)-1; j>=0; j--)
if ( current.matrix()(i, j)==0 ) nb++;
}
return nb;
}
ksirtet'AI::peakToPeak() (./kdegames/ksirtet/ai.cpp:225)
int AI::peakToPeak(const Board &, const Board ¤t)
{
int min = current.matrix().height()-1;
for (uint i=0; i<current.matrix().width(); i++)
min = QMIN(min, current.firstColumnBlock(i));
return (int)current.firstClearLine()-1 - min;
}
ksirtet'AI::mean() (./kdegames/ksirtet/ai.cpp:233)
int AI::mean(const Board &, const Board ¤t)
{
uint mean = 0;
for (uint i=0; i<current.matrix().width(); i++)
mean += current.firstColumnBlock(i);
return mean / current.matrix().width();
}
ksirtet'AI::nbSpaces() (./kdegames/ksirtet/ai.cpp:241)
int AI::nbSpaces(const Board &main, const Board ¤t)
{
int nb = 0;
int m = mean(main, current);
for (uint i=0; i<current.matrix().width(); i++) {
int j = current.firstColumnBlock(i);
if ( j<m ) nb += m - j;
}
return nb;
}
ksirtet'AI::nbRemoved() (./kdegames/ksirtet/ai.cpp:252)
int AI::nbRemoved(const Board &main, const Board ¤t)
{
return current.nbRemoved() - main.nbRemoved();
}
//-----------------------------------------------------------------------------