#define SELECT_IMAGE_TXT "Select image..."
#define RESTORE_FILE "impuzzle.dat"
+#define STATS_FILE "imstats.dat"
#define HOME_DIRECTORY ".impuzzle"
#define IMPUZZLE_VERSION "0.6"
#include "settingsdialog.h"
#include "aboutdialog.h"
#include "puzzleitem.h"
+#include "statistics.h"
+#include "statisticsdialog.h"
#include <QAction>
#include <QMenu>
{
menu_ = menuBar()->addMenu("&Game");
menu_->addAction(newGameAction_);
+ menu_->addAction(statisticsAction_);
menu_->addAction(saveAction_);
menu_->addAction(importAction_);
saveAction_ = new QAction(tr("Save and quit"), this);
connect(saveAction_, SIGNAL(triggered()), GameView::instance(), SLOT(saveGame()));
saveAction_->setDisabled(true);
+
+ statisticsAction_ = new QAction(tr("Statistics"), this);
+ connect(statisticsAction_, SIGNAL(triggered()), this, SLOT(showStatistics()));
}
void MainWindow::importClicked()
{
if(saveAction_->isEnabled()) {
saveAction_->setDisabled(true);
+ Statistics::instance()->increaseGameCount(Settings::instance()->pieceCount() == EASY_PIECE_COUNT ? Statistics::easyDifficulty : Statistics::hardDifficulty);
+ Statistics::instance()->addNewScore(PuzzleItem::moveCount(),
+ Settings::instance()->pieceCount() == EASY_PIECE_COUNT ? Statistics::easyDifficulty : Statistics::hardDifficulty);
PuzzleItem::resetMoveCount();
}
}
event->accept();
}
+
+void MainWindow::showStatistics()
+{
+ StatisticsDialog dialog(this);
+ dialog.exec();
+}
void aboutClicked();
void gameEnded();
void enableSaving();
+ void showStatistics();
protected:
void closeEvent(QCloseEvent *event);
QAction *importAction_;
QAction *aboutAction_;
QAction *saveAction_;
+ QAction *statisticsAction_;
QMenu *menu_;
QMenu *helpMenu_;
introitem.h \
settings.h \
settingsdialog.h \
- aboutdialog.h
+ aboutdialog.h \
+ statistics.h \
+ statisticsdialog.h
SOURCES += gameview.cpp \
main.cpp \
mainwindow.cpp \
introitem.cpp \
settings.cpp \
settingsdialog.cpp \
- aboutdialog.cpp
+ aboutdialog.cpp \
+ statistics.cpp \
+ statisticsdialog.cpp
RESOURCES += resources.qrc
desktop.files += impuzzle.desktop
desktop.path = /usr/share/applications/hildon/
--- /dev/null
+#include "statistics.h"
+#include "defines.h"
+
+#include <QDir>
+#include <QFile>
+#include <QTextStream>
+#include <QStringList>
+
+Statistics *Statistics::instance_ = 0;
+
+Statistics::Statistics(QObject *parent) :
+ QObject(parent)
+{
+ moves_ << 0 << 0;
+ minMoves_ << 0 << 0;
+ maxMoves_ << 0 << 0;
+ games_ << 0 << 0;
+
+ readFile();
+}
+
+Statistics *Statistics::instance()
+{
+ if(!instance_) {
+ instance_ = new Statistics;
+ }
+
+ return instance_;
+}
+
+int Statistics::gameCount(Difficulty difficulty) const
+{
+ return games_.at(difficulty);
+}
+
+int Statistics::totalGameCount() const
+{
+ int count = 0;
+ for(int i = 0; i < games_.count(); ++i) {
+ count += games_.at(i);
+ }
+
+ return count;
+}
+
+qreal Statistics::averageMoves(Difficulty difficulty) const
+{
+ qreal count = 0.0;
+ if(games_.at(difficulty) > 0) {
+ count = moves_.at(difficulty) / static_cast<qreal>(games_.at(difficulty));
+ }
+
+ return count;
+}
+
+int Statistics::minMoves(Difficulty difficulty) const
+{
+ return minMoves_.at(difficulty);
+}
+
+int Statistics::maxMoves(Difficulty difficulty) const
+{
+ return maxMoves_.at(difficulty);
+}
+
+void Statistics::addNewScore(int moves, Difficulty difficulty)
+{
+ if(moves_.count() >= difficulty) {
+ moves_[difficulty] += (moves_[difficulty] + moves);
+ }
+
+ if(maxMoves_.count() >= difficulty) {
+ if(maxMoves_.at(difficulty) < moves || maxMoves_.at(difficulty) == 0) {
+ maxMoves_[difficulty] = moves;
+ }
+ }
+
+ if(minMoves_.count() >= difficulty) {
+ if(minMoves_.at(difficulty) > moves || minMoves_.at(difficulty) == 0) {
+ minMoves_[difficulty] = moves;
+ }
+ }
+
+ saveFile();
+}
+
+void Statistics::increaseGameCount(Difficulty difficulty)
+{
+ if(games_.count() >= difficulty) {
+ games_[difficulty]++;
+ }
+}
+
+void Statistics::readFile()
+{
+ QFile file(QString("%1/%2/%3")
+ .arg(QDir::homePath())
+ .arg(HOME_DIRECTORY)
+ .arg(STATS_FILE));
+
+ if(!file.exists()) {
+ return;
+ }
+
+ if(!file.open(QIODevice::ReadOnly)) {
+ return;
+ }
+
+ QTextStream in(&file);
+
+ while(!in.atEnd()) {
+ QString str = in.readLine();
+
+ QStringList list = str.split(" ");
+
+ if(list.count() == 5) {
+ moves_[list.at(0).toInt()] = list.at(1).toInt();
+ minMoves_[list.at(0).toInt()] = list.at(2).toInt();
+ maxMoves_[list.at(0).toInt()] = list.at(3).toInt();
+ games_[list.at(0).toInt()] = list.at(4).toInt();
+ }
+ }
+
+ file.close();
+}
+
+void Statistics::saveFile()
+{
+ QFile file(QString("%1/%2/%3")
+ .arg(QDir::homePath())
+ .arg(HOME_DIRECTORY)
+ .arg(STATS_FILE));
+
+ if(!file.open(QIODevice::WriteOnly)) {
+ return;
+ }
+
+ QTextStream out(&file);
+
+ for(int i = 0; i < games_.count(); i++) {
+ out << QString("%1 %2 %3 %4 %5\n")
+ .arg(i)
+ .arg(moves_.at(i))
+ .arg(minMoves_.at(i))
+ .arg(maxMoves_.at(i))
+ .arg(games_.at(i));
+ }
+
+ file.close();
+}
--- /dev/null
+#ifndef STATISTICS_H
+#define STATISTICS_H
+
+#include <QObject>
+#include <QList>
+
+class Statistics : public QObject
+{
+ Q_OBJECT
+
+public:
+ enum Difficulty {
+ easyDifficulty = 0,
+ hardDifficulty
+ };
+
+ static Statistics *instance();
+
+ int gameCount(Difficulty difficulty) const;
+
+ int totalGameCount() const;
+
+ qreal averageMoves(Difficulty difficulty) const;
+
+ int minMoves(Difficulty difficulty) const;
+
+ int maxMoves(Difficulty difficulty) const;
+
+public slots:
+ void addNewScore(int moves, Difficulty difficulty);
+
+ void increaseGameCount(Difficulty difficulty);
+
+ void readFile();
+
+ void saveFile();
+
+private:
+ Statistics(QObject *parent = 0);
+
+ static Statistics *instance_;
+
+ QList<int> moves_;
+ QList<int> minMoves_;
+ QList<int> maxMoves_;
+ QList<int> games_;
+};
+
+#endif
--- /dev/null
+#include "statisticsdialog.h"
+#include "statistics.h"
+
+#include <QFormLayout>
+#include <QLabel>
+
+StatisticsDialog::StatisticsDialog(QWidget *parent) :
+ QDialog(parent)
+{
+ setModal(true);
+ setWindowTitle(tr("Statistics"));
+
+ label_ = new QLabel;
+
+ QString txt = QString("Easy:\nGames\t%1\nBest\t%2\nAvg\t%3\nWorst\t%4\n\nHard:\nGames\t%5\nBest\t%6\nAvg\t%7\nWorst\t%8")
+ .arg(QString::number(Statistics::instance()->gameCount(Statistics::easyDifficulty)))
+ .arg(QString::number(Statistics::instance()->minMoves(Statistics::easyDifficulty)))
+ .arg(QString::number(Statistics::instance()->averageMoves(Statistics::easyDifficulty)))
+ .arg(QString::number(Statistics::instance()->maxMoves(Statistics::easyDifficulty)))
+ .arg(QString::number(Statistics::instance()->gameCount(Statistics::hardDifficulty)))
+ .arg(QString::number(Statistics::instance()->minMoves(Statistics::hardDifficulty)))
+ .arg(QString::number(Statistics::instance()->averageMoves(Statistics::hardDifficulty)))
+ .arg(QString::number(Statistics::instance()->maxMoves(Statistics::hardDifficulty)));
+
+ label_->setText(txt);
+
+ mainLayout_ = new QVBoxLayout;
+ mainLayout_->addWidget(label_);
+
+ setLayout(mainLayout_);
+}
--- /dev/null
+#ifndef STATISTICSDIALOG_H
+#define STATISTICSDIALOG_H
+
+#include <QDialog>
+
+class QLabel;
+class QVBoxLayout;
+
+class StatisticsDialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ StatisticsDialog(QWidget *parent = 0);
+
+private:
+ QLabel *label_;
+ QVBoxLayout *mainLayout_;
+};
+
+#endif