From 966d661e9382236cc7def23e13f7b8bed9c9e645 Mon Sep 17 00:00:00 2001 From: Xizhi Zhu Date: Fri, 27 Nov 2009 15:36:50 +0200 Subject: [PATCH] first commit --- src/flip.pro | 12 +++++ src/flipscene.cpp | 145 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/flipscene.h | 28 ++++++++++ src/imgs/black.png | Bin 0 -> 1550 bytes src/imgs/white.png | Bin 0 -> 1446 bytes src/main.cpp | 12 +++++ src/mainwidget.cpp | 79 ++++++++++++++++++++++++++++ src/mainwidget.h | 23 +++++++++ src/resources.qrc | 6 +++ 9 files changed, 305 insertions(+) create mode 100644 src/flip.pro create mode 100644 src/flipscene.cpp create mode 100644 src/flipscene.h create mode 100644 src/imgs/black.png create mode 100644 src/imgs/white.png create mode 100644 src/main.cpp create mode 100644 src/mainwidget.cpp create mode 100644 src/mainwidget.h create mode 100644 src/resources.qrc diff --git a/src/flip.pro b/src/flip.pro new file mode 100644 index 0000000..9f83a62 --- /dev/null +++ b/src/flip.pro @@ -0,0 +1,12 @@ +# ------------------------------------------------- +# Project created by QtCreator 2009-11-25T20:20:37 +# ------------------------------------------------- +TARGET = flip +TEMPLATE = app +SOURCES += main.cpp \ + flipscene.cpp \ + mainwidget.cpp +HEADERS += flipscene.h \ + mainwidget.h +RESOURCES += resources.qrc +FORMS += diff --git a/src/flipscene.cpp b/src/flipscene.cpp new file mode 100644 index 0000000..186e12f --- /dev/null +++ b/src/flipscene.cpp @@ -0,0 +1,145 @@ +#include +#include +#include +#include "flipscene.h" + +struct Chess +{ + QGraphicsPixmapItem *item_; + bool isWhite_; +}; + +class FlipScenePrivate +{ +public: + static const int MAX_COLUMNS = 9; + static const int MAX_ROWS = 9; + static const int MIN_COLUMNS = 2; + static const int MIN_ROWS = 2; + static const int LATTICE_SIZE = 40; + static const int GRID_WIDTH = 2; + static const int CHESS_SIZE = 30; + static const QColor BACKGROUND_COLOR; + static const QColor LATTICE_COLOR; + + Chess board_[MAX_COLUMNS][MAX_ROWS]; + int column_; + int row_; + int clicks_; +}; + +const QColor FlipScenePrivate::BACKGROUND_COLOR = QColor(255, 241, 189); +const QColor FlipScenePrivate::LATTICE_COLOR = QColor(138, 48, 5); + +FlipScene::FlipScene(QObject *parent) : + QGraphicsScene(parent), + d_(new FlipScenePrivate) +{ + // do nothing +} + +FlipScene::~FlipScene() +{ + delete d_; +} + +void FlipScene::setBoard(int column, int row) +{ + clear(); + + d_->column_ = column; + d_->row_ = row; + d_->clicks_ = 0; + + int width = FlipScenePrivate::LATTICE_SIZE * d_->column_; + int height = FlipScenePrivate::LATTICE_SIZE * d_->row_; + + // draw the background + addRect(0, 0, width, height, QPen(d_->BACKGROUND_COLOR), QBrush(d_->BACKGROUND_COLOR)); + setSceneRect(0, 0, width, height); + + // draw the lattice grids + QPen pen(FlipScenePrivate::LATTICE_COLOR); + pen.setWidth(FlipScenePrivate::GRID_WIDTH); + int temp = 0; + for (int i = 0; i <= d_->column_; i++) { + addLine(temp, 0, temp, height, pen); + temp += FlipScenePrivate::LATTICE_SIZE; + } + temp = 0; + for (int i = 0; i <= d_->row_; i++) { + addLine(0, temp, width, temp, pen); + temp += FlipScenePrivate::LATTICE_SIZE; + } + + // add the chessmen + QGraphicsPixmapItem *p = NULL; + QPixmap pixmap(":/imgs/white.png"); + int x = (FlipScenePrivate::LATTICE_SIZE - FlipScenePrivate::CHESS_SIZE) >> 1; + int y = 0; + Chess chess; + for (int i = 0; i < d_->column_; i++) { + y = (FlipScenePrivate::LATTICE_SIZE - FlipScenePrivate::CHESS_SIZE) >> 1; + for (int j = 0; j < d_->row_; j++) + { + p = addPixmap(pixmap); + p->moveBy(x, y); + chess.isWhite_ = true; + chess.item_ = p; + d_->board_[i][j] = chess; + y += FlipScenePrivate::LATTICE_SIZE; + } + x += FlipScenePrivate::LATTICE_SIZE; + } +} + +void FlipScene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent) +{ + QGraphicsPixmapItem *item = reinterpret_cast(itemAt(mouseEvent->lastScenePos())); + for (int i = 0; i < d_->column_; i++) { + for (int j = 0; j < d_->row_; j++) { + if (item == d_->board_[i][j].item_) { + d_->clicks_++; + + QPixmap black(":/imgs/black.png"); + QPixmap white(":/imgs/white.png"); + + // flip + d_->board_[i][j].isWhite_ = !d_->board_[i][j].isWhite_; + d_->board_[i][j].item_->setPixmap((d_->board_[i][j].isWhite_) ? (white) : (black)); + + if (i > 0) { + d_->board_[i - 1][j].isWhite_ = !d_->board_[i - 1][j].isWhite_; + d_->board_[i - 1][j].item_->setPixmap((d_->board_[i - 1][j].isWhite_) ? (white) : (black)); + } + + if (i < d_->column_ - 1) { + d_->board_[i + 1][j].isWhite_ = !d_->board_[i + 1][j].isWhite_; + d_->board_[i + 1][j].item_->setPixmap((d_->board_[i + 1][j].isWhite_) ? (white) : (black)); + } + + if (j > 0) { + d_->board_[i][j - 1].isWhite_ = !d_->board_[i][j - 1].isWhite_; + d_->board_[i][j - 1].item_->setPixmap((d_->board_[i][j - 1].isWhite_) ? (white) : (black)); + } + + if (j < d_->row_ - 1) { + d_->board_[i][j + 1].isWhite_ = !d_->board_[i][j + 1].isWhite_; + d_->board_[i][j + 1].item_->setPixmap((d_->board_[i][j + 1].isWhite_) ? (white) : (black)); + } + + // check if all turned to black + for (int i2 = 0; i2 < d_->column_; i2++) { + for (int j2 = 0; j2 < d_->row_; j2++) { + if (d_->board_[i2][j2].isWhite_) + return; + } + } + emit win(d_->clicks_); + return; + } + } + } + + QGraphicsScene::mousePressEvent(mouseEvent); +} diff --git a/src/flipscene.h b/src/flipscene.h new file mode 100644 index 0000000..8e345b5 --- /dev/null +++ b/src/flipscene.h @@ -0,0 +1,28 @@ +#ifndef FLIPSCENE_H +#define FLIPSCENE_H + +#include + +class FlipScenePrivate; + +class FlipScene : public QGraphicsScene +{ + Q_OBJECT + +public: + FlipScene(QObject *parent = 0); + ~FlipScene(); + + void setBoard(int column, int row); + +protected: + virtual void mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent); + +signals: + void win(int clicks); + +private: + FlipScenePrivate *d_; +}; + +#endif // FLIPSCENE_H diff --git a/src/imgs/black.png b/src/imgs/black.png new file mode 100644 index 0000000000000000000000000000000000000000..046521fd57bd8da0be4270b556895db0188c7cb3 GIT binary patch literal 1550 zcmV+p2J!icP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iXf6 z2s0#i>ap|y00oXoL_t(Y$CX!WY*a-Q{$}p&-MhQ(_Q9)2F@4b$S}LW`T4JIQFe)UJ zR+3U%L4w9;Fd$I~N<<|Zi9d*mK_Y}mNzo9B778MvyrcmYYN08#<+Y(awzk`C3(M}_ z$M}QH#mRBvHja+VpddC z#0m=w+4Sj!EIWG=OH54C=gux-m;S6hSiAFc8vyLD-5gUtd6H)*k8Ew<@WqZCNlt<+ z%OHe6(=_P19wC~hfiVVERS^gTAjL7Pe0xzx^;;X=eO*V9oHlRdhF88*aq+jtmfYzD z`7{^|Lf3UL#-bY6G!3e%8ht_tuHW$J#f3T7>l;o?il(2M2TNan6^t=bQk);`@`m%C z&CjKQKmY(B2m(Y=1f>+BC`ODar4R%Ggb>5AvLX6eO&hc<_< z>rhn{gb)K6fAT&TN+}2-26Eo#&H_Ln2>G=|b6WtQxoP)f!?D6fkP2cPZjv4zjy1Tn0P;sM_ zQX}+cLh%su@LGk>3xa?+LBofuD&-~1J_%6(a60Y#BwHc|2M3MtL=eI9&OGKwhii(W zz&{Yggz;nc8Hi`UFq5TcPQ|@@cOyc|k&2>dAT=W%4y_rnq9_mq0prFvaq{$eLT|R! zm3eytEEEbFtOWpF*CQCr$9&E_&l_Vbg84&ArLN=LUu~?b<6xQK>+5$5afubWt{KVC zLuhVXskv}4#*AWOE-L2t);URvBR4%=KhdL&=a7++4n==mf%L$ZKJqz#gtM5t=S3gT(teS z63J|wuL}l)c)nyB=(;saX=mqEmXMGTK_Dxc%!S|Dw;DC?x!Ea6lHm9Evo$NLC;@q=~HmItu1EV<>;+MH9X_AWIMkz&%$gpt*ll$_ zDJcoEMDQ>eERVPdG&k*PU-ABT*{S13Q?J)+5X{;}YS=9C@$vBa`t@z!esHzCa;-b! zB2X~v4fl*`6I-3mc;;|8qK4K?s91YxH7-dKWZ90wX<1jwE7!Uk4}Ty1>Qg*(Y9J#k z*Y5Rt(c9Y_6|FU`tTmgHO_pW2TrLds_u|@>`sM!azMaVv=R`Nm7$en{^9Owc)WLL( zcs!mV#lu`gVugFus8OJlGJ%GJKmWMNJt@EZR?J%_04%Foz;^FB6hApTxwWJ7hMtp? z1EYLr-s?J~~CdbfNjO!)kQc3w_hE?d|J7`yoe?6JfK- z=;`?ve!qXni9`s2!{LC-Kz2Z~%|NfI`ZmL1StZE$Izs2Ts+V`#B zxNZLJyMAP5W)TgQ%d*Nd{xRAOTh@+e|VsX2k+~gKmY&$07*qoM6N<$g1_C} A=l}o! literal 0 HcmV?d00001 diff --git a/src/imgs/white.png b/src/imgs/white.png new file mode 100644 index 0000000000000000000000000000000000000000..9685d2854ebe503e72c7221e0586d0b15267eb43 GIT binary patch literal 1446 zcmV;X1zGxuP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iXf6 z2s1GnH&q`100kyVL_t(Y$CX!WY!p=#{_dTjyX~%&@+!1j`hd0|ltN*lZ7`(qf!ain z{vb_^k%$NeG$#HuBpMTcn266H8vdZsR-RGHtAvLb5Gy1s3+%Qmg|aN6DJ|P}q1)ZL z#~;h=&fcBTc9N5GXYSnlopbIv-<)9>$3^0j>-4G9Zm-`*aZLjlgU~cASy07Ru6(A0 zsqWxd_hMEP!N5VdX0JiFf3I!Y&jWc)CLBoR^;8jOo*gkZsRq zi~*c8aLzLXAgHQ}yh-_3TC)bd;mLDae*M%lrcnRV`XQRveS#f7d@$U&YHN<&p3PDl z1B@kJPk5N}R@1Z$oe)8Pp8tuhey+Z7&yn`f*3Dm9hq|S8+i-2|8;+c8Clo~iV+ju# zV_=LWL#zYqVDWfd0!>IPHj1<7cSp8t`rMfj>b~Gn0Knn4&n_>nY0k;EJCb0EqCim; zsH&Q#^?6y#q9`hAmp13Lw0`VKB<*i0;Hj<`;q&a?XmeC7oaoGD`XW8dI*_i7Vg_au z0GKc#i>bD<`JLVtziaj@Dd2AZUYqaM(9ZdDYl$%{%at^-0?~EyET7DkmsazRD?Jq# zFYK}xec|izaK(q04PZiLWnf0Ip-Oh7!8$;{x4%x)rQ^&eNc(; z1c*#CRR=N7$>%Rqs2RAfL6qS2g8Y2MVxv%1HO*7wdFy0imFdQew>mO?{OIuz3TMm& zpEsu*!BAJmBI9}LTr8ipk)OvJ@`3Pu6c@O_pRHTL1GhY6v|3IgD={-rHbRd`!T>_> zo}U`(R&YMG=;i%c$}p3y*FDlj_EfHG*#NV%7eYgheT2DYuinoAprOv)HW2PL^+?`W zp4W}A3b|1Rhx$-ov$!ounFHa6O?QHqz!)bP#OSrrdl}H|du$9f!0<2}Kr|L@N^1ms zSAN=fH9$MdiWj7PU#-aBSkK0~mT6YcozVT;VqU3sW08A(WvUUldkk}{Ui)4_$TJch zA*(DlX1Lsan6*E;1~`pI1D-|h^_5-M_L#Rm-+cG}@ZyC{4qKMp^7AK?zg#-Taa@bT zcjGwTd23rCV~&t%m-+RMcd=#Dc4yC>_DFbefaEOxzjDeL3qjXA4@H_@SeXWz0land zS7>S7hURr2IirugUa#+h0Jv$A$z^3UjtIEl*CXzR&Um+M+V0$Y^jK(I4gF2uKK~zo zU$2;vUk!&N4+>Y3&3tCK0V09NBSRP%>_U0b#7=kJhOsyFsb84iQ8u@!a(Q*By<*mA z+tup_aQW&9ibTR70SJ*`B7h+h8N{{Dv-Hp9Rus>Sv`xz;ySr{frRU<02&kiiWxstY+Dp2gbVBzj$D|56c|ziU0rr07*qoM6N<$f-M`h A761SM literal 0 HcmV?d00001 diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..52f86ee --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,12 @@ +#include +#include "mainwidget.h" + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + + MainWidget widget; + widget.show(); + + return app.exec(); +} diff --git a/src/mainwidget.cpp b/src/mainwidget.cpp new file mode 100644 index 0000000..7c6b5f0 --- /dev/null +++ b/src/mainwidget.cpp @@ -0,0 +1,79 @@ +#include +#include +#include +#include +#include +#include +#include +#include "flipscene.h" +#include "mainwidget.h" + +class MainWidgetPrivate +{ +public: + MainWidgetPrivate(MainWidget *widget) : widget_(widget) + { + setupUi(); + } + + FlipScene *scene_; + MainWidget *widget_; + QGraphicsView *graphicsView_; + QLineEdit *columnEdit_; + QLineEdit *rowEdit_; + QPushButton *startButton_; + +private: + void setupUi() + { + widget_->setWindowTitle(QObject::tr("Flip")); + + QHBoxLayout *layout = new QHBoxLayout(widget_); + layout->setAlignment(Qt::AlignCenter); + + QVBoxLayout *leftLayout = new QVBoxLayout; + layout->addLayout(leftLayout); + leftLayout->addWidget(new QLabel(QObject::tr("Columns (2-9):"))); + columnEdit_ = new QLineEdit; + columnEdit_->setInputMask("D"); + leftLayout->addWidget(columnEdit_); + leftLayout->addWidget(new QLabel(QObject::tr("Rows (2-9):"))); + rowEdit_ = new QLineEdit; + rowEdit_->setInputMask("D"); + leftLayout->addWidget(rowEdit_); + startButton_ = new QPushButton(QObject::tr("Start")); + leftLayout->addWidget(startButton_); + + scene_ = new FlipScene(widget_); + graphicsView_ = new QGraphicsView(scene_); + layout->addWidget(graphicsView_); + } +}; + +MainWidget::MainWidget(QWidget *parent) : + QWidget(parent), + d_(new MainWidgetPrivate(this)) +{ + connect(d_->startButton_, SIGNAL(clicked()), this, SLOT(startGame())); + connect(d_->scene_, SIGNAL(win(int)), this, SLOT(winGame(int))); + + d_->columnEdit_->setText("5"); + d_->rowEdit_->setText("5"); + startGame(); +} + +MainWidget::~MainWidget() +{ + delete d_; +} + +void MainWidget::startGame() +{ + d_->scene_->setBoard(d_->columnEdit_->text().toInt(), d_->rowEdit_->text().toInt()); +} + +void MainWidget::winGame(int clicks) +{ + QMessageBox::information(NULL, tr("You Win!"), + tr(QString().sprintf("Congratulations! You made it with only %d clicks!", clicks).toLocal8Bit().data())); +} diff --git a/src/mainwidget.h b/src/mainwidget.h new file mode 100644 index 0000000..66cd51c --- /dev/null +++ b/src/mainwidget.h @@ -0,0 +1,23 @@ +#ifndef MAINWIDGET_H +#define MAINWIDGET_H + +#include + +class MainWidgetPrivate; + +class MainWidget : public QWidget { + Q_OBJECT + +public: + MainWidget(QWidget *parent = 0); + ~MainWidget(); + +private slots: + void startGame(); + void winGame(int clicks); + +private: + MainWidgetPrivate *d_; +}; + +#endif // MAINWIDGET_H diff --git a/src/resources.qrc b/src/resources.qrc new file mode 100644 index 0000000..9953f79 --- /dev/null +++ b/src/resources.qrc @@ -0,0 +1,6 @@ + + + imgs/black.png + imgs/white.png + + -- 1.7.9.5