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();
}

//-----------------------------------------------------------------------------