From 8ae7e6b9abcc77ee0d5b394165910d37101c53d5 Mon Sep 17 00:00:00 2001 From: Apostolof Date: Sun, 18 Jun 2017 11:52:17 +0300 Subject: [PATCH] Init --- board.cpp | 108 +++++ board.h | 30 ++ images/Activatedbomb.png | Bin 0 -> 239 bytes images/bomb.png | Bin 0 -> 233 bytes images/eight.png | Bin 0 -> 259 bytes images/five.png | Bin 0 -> 292 bytes images/flag.png | Bin 0 -> 176 bytes images/four.png | Bin 0 -> 235 bytes images/one.png | Bin 0 -> 168 bytes images/seven.png | Bin 0 -> 252 bytes images/six.png | Bin 0 -> 288 bytes images/three.png | Bin 0 -> 281 bytes images/two.png | Bin 0 -> 228 bytes images/zero.png | Bin 0 -> 136 bytes main.cpp | 14 + mainwindow.ui | 24 + mineicon.ico | Bin 0 -> 262142 bytes minesico.rc | 1 + minesweeperbutton.cpp | 44 ++ minesweeperbutton.h | 27 ++ my_minesweeper.pro | 24 + my_minesweeper.pro.user | 318 +++++++++++++ my_minesweeper.pro.user.d697354 | 562 +++++++++++++++++++++++ photothumb.db | Bin 0 -> 3072 bytes resource.qrc | 16 + window.cpp | 760 ++++++++++++++++++++++++++++++++ window.h | 98 ++++ 27 files changed, 2026 insertions(+) create mode 100644 board.cpp create mode 100644 board.h create mode 100644 images/Activatedbomb.png create mode 100644 images/bomb.png create mode 100644 images/eight.png create mode 100644 images/five.png create mode 100644 images/flag.png create mode 100644 images/four.png create mode 100644 images/one.png create mode 100644 images/seven.png create mode 100644 images/six.png create mode 100644 images/three.png create mode 100644 images/two.png create mode 100644 images/zero.png create mode 100644 main.cpp create mode 100644 mainwindow.ui create mode 100644 mineicon.ico create mode 100644 minesico.rc create mode 100644 minesweeperbutton.cpp create mode 100644 minesweeperbutton.h create mode 100644 my_minesweeper.pro create mode 100644 my_minesweeper.pro.user create mode 100644 my_minesweeper.pro.user.d697354 create mode 100644 photothumb.db create mode 100644 resource.qrc create mode 100644 window.cpp create mode 100644 window.h diff --git a/board.cpp b/board.cpp new file mode 100644 index 0000000..3cec279 --- /dev/null +++ b/board.cpp @@ -0,0 +1,108 @@ +#include "board.h" + +//Constructor that creates the board of the game for a size +Board::Board(int Nbombs, int rows, int cols){ + this->rows=rows; + this->cols=cols; + this->Nbombs=Nbombs; + + for(int j=0;j(cols)); + for(int k=0;k > board){ + rows = board.size(); + cols = board.at(0).size(); + this->gameBoard = board; + int sum = 0; + //Calculate how many bombs the board has + for(int i=0; i= 0) && (y < cols) && (y >= 0)); +} + +//Return the vector of the board +QVector< QVector > Board::getBoard(){ + return gameBoard; +} + +//Return the number of bombs of a position x,y +int Board::getNumberOfBombs(int x,int y){ + return gameBoard[x][y]; +} + +int Board::getNbombs() const{ + return Nbombs; +} + +//Return the board with data encrypted +QVector > Board::getEncryption(){ + QVector< QVector > encrypt(gameBoard.size(), QVector(gameBoard.at(0).size())); + for(int i=0; i > Board::getDecryption(QVector< QVector > board){ + QVector< QVector > decrypt(board.size(), QVector(board.at(0).size())); + for(int i=0; i + +#include +#include + +#define XOR_NUM 6 + +class Board{ + private: + QVector< QVector > gameBoard;//Vector for the board + int rows; //Number of Rows + int cols; //Number of columns + int Nbombs; //Number of Bombs + bool isInsideTheBoard(int, int); //True if coordinates are inside the board + public: + QVector< QVector > getBoard(); //Return the vector of the board + Board(int Nbombs, int rows, int cols); //First constructor + Board(QVector< QVector >); //Second constructor + int calculateNeighborsBombs(int x,int y); + int getNumberOfBombs(int x,int y); + int getNbombs() const; + QVector< QVector > getEncryption(); + QVector< QVector > getDecryption(QVector< QVector >); + +}; + +#endif // BOARD_H diff --git a/images/Activatedbomb.png b/images/Activatedbomb.png new file mode 100644 index 0000000000000000000000000000000000000000..f3f26b8263317d12ddcbb87411d4d55d497a9760 GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1SFYWcSQjymUKs7M+SzC{oH>NS%G}c0*}aI z1_r*vAk26?e?()C-X|HKXZ{`V_OrBhw^s+>cXZ_q7mKQvqy)G#u87-jsOmlZtNS%G}c0*}aI z1_r*vAk26?e?EuAZ1_d7Hi`9iye9L^@o@wx~?UNVJc^h;%)XQ`E zov)Qg4$UcEce&#j&&wEJCiBQrt1moUpO-WonWJ;=xWaSiZ?~2$-Lb*yXT;e!qh`Ke z=addy-69()y<%yk^`@q)H76%V{IU{nyS`+D!hy6M;giG!XUeQfEu6n_9!K5Z=dPdT d$e+~Qdnw%Gbkwp~51_LcJYD@<);T3K0RS$uS#JOU literal 0 HcmV?d00001 diff --git a/images/eight.png b/images/eight.png new file mode 100644 index 0000000000000000000000000000000000000000..9767bdf1ce9079a082f1a4e09019e4fc4f536207 GIT binary patch literal 259 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1SFYWcSQjy#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSL74G){)!Z!;0#X}#}EtuWSg2F2FyDfIK3vbx|vSq_>gIL zF_)Y5uKEI}6%5;-3Ey2hyW~@tjNP5L$2Y7LSzV?yckN;Y?o>tQJ(@f(-d*x_m|Lm6 ztli7`=mbW)^xMm_%ayZb944$rjF6*2UngDcg BS{(oY literal 0 HcmV?d00001 diff --git a/images/five.png b/images/five.png new file mode 100644 index 0000000000000000000000000000000000000000..100f77252c383867a348c7c93c4e0d5222273150 GIT binary patch literal 292 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1SFYWcSQjy#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSL74G){)!Z!;7(5$#}EtuWSg2F2FyDfIK3vbx|vSq_~0t~ zJjw6i<$!PfSKhxbS(sySAlX>>v@sjo<@obzwd_hha~&Gojg?;qx5=~BFSN;F*#0cs zM~8<;X0zqePZmq9A|n?r(f|rh@6qA;Z+E?>KJ4@J^TA>VZ6iV+U0cKbNS%G}c0*}aI z1_r*vAk26?e?M6 literal 0 HcmV?d00001 diff --git a/images/four.png b/images/four.png new file mode 100644 index 0000000000000000000000000000000000000000..00a6ea9d2700466d0f97951a23790551b4efcff1 GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1SFYWcSQjy#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSL74G){)!Z!V1uWNV~B-+vQ5no1LmC#oL-Yz-At1i<-dP9 zd;azAA6%zg8CgvB-`ZY(*;qqb_`%gbzaIVJZdw);Ag6X<@z2Nejy_*y9~v*lxGF7h dFlJ_E_*1X`@~`;KT%cPRJYD@<);T3K0RVj+RdE0S literal 0 HcmV?d00001 diff --git a/images/one.png b/images/one.png new file mode 100644 index 0000000000000000000000000000000000000000..1edbecf824a8961fae601e79bd64918f7c12cd95 GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1SFYWcSQjy#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSL74G){)!Z!pslBiV~B-+vV{+$#8n?9g(a1TJ30D|e-Hy`dyPRVR*n7BexAE;EwqDF!t$GK_7>5X|ZK!X@OUHx3v IIVCg!0G;D8ng9R* literal 0 HcmV?d00001 diff --git a/images/seven.png b/images/seven.png new file mode 100644 index 0000000000000000000000000000000000000000..c88f115743b75ca678a755850d7b3a6362df3bcd GIT binary patch literal 252 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1SFYWcSQjy#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSL74G){)!Z!;6zUs#}EtuWSg2F2FyDfIK3vbwyj8;!+1=0 zVx~qN>#4+qAK!|O?i9Ziz{exNm%Bler$5iH{tL4f6MM^?vm2vg|D4)B-E@XkV?#rl z;789Gp1OVm86L(Trt<|v8Gf0);+@jX_aRHnLg&nZ4}aOqvKtxZr{(ok^YGNIw|Ce% q1IY6$a|uagT`bw`Vh}J(Qi7qIU&Gd_xNQT_aSWcWelF{r5}E)pdQtoU literal 0 HcmV?d00001 diff --git a/images/six.png b/images/six.png new file mode 100644 index 0000000000000000000000000000000000000000..cd5da4fa36c9e952c7283ec49b26d646a0e46469 GIT binary patch literal 288 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1SFYWcSQjy#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSL74G){)!Z!;8sr;#}EtuWSg2F2FyDfIK3vbx-ClEv+(bS z4M+E}E3{2I%vl||L4fN(?&ssDfBlx*Q`%+waLIv!_YJR{R~Q%_SUL0cL1#a<*78q0 zJfF6y3nk|>OG+@TpU-N4>P&nNqYJydvugmO-`P3x_l) ap!vN=>{9M<%+LdRfWgz%&t;ucLK6VW`ev{I literal 0 HcmV?d00001 diff --git a/images/three.png b/images/three.png new file mode 100644 index 0000000000000000000000000000000000000000..3d4959887c2f7d1273e890d76be8719cb18e6c51 GIT binary patch literal 281 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1SFYWcSQjy#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSL74G){)!Z!;5tti#}EtuWSg2F2FyDfIK3vbx|uF!+9%l= zHBn*7rl+hS9HI}d)#UY^acn!k^z(bS)0=hYDt?pE>ftHKHuKuKt>#~{GKc%Kc9oV! zCXSy!@5nq|YUDp{c}>%&KnBIL4!?gdIjSU_dft(B0wa*Cp!sofW8+`RX$FT^&aCxr z4ohLym~(FK)6|3?nyQRb9hfSNj&W~X!lvI6;>1s;*b3=DjSL74G){)!Z!V5O&vV~B-+vV{+$#8n@q1IsHf@yRdkP1usG z7s4U>;M$(;GAnfR-akCdzI(0$50693=7Y25mgTk-O=L(sySiLeGuLO84aZX@W~W&P z`;KSn3Ou;VQ)aO40uz(XtmnrVOY>gF@jgvrv@mVn%hj#5iJ6BVXpN9XjRZsJhHBO| T*PFY5j$rU~^>bP0l+XkK4b@6d literal 0 HcmV?d00001 diff --git a/images/zero.png b/images/zero.png new file mode 100644 index 0000000000000000000000000000000000000000..672579b24f96138b0ee468f6ccc7202e61415388 GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1SFYWcSQjy#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSL74G){)!Z!psc5hV~B-+vV{+$#8n?9IIf( + +#include "window.h" +#include "board.h" + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + + myWindow window; + window.show(); + + return app.exec(); +} diff --git a/mainwindow.ui b/mainwindow.ui new file mode 100644 index 0000000..7de574d --- /dev/null +++ b/mainwindow.ui @@ -0,0 +1,24 @@ + + MainWindow + + + + 0 + 0 + 400 + 300 + + + + MainWindow + + + + + + + + + + + diff --git a/mineicon.ico b/mineicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..8a0bc378de28c6b6955d35597b1abe511666e78e GIT binary patch literal 262142 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 HrojIN6s<|8 literal 0 HcmV?d00001 diff --git a/minesico.rc b/minesico.rc new file mode 100644 index 0000000..2b1a7af --- /dev/null +++ b/minesico.rc @@ -0,0 +1 @@ +IDI_ICON1 ICON DISCARDABLE "mineicon.ico" diff --git a/minesweeperbutton.cpp b/minesweeperbutton.cpp new file mode 100644 index 0000000..2908a6c --- /dev/null +++ b/minesweeperbutton.cpp @@ -0,0 +1,44 @@ +#include "minesweeperbutton.h" +#include +#include + +//Detect Left click +MineSweeperButton::MineSweeperButton(QWidget *parent) : QPushButton(parent) +{ +} + +MineSweeperButton::MineSweeperButton(QString blah) : QPushButton(blah) +{ +} + +//Enables Right clicking +void MineSweeperButton::mousePressEvent(QMouseEvent *qMEvent) +{ + //If we right click + if ( qMEvent->button() == Qt::RightButton ) + { + emit rightButtonClicked(); //emit rightButtonSignal + } + + //Do default behavior otherwise + QPushButton::mousePressEvent(qMEvent); +} + +MineSweeperButton::MineSweeperButton(int row,int column,QWidget *parent) : QPushButton(parent){ + this->row = row; + this->column = column; + this->flaged = false; +} + +int MineSweeperButton::getRow() const{ + return row; +} +int MineSweeperButton::getColumn() const{ + return column; +} +bool MineSweeperButton::isFlaged() const{ + return flaged; +} +void MineSweeperButton::setFlaged(bool flag_state){ + this->flaged = flag_state; +} diff --git a/minesweeperbutton.h b/minesweeperbutton.h new file mode 100644 index 0000000..9e6fca8 --- /dev/null +++ b/minesweeperbutton.h @@ -0,0 +1,27 @@ +#ifndef MINESWEEPERBUTTON_H +#define MINESWEEPERBUTTON_H + +#include + +class MineSweeperButton : public QPushButton +{ + Q_OBJECT +public: + MineSweeperButton(QWidget* = 0); + MineSweeperButton(QString); + MineSweeperButton(int,int,QWidget* = 0); + int getRow() const; + int getColumn() const; + bool isFlaged() const; + void setFlaged(bool); + void setClicked(bool); +signals: + void rightButtonClicked(); +protected: + void mousePressEvent(QMouseEvent*); +private: + int row,column; + bool flaged,clicked; +}; + +#endif // MINESWEEPERBUTTON_H diff --git a/my_minesweeper.pro b/my_minesweeper.pro new file mode 100644 index 0000000..e9eb20f --- /dev/null +++ b/my_minesweeper.pro @@ -0,0 +1,24 @@ +#------------------------------------------------- +# +# Project created by QtCreator 2015-12-20T11:50:09 +# +#------------------------------------------------- + +QT += widgets +QT += designer +RC_FILE = minesico.rc + +HEADERS = window.h \ + minesweeperbutton.h \ + board.h +SOURCES = window.cpp \ + main.cpp \ + minesweeperbutton.cpp \ + board.cpp + +# install +target.path = $$[QT_INSTALL_EXAMPLES]/widgets/widgets/groupbox +INSTALLS += target + +RESOURCES += \ + resource.qrc diff --git a/my_minesweeper.pro.user b/my_minesweeper.pro.user new file mode 100644 index 0000000..5d7fb9b --- /dev/null +++ b/my_minesweeper.pro.user @@ -0,0 +1,318 @@ + + + + + + EnvironmentId + {7e31b7e0-3725-4f5a-a3b0-9d84553c1075} + + + ProjectExplorer.Project.ActiveTarget + 0 + + + ProjectExplorer.Project.EditorSettings + + true + false + true + + Cpp + + CppGlobal + + + + QmlJS + + QmlJSGlobal + + + 2 + UTF-8 + false + 4 + false + 80 + true + true + 1 + true + false + 0 + true + true + 0 + 8 + true + 1 + true + true + true + false + + + + ProjectExplorer.Project.PluginSettings + + + + ProjectExplorer.Project.Target.0 + + Desktop Qt 5.9.0 MinGW 32bit + Desktop Qt 5.9.0 MinGW 32bit + qt.59.win32_mingw53_kit + 0 + 0 + 0 + + E:/Workspace/QT/build-my_minesweeper-Desktop_Qt_5_9_0_MinGW_32bit-Debug + + + true + qmake + + QtProjectManager.QMakeBuildStep + true + + false + false + false + + + true + Make + + Qt4ProjectManager.MakeStep + + false + + + + 2 + Build + + ProjectExplorer.BuildSteps.Build + + + + true + Make + + Qt4ProjectManager.MakeStep + + true + clean + + + 1 + Clean + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Debug + + Qt4ProjectManager.Qt4BuildConfiguration + 2 + true + + + E:/Workspace/QT/build-my_minesweeper-Desktop_Qt_5_9_0_MinGW_32bit-Release + + + true + qmake + + QtProjectManager.QMakeBuildStep + false + + false + false + false + + + true + Make + + Qt4ProjectManager.MakeStep + + false + + + + 2 + Build + + ProjectExplorer.BuildSteps.Build + + + + true + Make + + Qt4ProjectManager.MakeStep + + true + clean + + + 1 + Clean + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Release + + Qt4ProjectManager.Qt4BuildConfiguration + 0 + true + + + E:/Workspace/QT/build-my_minesweeper-Desktop_Qt_5_9_0_MinGW_32bit-Profile + + + true + qmake + + QtProjectManager.QMakeBuildStep + true + + false + true + false + + + true + Make + + Qt4ProjectManager.MakeStep + + false + + + + 2 + Build + + ProjectExplorer.BuildSteps.Build + + + + true + Make + + Qt4ProjectManager.MakeStep + + true + clean + + + 1 + Clean + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Profile + + Qt4ProjectManager.Qt4BuildConfiguration + 0 + true + + 3 + + + 0 + Deploy + + ProjectExplorer.BuildSteps.Deploy + + 1 + Deploy locally + + ProjectExplorer.DefaultDeployConfiguration + + 1 + + + false + false + 1000 + + true + + false + false + false + false + true + 0.01 + 10 + true + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + my_minesweeper + + Qt4ProjectManager.Qt4RunConfiguration:E:/Workspace/QT/my_minesweeper/my_minesweeper.pro + true + + my_minesweeper.pro + false + + E:/Workspace/QT/build-my_minesweeper-Desktop_Qt_5_9_0_MinGW_32bit-Debug + 3768 + false + true + false + false + true + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 18 + + + Version + 18 + + diff --git a/my_minesweeper.pro.user.d697354 b/my_minesweeper.pro.user.d697354 new file mode 100644 index 0000000..e3c4b4a --- /dev/null +++ b/my_minesweeper.pro.user.d697354 @@ -0,0 +1,562 @@ + + + + + + EnvironmentId + {d6973540-b17c-4dc7-8548-3d1936c5664b} + + + ProjectExplorer.Project.ActiveTarget + 0 + + + ProjectExplorer.Project.EditorSettings + + true + false + true + + Cpp + + CppGlobal + + + + QmlJS + + QmlJSGlobal + + + 2 + UTF-8 + false + 4 + false + 80 + true + true + 1 + true + false + 0 + true + 0 + 8 + true + 1 + true + true + true + false + + + + ProjectExplorer.Project.PluginSettings + + + + ProjectExplorer.Project.Target.0 + + Desktop Qt 5.5.1 MinGW 32bit + Desktop Qt 5.5.1 MinGW 32bit + qt.55.win32_mingw492_kit + 1 + 0 + 0 + + E:/qtWorkspace/build-my_minesweeper-Desktop_Qt_5_5_1_MinGW_32bit-Debug + + + true + qmake + + QtProjectManager.QMakeBuildStep + true + + false + false + false + + + true + Make + + Qt4ProjectManager.MakeStep + + false + + + + 2 + Build + + ProjectExplorer.BuildSteps.Build + + + + true + Make + + Qt4ProjectManager.MakeStep + + true + clean + + + 1 + Clean + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Debug + + Qt4ProjectManager.Qt4BuildConfiguration + 2 + true + + + E:/qtWorkspace/build-my_minesweeper-Desktop_Qt_5_5_1_MinGW_32bit-Release + + + true + qmake + + QtProjectManager.QMakeBuildStep + false + + false + false + false + + + true + Make + + Qt4ProjectManager.MakeStep + + false + + + + 2 + Build + + ProjectExplorer.BuildSteps.Build + + + + true + Make + + Qt4ProjectManager.MakeStep + + true + clean + + + 1 + Clean + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Release + + Qt4ProjectManager.Qt4BuildConfiguration + 0 + true + + + E:/qtWorkspace/build-my_minesweeper-Desktop_Qt_5_5_1_MinGW_32bit-Profile + + + true + qmake + + QtProjectManager.QMakeBuildStep + true + + false + true + false + + + true + Make + + Qt4ProjectManager.MakeStep + + false + + + + 2 + Build + + ProjectExplorer.BuildSteps.Build + + + + true + Make + + Qt4ProjectManager.MakeStep + + true + clean + + + 1 + Clean + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Profile + + Qt4ProjectManager.Qt4BuildConfiguration + 0 + true + + 3 + + + 0 + Deploy + + ProjectExplorer.BuildSteps.Deploy + + 1 + Deploy locally + + ProjectExplorer.DefaultDeployConfiguration + + 1 + + + false + 1000 + + true + + false + false + false + false + true + 0.01 + 10 + true + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + my_minesweeper + my_minesweeper2 + Qt4ProjectManager.Qt4RunConfiguration:E:/qtWorkspace/my_minesweeper/my_minesweeper.pro + true + + my_minesweeper.pro + false + false + + 3768 + false + true + false + false + true + + 1 + + + + ProjectExplorer.Project.Target.1 + + MIngw + MIngw + {eec87427-6c04-4bfb-9263-80f771d5b719} + 0 + 0 + 0 + + E:/qtWorkspace/build-my_minesweeper-MIngw-Debug + + + true + qmake + + QtProjectManager.QMakeBuildStep + true + + false + false + false + + + true + Make + + Qt4ProjectManager.MakeStep + + false + + + + 2 + Build + + ProjectExplorer.BuildSteps.Build + + + + true + Make + + Qt4ProjectManager.MakeStep + + true + clean + + + 1 + Clean + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Debug + + Qt4ProjectManager.Qt4BuildConfiguration + 2 + true + + + E:/qtWorkspace/build-my_minesweeper-MIngw-Release + + + true + qmake + + QtProjectManager.QMakeBuildStep + false + + false + false + false + + + true + Make + + Qt4ProjectManager.MakeStep + + false + + + + 2 + Build + + ProjectExplorer.BuildSteps.Build + + + + true + Make + + Qt4ProjectManager.MakeStep + + true + clean + + + 1 + Clean + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Release + + Qt4ProjectManager.Qt4BuildConfiguration + 0 + true + + + E:/qtWorkspace/build-my_minesweeper-MIngw-Profile + + + true + qmake + + QtProjectManager.QMakeBuildStep + true + + false + true + false + + + true + Make + + Qt4ProjectManager.MakeStep + + false + + + + 2 + Build + + ProjectExplorer.BuildSteps.Build + + + + true + Make + + Qt4ProjectManager.MakeStep + + true + clean + + + 1 + Clean + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Profile + + Qt4ProjectManager.Qt4BuildConfiguration + 0 + true + + 3 + + + 0 + Deploy + + ProjectExplorer.BuildSteps.Deploy + + 1 + Deploy locally + + ProjectExplorer.DefaultDeployConfiguration + + 1 + + + false + 1000 + + true + + false + false + false + false + true + 0.01 + 10 + true + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + my_minesweeper + + Qt4ProjectManager.Qt4RunConfiguration:E:/qtWorkspace/sample/my_minesweeper.pro + true + + my_minesweeper.pro + false + false + + 3768 + false + true + false + false + true + + 1 + + + + ProjectExplorer.Project.TargetCount + 2 + + + ProjectExplorer.Project.Updater.FileVersion + 18 + + + Version + 18 + + diff --git a/photothumb.db b/photothumb.db new file mode 100644 index 0000000000000000000000000000000000000000..fa58b80dd03c2dfa2e9c292f897246c11e4d2d85 GIT binary patch literal 3072 zcmeH`v2MaJ5Qfij)T))3z1~=)E>-7BP~?q;mOXNaLoDJ1!XZdE9!4Am%0u|{0AZ~flK~oT52i|HuXz1`;gP6#O3sTF40?0d8MpI(kH@gW2|ag-01chY1L@u zTG3SGgsn4^x1GrM=IhTtnv9ChEwot|)Wzgp(y!eef^6}_`zu(mZ_>S;|Kp+sfjlkojEcE|vutHTJFfanY>D@+@ literal 0 HcmV?d00001 diff --git a/resource.qrc b/resource.qrc new file mode 100644 index 0000000..47d8f9a --- /dev/null +++ b/resource.qrc @@ -0,0 +1,16 @@ + + + images/zero.png + images/one.png + images/two.png + images/three.png + images/four.png + images/five.png + images/six.png + images/seven.png + images/eight.png + images/bomb.png + images/Activatedbomb.png + images/flag.png + + diff --git a/window.cpp b/window.cpp new file mode 100644 index 0000000..35ed86e --- /dev/null +++ b/window.cpp @@ -0,0 +1,760 @@ +#include "window.h" + +myWindow::myWindow(QWidget *parent) + : QMainWindow(parent){ + + createActions(); + createMenus(); + createToolbarAndBoard(); + createStatusBar(); + + newGame(0); + + /* + * centralWidget is a widget of type QWidget which will be the centralWidget of myWindow class. + */ + centralWidget = new QWidget(); //Allocate memory for the QWidget object centralWidget + setCentralWidget(centralWidget); //Set centralWidget to be the central widget of the class (myWindow) + centralWidget->setLayout(layout); //Set centralWidget's layout to layout + setWindowTitle("My Cool Minesweeper Game!![*]"); //Set window's title +} + +/* + * createPushButtonGrid takes two integer arguments and returns a QWidget + * createPushButtonGrid creates a vertical box that contains f_rows horizontal boxes + * Each horizontal box holds f_cols buttons. Then the vertical box is added to a widget + * and the widget is returned. + */ + +QWidget* myWindow::createPushButtonGrid(int pLevel, int f_cols, int f_rows){ + buttons.push_back(QVector >(f_rows)); + QWidget* toBeReturned = new QWidget(); //Allocate memory for the QWidget object toBeReturned + QVBoxLayout* buttonGrid = new QVBoxLayout(); //Allocate memory for the QVBoxLayout object buttonGrid + + for(int i=0; i()); + QHBoxLayout* hbox = new QHBoxLayout(); //Allocate memory for a QHBoxLayout object hbox + for(int j=0; j setFixedSize(SIZE_OF_BUTTON,SIZE_OF_BUTTON); //Set fixed (can't be changed later) size to SIZE_OF_BUTTON + connect(buttons[pLevel][i][j], SIGNAL(released()), this, SLOT(handleButtonReleased())); + connect(buttons[pLevel][i][j], SIGNAL(rightButtonClicked()), this, SLOT(handleRightButton())); + hbox -> addWidget(buttons[pLevel][i][j]); //Add button widget to hbox + } + hbox -> setSpacing(0); //Set spacing of hbox to 0 so buttons will be close to one another + buttonGrid->addLayout(hbox); //Add hbox layout to buttonGrid + } + buttonGrid -> setSpacing(0); //Set buttonGrid's spacing to 0 + toBeReturned->setLayout(buttonGrid); //Set buttonGrid to be the layout of toBeReturned widget + toBeReturned->setFixedSize(SIZE_OF_BUTTON*f_cols,SIZE_OF_BUTTON*f_rows); //Set fixed size of toBeReturned + + return toBeReturned; +} + +void myWindow::createToolbarAndBoard(){ + /* + * levelSelect is a layout of QHBoxLayout type, meaning it is a horizontal box that holds + * different widgets. levelSelect is used to hold the buttons for level selection. + */ + levelSelect = new QHBoxLayout(); //Allocate memory for the QHBoxLayout object levelSelect + + QPushButton *easy = new QPushButton(tr("&Easy")); //Create button easy + connect(easy, SIGNAL(clicked()), this, SLOT(handleEasy())); //Conect button with appropriate slot + easy->setStatusTip(tr("Start new game at easy level")); //Set status bar tip + + QPushButton *moderate = new QPushButton(tr("&Moderate")); //Create button moderate + connect(moderate, SIGNAL(clicked()), this, SLOT(handleModerate())); //Conect button with appropriate slot + moderate->setStatusTip(tr("Start new game at moderate level")); //Set status bar tip + + QPushButton *hard = new QPushButton(tr("&Hard")); //Create button hard + connect(hard, SIGNAL(clicked()), this, SLOT(handleHard())); //Conect button with appropriate slot + hard->setStatusTip(tr("Start new game at hard level")); //Set status bar tip + + levelSelect->addWidget(easy); //Add button easy to levelSelect Layout + levelSelect->addWidget(moderate); //Add button moderate to levelSelect Layout + levelSelect->addWidget(hard); //Add button hard to levelSelect Layout + + /* + * boardSelect is a widget of QStackedWidget type. It has 3 layers of widgets. At any time only one is vissible. + * Each widget in every level contains a button grid with the appropriate amount of buttons for each level. + */ + boardSelect = new QStackedWidget(); //Allocate memory for the QStackedWidget object boardSelect + boardSelect->addWidget(createPushButtonGrid(0,EASY_COLUMNS,EASY_ROWS)); //Add a widget with button grid for easy level + boardSelect->addWidget(createPushButtonGrid(1,MODERATE_COLUMNS,MODERATE_ROWS)); //Add a widget with button grid for moderate level + boardSelect->addWidget(createPushButtonGrid(2,HARD_COLUMNS,HARD_ROWS)); //Add a widget with button grid for hard level + boardSelect->setCurrentIndex(0); //Set stack index to 0, board for easy level will be shown + + /* + * Sxolia edw! + * + */ + timer= new QTimer(); + lcdNumber1 = new QLCDNumber; //show time + lcdNumber1->setDigitCount(4); + currentTime=0; + connect(timer, SIGNAL(timeout()), this, SLOT(updateTimer())); + + /* + * layout is a layout of type QVBoxLayout,meaning it is a vertical box that holds + * different widgets and child layouts. layout should contain every widget and layout + * the basic window has. + */ + layout = new QVBoxLayout; //Allocate memory for the QVBoxLayout object layout + layout->addLayout(levelSelect); //Add levelSelect as a child layout to layout + layout->addWidget(lcdNumber1); //Add clock widget to layout + layout->addWidget(boardSelect); //Add boardSelect widget to layout + layout->setSpacing(0); //Set layout's spacing to 0 +} + +/* + * createActions allocates memory for the actions of save,save as, open, exit, + * about and about qt. In this funtion these actions are created, given their + * properties and connected to their different signals + */ + +void myWindow::createActions(){ + + openAct = new QAction("&Open",this); + openAct->setShortcuts(QKeySequence::Open); + openAct->setStatusTip(tr("Open a saved game")); + connect(openAct, SIGNAL(triggered()), this, SLOT(open())); + + saveAct = new QAction("&Save",this); + saveAct->setShortcuts(QKeySequence::Save); + saveAct->setStatusTip(tr("Save progress")); + connect(saveAct, SIGNAL(triggered()), this, SLOT(save())); + + saveAsAct = new QAction(tr("Save &As..."), this); + saveAsAct->setShortcuts(QKeySequence::SaveAs); + saveAsAct->setStatusTip(tr("Save progress under a new name")); + connect(saveAsAct, SIGNAL(triggered()), this, SLOT(saveAs())); + + exitAct = new QAction(tr("E&xit"), this); + exitAct->setShortcuts(QKeySequence::Quit); + exitAct->setStatusTip(tr("Exit the application")); + connect(exitAct, SIGNAL(triggered()), qApp, SLOT(closeAllWindows())); + + aboutAct = new QAction(tr("&About"),this); + aboutAct->setStatusTip(tr("Show the application's About box")); + connect(aboutAct, SIGNAL(triggered()), this, SLOT(about())); + + aboutQtAct = new QAction(tr("About &Qt"),this); + aboutQtAct->setStatusTip(tr("Show the Qt library's About box")); + connect(aboutQtAct, SIGNAL(triggered()), qApp, SLOT(aboutQt())); +} + +/* + * createMenus allocates memory for the menus file,help and the submenu new + * In this funtion these menus are created, given their properties and + * defferent actions are added to them. Also the actions added to the new + * submenu are created here. + */ + +void myWindow::createMenus() +{ + fileMenu = menuBar()->addMenu(tr("&File")); + + newMenu = fileMenu->addMenu(tr("&New")); + + newEasy = new QAction("New &Easy Game (10X10)",newMenu); + newEasy->setStatusTip(tr("New easy game 10 bmbs")); + connect(newEasy, SIGNAL(triggered()), this, SLOT(handleEasy())); + + newModerate = new QAction("New &Moderate Game (12X15)",newMenu); + newModerate->setStatusTip(tr("New moderate game 40 bmbs")); + connect(newModerate, SIGNAL(triggered()), this, SLOT(handleModerate())); + + newHard = new QAction("New &Hard Game (15X20)",newMenu); + newHard->setStatusTip(tr("New hard game 70 bmbs")); + connect(newHard, SIGNAL(triggered()), this, SLOT(handleHard())); + + newMenu->addAction(newEasy); + newMenu->addAction(newModerate); + newMenu->addAction(newHard); + + fileMenu->addMenu(newMenu); + fileMenu->addAction(openAct); + fileMenu->addAction(saveAct); + fileMenu->addAction(saveAsAct); + fileMenu->addSeparator(); + fileMenu->addAction(exitAct); + + menuBar()->addSeparator(); + + helpMenu = menuBar()->addMenu(tr("&Help")); + helpMenu->addAction(aboutAct); + helpMenu->addAction(aboutQtAct); +} + +void myWindow::handleEasy(){ + //Button easy was pressed + if(maybeSave()){ + setWindowModified(false); + newGame(0); + } +} + +void myWindow::handleModerate(){ + //Button moderate was pressed + if(maybeSave()){ + setWindowModified(false); + newGame(1); + } +} + +void myWindow::handleHard(){ + //Button moderate was pressed + if(maybeSave()){ + setWindowModified(false); + newGame(2); + } +} + +void myWindow::newGame(int pLevel){ + level = pLevel; //Set level + switch(level){ + case 0: + //Set all buttons to initial state + for(int i=0; isetFlat(false); + buttons[level][i][j]->setFlaged(false); + buttons[level][i][j]->setIcon(QIcon()); + } + } + board = new Board(BOMBS_ON_EASY,EASY_ROWS,EASY_COLUMNS); //Create a new board + boardSelect->setCurrentIndex(level); //Set boardSelect's index to level (0) to show the board for easy + this->setFixedSize(250,320); //Set window's size + break; + case 1: + //Set all buttons to initial state + for(int i=0; isetFlat(false); + buttons[level][i][j]->setFlaged(false); + buttons[level][i][j]->setIcon(QIcon()); + } + } + board = new Board(BOMBS_ON_MODERATE,MODERATE_ROWS,MODERATE_COLUMNS); //Create a new board + boardSelect->setCurrentIndex(level); //Set boardSelect's index to level (1) to show the board for moderate + this->setFixedSize(330,350); //Set window's size + break; + case 2: + //Set all buttons to initial state + for(int i=0; isetFlat(false); + buttons[level][i][j]->setFlaged(false); + buttons[level][i][j]->setIcon(QIcon()); + } + } + board = new Board(BOMBS_ON_HARD,HARD_ROWS,HARD_COLUMNS); //Create a new board + boardSelect->setCurrentIndex(level); //Set boardSelect's index to level (2) to show the board for hard + this->setFixedSize(430,420); //Set window's size + break; + default: + // should never be reached + QMessageBox messageBox; + messageBox.critical(0,"Error","An error has occured at newGame function!"); + messageBox.setFixedSize(500,200); + throw(EXCEPTION_EXECUTE_FAULT); + } + gameEnded = false; + trueClickedCounter = 0; + trueFlagCounter = 0; + hasStarted=false; +} + +void myWindow::open(){ + //Action open was pressed + QString fileName = QFileDialog::getOpenFileName(this); //Ask user to select a file + if (!fileName.isEmpty()) { //User has selected a file + if (isUntitled && !isWindowModified()){ //No progress was made in current game + loadFile(fileName); //Load selected file + } else { //There is unsaved progress in current game + if(maybeSave()) //User wants to save? + loadFile(fileName); //Load selected file + } + } +} + +bool myWindow::save(){ + //Action save was pressed + if (isUntitled) { //There in no previously saved file of this game + return saveAs(); //Create a new file and save there + } + else if(gameEnded){ //Don't save and ended game! + QMessageBox messageBox; + messageBox.critical(0,"Game ended!", + "You can't save an ended game."); + messageBox.setFixedSize(500,200); + return true; + } + else { //This game has been saved before in a file + return saveFile(curFile); //Replace old file with new + } +} + +bool myWindow::saveAs(){ + //Action save as was pressed + if(gameEnded){ //Don't save and ended game! + QMessageBox messageBox; + messageBox.critical(0,"Game ended!", + "You can't save an ended game."); + messageBox.setFixedSize(500,200); + return true; + } + //Ask user for a name and directory of the save file + QString fileName = QFileDialog::getSaveFileName(this, tr("Save As"), + curFile); + if (fileName.isEmpty()) //No name and directory were givven + return false; + + return saveFile(fileName); //Save game +} + +void myWindow::about(){ + //Action about was pressed + QMessageBox::about(this, tr("About Minesweeper"), + tr("Write shit here!")); +} + +void myWindow::wasModified(){ + //Action about qt was pressed + setWindowModified(true); +} + +void myWindow::createStatusBar(){ //Initialize the status bar + statusBar()->showMessage(tr("Good luck!")); +} + +bool myWindow::maybeSave(){ + if (isWindowModified() && (!gameEnded) ){ //There has been progress on this game + QMessageBox::StandardButton ret; + //Ask user wether to save or not. + ret = QMessageBox::warning(this, tr("Minesweeper"), + tr("The document has been modified.\n" + "Do you want to save your changes?"), + QMessageBox::Save | QMessageBox::Discard + | QMessageBox::Cancel); + if (ret == QMessageBox::Save) //User wants to save + return save(); //Save + else if (ret == QMessageBox::Cancel) //User wants to discard + return false; + } + return true; +} + +void myWindow::loadFile(const QString &fileName){ //Load a saved game for directory fileName + QFile file(fileName); + if (!file.open(QFile::ReadOnly | QFile::Text)) { //Try to open file + //File could not be oppened + QMessageBox::warning(this, tr("Minesweeper"), + tr("Cannot read file %1:\n%2.") + .arg(fileName) + .arg(file.errorString())); + return; + } + + //File was successfully opened + QTextStream in(&file); //Initialize a text stream (same as string stream) + QString line = in.readLine(); //Read a line (first line) from the file + if(line == "Minesweeper game"){ //If the line is correct this is indeed a Minesweeper game file + int lLevel,lRows,lColumns; //Localy used variables + lLevel = (in.readLine().toInt()); //Second line is the level + switch (lLevel){ //Initialize rows and columns depending on the level + case(0): + lRows = EASY_ROWS; + lColumns = EASY_COLUMNS; + break; + case(1): + lRows = MODERATE_ROWS; + lColumns = MODERATE_COLUMNS; + break; + case(2): + lRows = HARD_ROWS; + lColumns = HARD_COLUMNS; + break; + default: + //Should never be reached + QMessageBox messageBox; + messageBox.critical(0,"Error","An error has occured while reading from the file!"); + messageBox.setFixedSize(500,200); + throw(EXCEPTION_READ_FAULT); + } + + //Declare a vector, will hold the encrypted file data + QVector< QVector > encrypted(lRows, QVector(lColumns)); + + int lRowCounter = 0; + //Until all neccessery data were readen or reached the end of the file + while( (lRowCounter < lRows) && (!in.atEnd()) ) { + QString line = in.readLine(); //Read next line + QStringList fields = line.split(","); //Split lines data in strings at every "," + + if(fields.size() < (lColumns-1)){ //Not enough data on this line + //Should never be reached + QMessageBox messageBox; + messageBox.critical(0,"Error", + "An error has occured while reading from the file!\n Either not enough data on the file or data of wrong format!"); + messageBox.setFixedSize(500,200); + throw(EXCEPTION_READ_FAULT); + } + for(int i=0; i > decrypted = board->getDecryption(encrypted); //Decrypt data + newGame(lLevel); //Start a new game + board = new Board(decrypted); //Create new board + lRowCounter = 0; //Restart counter + + /*Read and recreate previously done progress */ + + //Until all neccessery data were readen or reached the end of the file + while( (lRowCounter < lRows) && (!in.atEnd()) ) { + QString line = in.readLine(); //Read next line + QStringList fields = line.split(","); //Split lines data in strings at every "," + + if(fields.size() < (lColumns-1)){ //Not enough data on this line + //Should never be reached + QMessageBox messageBox; + messageBox.critical(0,"Error", + "An error has occured while reading from the file!\n Either not enough data on the file or data of wrong format!"); + messageBox.setFixedSize(500,200); + throw(EXCEPTION_READ_FAULT); + } + for(int i=0; iclick(); //Do it again + break; + case -1: + //Means button at (lRowCounter,i) has been right-clicked before saving + buttons[lLevel][lRowCounter][i]->rightButtonClicked(); //Do it again + break; + default: + //Should never be reached + QMessageBox messageBox; + messageBox.critical(0,"Error", + "An error has occured while reading from the file!\n Bad data!"); + messageBox.setFixedSize(500,200); + throw(EXCEPTION_READ_FAULT); + } + } + ++lRowCounter; + } + + /* Data reading is done, am I at the end of the file? */ + if(!in.atEnd()){ + //Should never be reached + QMessageBox messageBox; + messageBox.critical(0,"Warning", + "There are more data at the end of the file!"); + messageBox.setFixedSize(500,200); + } + file.close(); //Close file + + setCurrentFile(fileName); + statusBar()->showMessage(tr("File loaded"), 2000); + setWindowModified(false); //No changes done since loading the file + return; + } + else{ //This is propably not a Minesweeper game file, first line was not Minesweeper game + // should never be reached + QMessageBox messageBox; + messageBox.critical(0,"Error", + "An error has occured while loading the file!\nThis is not a Minesweeper game file!"); + messageBox.setFixedSize(500,200); + throw(EXCEPTION_INVALID_HANDLE); + } +} + +bool myWindow::saveFile(const QString &fileName){ //Save game at fileName directory + QFile file(fileName); + if (!file.open(QFile::WriteOnly | QFile::Text)) { //Try to create an empty file + //File could not be created + QMessageBox::warning(this, tr("Minesweeper"), + tr("Cannot write file %1:\n%2.") + .arg(fileName) + .arg(file.errorString())); + return false; + } + + //File was successfully created + QTextStream out(&file); //Initialize a text stream (same as string stream) + //Declare a vector and put the encrypted file data there + QVector< QVector > encrypted = board->getEncryption(); + out << "Minesweeper game" << endl; //First line is this to distinguish Minesweeper files + out << level << endl; //Second line is the level + /* + * Next line are the encrypted data in this format: + * b(0,0),b(1,0), ... ,b(columns-1,0) + * b(1,1), ... ,b(columns-1,1) + * . . + * . . + * . . + * b(rows-1,0), ... ,b(rows-1,columns-1) + */ + for(int i=0; iisFlat()){ + out << 1; + } + else if(buttons[level][i][j]->isFlaged()){ + out << -1; + } + else + out << 0; + if(j != (encrypted.at(i).size()-1)) //Make sure we don't put semicolon at the end of the row + out << "," ; + } + out << endl; + } + file.close(); //Close file + setCurrentFile(fileName); + statusBar()->showMessage(tr("File saved"), 2000); + setWindowModified(false); + return true; +} + +void myWindow::setCurrentFile(const QString &fileName){ + static int sequenceNumber = 1; + + isUntitled = fileName.isEmpty(); + if (isUntitled) { + curFile = tr("document%1.txt").arg(sequenceNumber++); + } else { + curFile = QFileInfo(fileName).canonicalFilePath(); + } + + setWindowModified(false); + setWindowFilePath(curFile); +} + +void myWindow::handleButtonReleased(){ + //A button has been left-clicked + MineSweeperButton* sendedBy = (MineSweeperButton *) sender(); //Get the button + if(!hasStarted){ + timer->start(1000); + hasStarted=true; + } + if(sendedBy->isFlaged() || sendedBy->isFlat()) //If the button is flaged do nothing + return; + setWindowModified(true); //Else there has been progress since last save + switch(board->getNumberOfBombs(sendedBy->getRow(),sendedBy->getColumn())){ + case 0: //If the button has no neighboring bombs + { + //Set the button's icon and size for 0 + QPixmap pixmap(":/images/zero.png"); + QIcon ButtonIcon(pixmap); + sendedBy->setIcon(ButtonIcon); + sendedBy->setIconSize(pixmap.rect().size()); + ++trueClickedCounter; + } + break; + case 1: //If the button has one neighboring bomb + { + //Set the button's icon and size for 1 + QPixmap pixmap(":/images/one.png"); + QIcon ButtonIcon(pixmap); + sendedBy->setIcon(ButtonIcon); + sendedBy->setIconSize(pixmap.rect().size()); + ++trueClickedCounter; + } + break; + case 2: //If the button has two neighboring bombs + { + //Set the button's icon and size for 2 + QPixmap pixmap(":/images/two.png"); + QIcon ButtonIcon(pixmap); + sendedBy->setIcon(ButtonIcon); + sendedBy->setIconSize(pixmap.rect().size()); + ++trueClickedCounter; + } + break; + case 3: //If the button has three neighboring bombs + { + //Set the button's icon and size for 3 + QPixmap pixmap(":/images/three.png"); + QIcon ButtonIcon(pixmap); + sendedBy->setIcon(ButtonIcon); + sendedBy->setIconSize(pixmap.rect().size()); + ++trueClickedCounter; + } + break; + case 4: //If the button has four neighboring bombs + { + //Set the button's icon and size for 4 + QPixmap pixmap(":/images/four.png"); + QIcon ButtonIcon(pixmap); + sendedBy->setIcon(ButtonIcon); + sendedBy->setIconSize(pixmap.rect().size()); + ++trueClickedCounter; + } + break; + case 5: //If the button has five neighboring bombs + { + //Set the button's icon and size for 5 + QPixmap pixmap(":/images/five.png"); + QIcon ButtonIcon(pixmap); + sendedBy->setIcon(ButtonIcon); + sendedBy->setIconSize(pixmap.rect().size()); + ++trueClickedCounter; + } + break; + case 6://If the button has six neighboring bombs + { + //Set the button's icon and size for 6 + QPixmap pixmap(":/images/six.png"); + QIcon ButtonIcon(pixmap); + sendedBy->setIcon(ButtonIcon); + sendedBy->setIconSize(pixmap.rect().size()); + ++trueClickedCounter; + } + break; + case 7: //If the button has seven neighboring bombs + { + //Set the button's icon and size for 7 + QPixmap pixmap(":/images/seven.png"); + QIcon ButtonIcon(pixmap); + sendedBy->setIcon(ButtonIcon); + sendedBy->setIconSize(pixmap.rect().size()); + ++trueClickedCounter; + } + break; + case 8: //If the button has eight neighboring bombs + { + //Set the button's icon and size for 8 + QPixmap pixmap(":/images/eight.png"); + QIcon ButtonIcon(pixmap); + sendedBy->setIcon(ButtonIcon); + sendedBy->setIconSize(pixmap.rect().size()); + ++trueClickedCounter; + } + break; + case -1: //If the button has a bomb + { + if(!gameEnded){ + //Set the button's icon and size for activated bomb + QPixmap pixmap(":/images/Activatedbomb.png"); + QIcon ButtonIcon(pixmap); + sendedBy->setIcon(ButtonIcon); + sendedBy->setIconSize(pixmap.rect().size()); + sendedBy->setFlat(true); + //Player lost! + lose(); + } + else{ + //Set the button's icon and size for bomb + QPixmap pixmap(":/images/bomb.png"); + QIcon ButtonIcon(pixmap); + sendedBy->setIcon(ButtonIcon); + sendedBy->setIconSize(pixmap.rect().size()); + } + } + break; + default: + // should never be reached + QMessageBox messageBox; + messageBox.critical(0,"Error", + "Something went wrong in handelButtonReleased slot!"); + messageBox.setFixedSize(500,200); + throw(EXCEPTION_INVALID_HANDLE); + } + sendedBy->setFlat(true); //Set button to flat so we know it's been left-clicked + if(trueClickedCounter == (buttons.at(level).size() * buttons.at(level).at(0).size() - board->getNbombs()) ){ + if(!gameEnded) + win(); + } +} + +void myWindow::handleRightButton(){ + //A button has been right-clicked + MineSweeperButton* sendedBy = (MineSweeperButton *) sender(); //Get the button + if(sendedBy->isFlat()) //If the button is flat (has been left-clicked) do nothing + return; + setWindowModified(true); //Else there has been progress since last save + if(!(sendedBy->isFlaged())){ //If the button is not already flagged + //Set the button's icon and size to flag + sendedBy->setFlaged(true); + QPixmap pixmap(":/images/flag.png"); + QIcon ButtonIcon(pixmap); + sendedBy->setIcon(ButtonIcon); + sendedBy->setIconSize(pixmap.rect().size()); + if(board->getNumberOfBombs(sendedBy->getRow(),sendedBy->getColumn()) == -1){ + ++trueFlagCounter; + } + else + --trueFlagCounter; + } + else{ //The button is already flagged + //Un-do the "flagging" + sendedBy->setFlaged(false); + sendedBy->setIcon(QIcon()); + if(board->getNumberOfBombs(sendedBy->getRow(),sendedBy->getColumn()) == -1){ + --trueFlagCounter; + } + else + ++trueFlagCounter; + } + if(trueFlagCounter == board->getNbombs()){ + if(!gameEnded) + win(); + } +} + +void myWindow::lose(){ + //Player lost + gameEnded = true; + revealAll(); + QMessageBox messageBox; + messageBox.critical(0,"You lost!", + "Better luck next time... :)"); + messageBox.setFixedSize(500,200); +} + +void myWindow::win(){ + //Player won + gameEnded = true; + revealAll(); + QMessageBox messageBox; + messageBox.critical(0,"You won!", + "Great job! :)"); + messageBox.setFixedSize(500,200); +} +void myWindow::updateTimer(){ + currentTime++; + lcdNumber1->display(currentTime); +} + +void myWindow::revealAll() const{ + for(int i=0; iisFlat()) ) + buttons[level][i][j]->click(); + } + } +} diff --git a/window.h b/window.h new file mode 100644 index 0000000..ae04e39 --- /dev/null +++ b/window.h @@ -0,0 +1,98 @@ +#ifndef WINDOW_H +#define WINDOW_H + +#include +#include +#include +#include +#include "board.h" +#include "minesweeperbutton.h" + +#define SIZE_OF_BUTTON 20 +#define EASY_COLUMNS 10 +#define EASY_ROWS 10 +#define MODERATE_COLUMNS 15 +#define MODERATE_ROWS 12 +#define HARD_COLUMNS 20 +#define HARD_ROWS 15 +#define BOMBS_ON_EASY 10 +#define BOMBS_ON_MODERATE 30 +#define BOMBS_ON_HARD 70 + +class QHBoxLayout; +class QVBoxLayout; + +namespace Ui { + class myWindow; +} + +class myWindow : public QMainWindow +{ + Q_OBJECT + +public: + myWindow(QWidget *parent = 0); +private slots: + void updateTimer(); + void handleEasy(); //For easy button-press + void handleModerate(); //For moderate button-press + void handleHard(); //For hard button-press + void handleButtonReleased(); + void handleRightButton(); + //Slots for menu actions + void open(); + bool save(); + bool saveAs(); + void about(); + void wasModified(); +private: + Board* board; //A pointer to Board objects, holds actual board + int level; //Current game level + int currentTime; + int trueFlagCounter, trueClickedCounter; + bool isUntitled,gameEnded; + bool hasStarted; + QString curFile; //Current file's name + QTimer *timer; + QLCDNumber *lcdNumber1; + QWidget* centralWidget; //Holds basic window layout + QVBoxLayout* layout; //Window layout + QHBoxLayout* levelSelect; //Holds buttons easy,moderate,hard + QHBoxLayout* counters; + QStackedWidget* boardSelect; //Has boards for all levels stacked + QVector< QVector< QVector > > buttons; //Has pointers to all buttons + + //The two basic menus + QMenu *fileMenu; + QMenu *helpMenu; + + //Menu actions and submenus + QMenu *newMenu; //New is a submenu of File menu + QAction *newEasy; + QAction *newModerate; + QAction *newHard; + QAction *openAct; + QAction *saveAct; + QAction *saveAsAct; + QAction *exitAct; + QAction *aboutAct; + QAction *aboutQtAct; + + QWidget *createPushButtonGrid(int pLevel, int f_cols, int f_rows); //Function that creates a button grid of size cols*rows + + void newGame(int); + void createActions(); + void createMenus(); + void createStatusBar(); + void createToolbarAndBoard(); + bool maybeSave(); + void loadFile(const QString &fileName); + bool saveFile(const QString &fileName); + void setCurrentFile(const QString &fileName); + + void lose(); + void revealAll() const; + void win(); +}; + +#endif