#include <QCloseEvent>
#include <QFileInfo>
#include <QDateTime>
+#include <QTimer>
+#include <QApplication>
+#include <QDateTime>
#ifdef Q_WS_MAEMO_5
#include <QMaemo5InformationBox>
GameView::GameView(QWidget *parent) :
QGraphicsView(parent)
{
+ setBackgroundBrush(Qt::black);
+ qsrand(QDateTime::currentDateTime().toTime_t());
scene_ = new QGraphicsScene;
hiddenIndex_ = -1;
setScene(scene_);
introItem_ = new IntroItem;
- introItem_->setText("Select new game from menu to play");
+ introItem_->setText("- ImPuzzle -");
verticalStep_ = 0;
horizontalStep_ = 0;
setPieces(ImageImporter::instance()->newPieces(Settings::instance()->image(), Settings::instance()->pieceCount()));
PuzzleItem::setMoveCount(0);
}
+ else {
+ QTimer::singleShot(0, this, SIGNAL(gameRestored()));
+ }
}
else {
scene_->addItem(introItem_);
}
}
+//TODO: fixme!
void GameView::shufflePieces()
{
if(pieces_.isEmpty()) {
}
// Give pieces ramdom locations
- int rounds = 5; //TODO
- for(int j = 0; j < rounds; ++j) {
- for(int i = 0; i < pieces_.count(); ++i) {
- QPointF tmp;
- int changeIndex = 0;
- while(changeIndex == i) {
- changeIndex = qrand() % pieces_.count();
+ hiddenIndex_ = qrand() % pieces_.count();
+ emptyPlace_ = pieces_.at(hiddenIndex_)->currentPlace();
+
+ QPointF topLeft = pieces_.at(0)->correctPlace();
+ QPointF bottomRight = pieces_.last()->correctPlace();
+
+ int moveCount = pieces_.count() * 10;
+ int movesMade = 0;
+
+ PuzzleItem *item = 0;
+
+ for(int i = 0; i < moveCount; ++i) {
+ int rand = qrand() % 4;
+
+ switch(rand) {
+ // up
+ case 0:
+ if(pieces_.at(hiddenIndex_)->currentPlace().y() > topLeft.y()) {
+ QPointF tmp = pieces_.at(hiddenIndex_)->currentPlace();
+ item = dynamic_cast<PuzzleItem *>(scene()->itemAt(tmp + QPointF(0, -verticalStep_)));
+ if(item->movable()) {
+ emptyPlace_ = item->currentPlace();
+ pieces_.at(hiddenIndex_)->setCurrentPlace(item->currentPlace());
+ pieces_.at(hiddenIndex_)->setPos(item->currentPlace());
+ item->setCurrentPlace(tmp);
+ item->setPos(tmp);
+ invalidateScene();
+ scene()->update();
+ setMovingPieces();
+ movesMade++;
+ }
+ else {
+ qDebug() << "Item right of hidden piece not movable";
+ }
+ }
+ else {
+ --i;
+ }
+ break;
+ // down
+ case 1:
+ if(pieces_.at(hiddenIndex_)->currentPlace().y() < bottomRight.y()) {
+ QPointF tmp = pieces_.at(hiddenIndex_)->currentPlace();
+ item = dynamic_cast<PuzzleItem *>(scene()->itemAt(tmp + QPointF(0, verticalStep_)));
+ if(item->movable()) {
+ emptyPlace_ = item->currentPlace();
+ pieces_.at(hiddenIndex_)->setCurrentPlace(item->currentPlace());
+ pieces_.at(hiddenIndex_)->setPos(item->currentPlace());
+ item->setCurrentPlace(tmp);
+ item->setPos(tmp);
+ setMovingPieces();
+ movesMade++;
+ }
+ else {
+ qDebug() << "Item down of hidden piece not movable";
+ }
+ }
+ else {
+ --i;
+ }
+ break;
+ // left
+ case 2:
+ if(pieces_.at(hiddenIndex_)->currentPlace().x() > topLeft.x()) {
+ QPointF tmp = pieces_.at(hiddenIndex_)->currentPlace();
+ item = dynamic_cast<PuzzleItem *>(scene()->itemAt(tmp + QPointF(-horizontalStep_, 0)));
+ if(item->movable()) {
+ emptyPlace_ = item->currentPlace();
+ pieces_.at(hiddenIndex_)->setCurrentPlace(item->currentPlace());
+ pieces_.at(hiddenIndex_)->setPos(item->currentPlace());
+ item->setCurrentPlace(tmp);
+ item->setPos(tmp);
+ setMovingPieces();
+ movesMade++;
+ }
+ else {
+ qDebug() << "Item left of hidden piece not movable";
+ }
+ }
+ else {
+ --i;
+ }
+ break;
+ // right
+ case 3:
+ if(pieces_.at(hiddenIndex_)->currentPlace().x() < bottomRight.x()) {
+ QPointF tmp = pieces_.at(hiddenIndex_)->currentPlace();
+ item = dynamic_cast<PuzzleItem *>(scene()->itemAt(tmp + QPointF(horizontalStep_, 0)));
+ if(item->movable()) {
+ emptyPlace_ = item->currentPlace();
+ pieces_.at(hiddenIndex_)->setCurrentPlace(item->currentPlace());
+ pieces_.at(hiddenIndex_)->setPos(item->currentPlace());
+ item->setCurrentPlace(tmp);
+ item->setPos(tmp);
+ setMovingPieces();
+ movesMade++;
+ }
+ else {
+ qDebug() << "Item up of hidden piece not movable";
+ }
}
- tmp = pieces_.at(changeIndex)->currentPlace();
- pieces_.at(changeIndex)->setCurrentPlace(pieces_.at(i)->currentPlace());
- pieces_.at(i)->setCurrentPlace(tmp);
+ else {
+ --i;
+ }
+ break;
+ default:
+ qDebug() << "WTF?";
+ break;
}
}
+ qDebug() << QString("Shuffle moves: %1/%2").arg(movesMade).arg(moveCount);
+
QParallelAnimationGroup *animationGroup = new QParallelAnimationGroup(this);
for(int i = 0; i < pieces_.count(); ++i) {
QPropertyAnimation *animation = new QPropertyAnimation(pieces_.at(i), "pos");
}
animationGroup->start();
- // Hide random piece
- int hiddenPiece = qrand() % pieces_.count();
- emptyPlace_ = pieces_.at(hiddenPiece)->currentPlace();
- pieces_.at(hiddenPiece)->hide();
- hiddenIndex_ = hiddenPiece;
+ // Hide
+ pieces_.at(hiddenIndex_)->hide();
setMovingPieces();
}
for(int j = 0; j < pieces_.count(); ++j) {
if(!list.at(j + 3).isNull()) {
QStringList points = list.at(j + 3).split("#");
- //if(points.count() == 2)
+
int x = points.at(0).toInt(&ok);
if(!ok) {
return false;
return true;
}
-bool GameView::saveGame()
+void GameView::saveGame()
{
if(pieces_.isEmpty() || pieces_.count() < EASY_PIECE_COUNT) {
- return false;
+ return;
}
QDir dir;
if(!file.open(QIODevice::WriteOnly)) {
qDebug() << "Failed to open restore file for writing";
- return false;
+ return;
}
QTextStream out(&file);
file.close();
- return true;
+ qApp->quit();
}
void GameView::closeEvent(QCloseEvent *event)
event->accept();
}
+
+int GameView::correctPlaces() const
+{
+ int c = 0;
+
+ for(int i = 0; i < pieces_.count(); ++i) {
+ if(pieces_.at(i)->currentPlace() == pieces_.at(i)->correctPlace()) {
+ c++;
+ }
+ }
+
+ return c;
+}
+
+QList<int> GameView::movingPlaces() const
+{
+ QList<int> m;
+
+ for(int i = 0; i < pieces_.count(); ++i) {
+ if(pieces_.at(i)->movable()) {
+ m.append(i);
+ }
+ }
+
+ return m;
+}