#include <QDir>
#include <QTextStream>
#include <QCloseEvent>
+#include <QFileInfo>
+#include <QDateTime>
+#include <QTimer>
+#include <QApplication>
+#include <QDateTime>
+
+#ifdef Q_WS_MAEMO_5
+#include <QMaemo5InformationBox>
+#endif
#include <QDebug>
GameView::GameView(QWidget *parent) :
QGraphicsView(parent)
{
+ qsrand(QDateTime::currentDateTime().toTime_t());
scene_ = new QGraphicsScene;
hiddenIndex_ = -1;
setScene(scene_);
.arg(QDir::homePath()).arg(HOME_DIRECTORY).arg(RESTORE_FILE))) {
if(!restoreGame()) {
setPieces(ImageImporter::instance()->newPieces(Settings::instance()->image(), Settings::instance()->pieceCount()));
+ PuzzleItem::setMoveCount(0);
+ }
+ else {
+ QTimer::singleShot(0, this, SIGNAL(gameRestored()));
}
}
else {
}
// 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();
+
+ for(int i = 0; i < pieces_.count() * 10; ++i) {
+ int rand = qrand() % 4;
+
+ switch(rand) {
+ // up
+ case 0:
+ if(pieces_.at(hiddenIndex_)->currentPlace().y() > topLeft.y()) {
+ QPointF tmp = pieces_.at(hiddenIndex_)->currentPlace();
+ PuzzleItem *item = dynamic_cast<PuzzleItem *>(scene()->itemAt(tmp + QPointF(0, -verticalStep_)));
+ emptyPlace_ = item->currentPlace();
+ pieces_.at(hiddenIndex_)->setCurrentPlace(item->currentPlace());
+ item->setCurrentPlace(tmp);
+ }
+ break;
+ // down
+ case 1:
+ if(pieces_.at(hiddenIndex_)->currentPlace().y() < bottomRight.y()) {
+ QPointF tmp = pieces_.at(hiddenIndex_)->currentPlace();
+ PuzzleItem *item = dynamic_cast<PuzzleItem *>(scene()->itemAt(tmp + QPointF(0, verticalStep_)));
+ emptyPlace_ = item->currentPlace();
+ pieces_.at(hiddenIndex_)->setCurrentPlace(item->currentPlace());
+ item->setCurrentPlace(tmp);
}
- tmp = pieces_.at(changeIndex)->currentPlace();
- pieces_.at(changeIndex)->setCurrentPlace(pieces_.at(i)->currentPlace());
- pieces_.at(i)->setCurrentPlace(tmp);
+ break;
+ // left
+ case 2:
+ if(pieces_.at(hiddenIndex_)->currentPlace().x() > topLeft.x()) {
+ QPointF tmp = pieces_.at(hiddenIndex_)->currentPlace();
+ PuzzleItem *item = dynamic_cast<PuzzleItem *>(scene()->itemAt(tmp + QPointF(-horizontalStep_, 0)));
+ emptyPlace_ = item->currentPlace();
+ pieces_.at(hiddenIndex_)->setCurrentPlace(item->currentPlace());
+ item->setCurrentPlace(tmp);
+ }
+ break;
+ // right
+ case 3:
+ if(pieces_.at(hiddenIndex_)->currentPlace().x() < bottomRight.x()) {
+ QPointF tmp = pieces_.at(hiddenIndex_)->currentPlace();
+ PuzzleItem *item = dynamic_cast<PuzzleItem *>(scene()->itemAt(tmp + QPointF(horizontalStep_, 0)));
+ emptyPlace_ = item->currentPlace();
+ pieces_.at(hiddenIndex_)->setCurrentPlace(item->currentPlace());
+ item->setCurrentPlace(tmp);
+ }
+ break;
+ default:
+ qDebug() << "WTF?";
+ break;
}
}
}
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();
}
emptyPlace_ = place;
}
-bool GameView::areAllPiecesOk() const
+bool GameView::areAllPiecesOk()
{
for(int i = 0; i < pieces_.count(); ++i) {
// Skip hidden piece
// Show dialog with move count
QMessageBox::about(const_cast<GameView *>(this), tr("You won"), QString("Puzzle completed with %1 moves").arg(PuzzleItem::moveCount()));
+ emit gameWon();
return true;
}
qDebug() << "restore list count: " << list.count();
if(!list.isEmpty()) {
- Settings::instance()->setPieceCount(list.at(0).toInt());
+ bool ok = false;
+ int pieces = list.at(0).toInt(&ok);
+ if(!ok) {
+ return false;
+ }
QString im = list.at(1);
+ if(!QFile::exists(im) && im != "default") {
+ return false;
+ }
+
+ int moveCount = list.at(2).toInt(&ok);
+ if(!ok) {
+ return false;
+ }
+
+ Settings::instance()->setPieceCount(pieces);
+ PuzzleItem::setMoveCount(moveCount);
+
if(im == "default" || im.isEmpty()) {
Settings::instance()->setImage(0);
Settings::instance()->setImagePath("default");
Settings::instance()->setImagePath(im);
Settings::instance()->setImage(QPixmap(im));
}
- PuzzleItem::setMoveCount(list.at(2).toInt());
setPieces(ImageImporter::instance()->newPieces(Settings::instance()->image(), Settings::instance()->pieceCount()), false);
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)
- QPointF point(points.at(0).toInt(), points.at(1).toInt());
- qDebug() << "Setting piece " << pieces_.at(j)->pieceNumber();
- qDebug() << "x: " << point.x() << " y: " << point.y();
+ int x = points.at(0).toInt(&ok);
+ if(!ok) {
+ return false;
+ }
+
+ int y = points.at(1).toInt(&ok);
+ if(!ok) {
+ return false;
+ }
+
+ QPointF point(x, y);
+
+ //qDebug() << "Setting piece " << pieces_.at(j)->pieceNumber();
+ //qDebug() << "x: " << point.x() << " y: " << point.y();
pieces_.at(j)->setCurrentPlace(point);
}
+ else {
+ return false;
+ }
}
}
else {
for(int m = 0; m < pieces_.count(); ++m) {
pieces_.at(m)->setPos(pieces_.at(m)->currentPlace());
if(pieces_.at(m)->pieceNumber() == hidden.at(2).toInt()) {
- qDebug() << "Hiding piece number " << hidden;
+ //qDebug() << "Hiding piece number " << hidden;
hiddenIndex_ = m;
}
}
setMovingPieces();
}
else {
- // TODO: revert
setPieces(ImageImporter::instance()->newPieces(Settings::instance()->image(), Settings::instance()->pieceCount()));
file.close();
file.remove();
return false;
}
+ QFileInfo fileInfo(file);
+
+ QDateTime created = fileInfo.created();
+ QString infoTxt = QString("Restored game state from %1")
+ .arg(created.toString(Qt::TextDate));
+
+#ifdef Q_WS_MAEMO_5
+ QMaemo5InformationBox::information(this, infoTxt);
+#endif
+
file.close();
file.remove();
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);
out << Settings::instance()->pieceCount();
- out << ";;";
+ out << QString(";;");
if(Settings::instance()->imagePath().isEmpty()) {
- out << "default";
+ out << QString("default");
}
else {
out << Settings::instance()->imagePath();
}
- out << ";;";
+ out << QString(";;");
out << PuzzleItem::moveCount();
- out << ";;";
+ out << QString(";;");
// piece positions
int number = 0;
for(int i = 0; i < pieces_.count(); ++i) {
if(pieces_.at(i)->pieceNumber() == number + 1) {
out << pieces_.at(i)->currentPlace().x();
- out << "#";
+ out << QString("#");
out << pieces_.at(i)->currentPlace().y();
- out << ";;";
+ out << QString(";;");
pieces_.at(i)->pieceNumber();
if(!pieces_.at(i)->isVisible()) {
hiddenNo = number + 1;
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;
+}