summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/games/fifteen/fifteen.cpp83
-rw-r--r--noncore/games/fifteen/fifteen.h12
-rw-r--r--noncore/games/fifteen/fifteen.pro4
-rw-r--r--noncore/games/fifteen/main.cpp20
4 files changed, 70 insertions, 49 deletions
diff --git a/noncore/games/fifteen/fifteen.cpp b/noncore/games/fifteen/fifteen.cpp
index 2e4ed94..b4e0308 100644
--- a/noncore/games/fifteen/fifteen.cpp
+++ b/noncore/games/fifteen/fifteen.cpp
@@ -1,364 +1,391 @@
/**********************************************************************
-** Copyright (C) 2000 Trolltech AS. All rights reserved.
+** Copyright (C) 2000-2002 Trolltech AS. All rights reserved.
**
-** This file is part of Qtopia Environment.
+** This file is part of the Qtopia Environment.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#include "fifteen.h"
-#include <qpe/resource.h>
-#include <qpe/config.h>
+#include <qtopia/resource.h>
+#include <qtopia/config.h>
#include <qvbox.h>
#include <qaction.h>
#include <qlayout.h>
#include <qpainter.h>
#include <qpopupmenu.h>
#include <qmessagebox.h>
-#include <qpe/qpetoolbar.h>
+#include <qtoolbar.h>
#include <qmenubar.h>
#include <qstringlist.h>
#include <qapplication.h>
+#include <qtoolbutton.h>
#include <stdlib.h>
#include <time.h>
-FifteenMainWindow::FifteenMainWindow(QWidget *parent, const char* name)
- : QMainWindow( parent, name )
+FifteenMainWindow::FifteenMainWindow(QWidget *parent, const char* name, WFlags fl)
+ : QMainWindow( parent, name, fl )
{
// random seed
srand(time(0));
-
- setToolBarsMovable( FALSE );
- QVBox *vbox = new QVBox( this );
- PiecesTable *table = new PiecesTable( vbox );
- setCentralWidget(vbox);
+ setCaption( tr("Fifteen Pieces") );
QToolBar *toolbar = new QToolBar(this);
- toolbar->setHorizontalStretchable( TRUE );
- addToolBar(toolbar);
-
+ toolbar->setHorizontalStretchable( FALSE );
QMenuBar *menubar = new QMenuBar( toolbar );
menubar->setMargin(0);
-
QPopupMenu *game = new QPopupMenu( this );
QWidget *spacer = new QWidget( toolbar );
spacer->setBackgroundMode( PaletteButton );
toolbar->setStretchableWidget( spacer );
+
+ setToolBarsMovable( FALSE );
+ QVBox *vbox = new QVBox( this );
+ PiecesTable *table = new PiecesTable( vbox );
+ setCentralWidget(vbox);
+
+
+
QAction *a = new QAction( tr( "Randomize" ), Resource::loadPixmap( "new" ),
QString::null, 0, this, 0 );
connect( a, SIGNAL( activated() ), table, SLOT( slotRandomize() ) );
a->addTo( game );
a->addTo( toolbar );
- a = new QAction( tr( "Solve" ), Resource::loadPixmap( "repeat" ),
+ /* This is pointless and confusing.
+ a = new QAction( tr( "Solve" ), Resource::loadIconSet( "repeat" ),
QString::null, 0, this, 0 );
connect( a, SIGNAL( activated() ), table, SLOT( slotReset() ) );
a->addTo( game );
a->addTo( toolbar );
-
+ */
menubar->insertItem( tr( "Game" ), game );
}
PiecesTable::PiecesTable(QWidget* parent, const char* name )
: QTableView(parent, name), _menu(0), _randomized(false)
{
// setup table view
setFrameStyle(StyledPanel | Sunken);
setBackgroundMode(NoBackground);
setMouseTracking(true);
setNumRows(4);
setNumCols(4);
// init arrays
initMap();
readConfig();
initColors();
// set font
QFont f = font();
f.setPixelSize(18);
f.setBold( TRUE );
setFont(f);
}
PiecesTable::~PiecesTable()
{
writeConfig();
}
void PiecesTable::writeConfig()
{
Config cfg("Fifteen");
cfg.setGroup("Game");
QStringList map;
- for (unsigned int i = 0; i < 16; i++)
+ for (int i = 0; i < 16; i++)
map.append( QString::number( _map[i] ) );
cfg.writeEntry("Map", map, '-');
cfg.writeEntry("Randomized", _randomized );
}
void PiecesTable::readConfig()
{
Config cfg("Fifteen");
cfg.setGroup("Game");
QStringList map = cfg.readListEntry("Map", '-');
_randomized = cfg.readBoolEntry( "Randomized", FALSE );
- unsigned int i = 0;
+ int i = 0;
for ( QStringList::Iterator it = map.begin(); it != map.end(); ++it ) {
_map[i] = (*it).toInt();
i++;
if ( i > 15 ) break;
}
}
void PiecesTable::paintCell(QPainter *p, int row, int col)
{
int w = cellWidth();
int h = cellHeight();
int x2 = w - 1;
int y2 = h - 1;
int number = _map[col + row * numCols()] + 1;
// draw cell background
if(number == 16)
p->setBrush(colorGroup().background());
else
p->setBrush(_colors[number-1]);
p->setPen(NoPen);
p->drawRect(0, 0, w, h);
+ if (number == 16) return;
+
// draw borders
if (height() > 40) {
- p->setPen(colorGroup().text());
- if(col < numCols()-1)
- p->drawLine(x2, 0, x2, y2); // right border line
+ p->setBrush(_colors[number-1].light(130));
+ p->drawPolygon(light_border);
- if(row < numRows()-1)
- p->drawLine(0, y2, x2, y2); // bottom boder line
+ p->setBrush(_colors[number-1].dark(130));
+ p->drawPolygon(dark_border);
}
// draw number
- if (number == 16) return;
p->setPen(black);
p->drawText(0, 0, x2, y2, AlignHCenter | AlignVCenter, QString::number(number));
}
void PiecesTable::resizeEvent(QResizeEvent *e)
{
QTableView::resizeEvent(e);
setCellWidth(contentsRect().width()/ numRows());
setCellHeight(contentsRect().height() / numCols());
+
+ //
+ // Calculate 3d-effect borders
+ //
+ int cell_w = cellWidth();
+ int cell_h = cellHeight();
+ int x_offset = cell_w - int(cell_w * 0.9); // 10% should be enough
+ int y_offset = cell_h - int(cell_h * 0.9);
+
+ light_border.setPoints(6,
+ 0, 0,
+ cell_w, 0,
+ cell_w - x_offset, y_offset,
+ x_offset, y_offset,
+ x_offset, cell_h - y_offset,
+ 0, cell_h);
+
+ dark_border.setPoints(6,
+ cell_w, 0,
+ cell_w, cell_h,
+ 0, cell_h,
+ x_offset, cell_h - y_offset,
+ cell_w - x_offset, cell_h - y_offset,
+ cell_w - x_offset, y_offset);
}
void PiecesTable::initColors()
{
_colors.resize(numRows() * numCols());
for (int r = 0; r < numRows(); r++)
for (int c = 0; c < numCols(); c++)
_colors[c + r *numCols()] = QColor(255 - 70 * c,255 - 70 * r, 150);
}
void PiecesTable::initMap()
{
_map.resize(16);
- for (unsigned int i = 0; i < 16; i++)
+ for ( int i = 0; i < 16; i++)
_map[i] = i;
_randomized = false;
}
void PiecesTable::randomizeMap()
{
initMap();
_randomized = true;
// find the free position
int pos = _map.find(15);
int move = 0;
while ( move < 333 ) {
int frow = pos / numCols();
int fcol = pos - frow * numCols();
// find click position
int row = rand()%4;
int col = rand()%4;
// sanity check
if ( row < 0 || row >= numRows() ) continue;
if ( col < 0 || col >= numCols() ) continue;
if ( row != frow && col != fcol ) continue;
move++;
// rows match -> shift pieces
if(row == frow) {
if (col < fcol) {
for(int c = fcol; c > col; c--) {
_map[c + row * numCols()] = _map[ c-1 + row *numCols()];
}
}
else if (col > fcol) {
for(int c = fcol; c < col; c++) {
_map[c + row * numCols()] = _map[ c+1 + row *numCols()];
}
}
}
// cols match -> shift pieces
else if (col == fcol) {
if (row < frow) {
for(int r = frow; r > row; r--) {
_map[col + r * numCols()] = _map[ col + (r-1) *numCols()];
}
}
else if (row > frow) {
for(int r = frow; r < row; r++) {
_map[col + r * numCols()] = _map[ col + (r+1) *numCols()];
}
}
}
// move free cell to click position
_map[pos=(col + row * numCols())] = 15;
- repaint();
}
+ repaint();
}
void PiecesTable::checkwin()
{
if(!_randomized) return;
int i;
for (i = 0; i < 16; i++)
if(i != _map[i])
break;
if (i == 16) {
QMessageBox::information(this, tr("Fifteen Pieces"),
tr("Congratulations!\nYou win the game!"));
_randomized = FALSE;
}
}
void PiecesTable::slotRandomize()
{
randomizeMap();
}
void PiecesTable::slotReset()
{
initMap();
repaint();
}
void PiecesTable::mousePressEvent(QMouseEvent* e)
{
QTableView::mousePressEvent(e);
if (e->button() == RightButton) {
// setup RMB pupup menu
if(!_menu) {
_menu = new QPopupMenu(this);
_menu->insertItem(tr("R&andomize Pieces"), mRandomize);
_menu->insertItem(tr("&Reset Pieces"), mReset);
_menu->adjustSize();
}
// execute RMB popup and check result
switch(_menu->exec(mapToGlobal(e->pos()))) {
case mRandomize:
randomizeMap();
break;
case mReset:
initMap();
repaint();
break;
default:
break;
}
}
else {
// GAME LOGIC
// find the free position
int pos = _map.find(15);
if(pos < 0) return;
int frow = pos / numCols();
int fcol = pos - frow * numCols();
// find click position
int row = findRow(e->y());
int col = findCol(e->x());
// sanity check
if (row < 0 || row >= numRows()) return;
if (col < 0 || col >= numCols()) return;
if ( row != frow && col != fcol ) return;
// valid move?
if(row != frow && col != fcol) return;
// rows match -> shift pieces
if(row == frow) {
if (col < fcol) {
for(int c = fcol; c > col; c--) {
_map[c + row * numCols()] = _map[ c-1 + row *numCols()];
updateCell(row, c, false);
}
}
else if (col > fcol) {
for(int c = fcol; c < col; c++) {
_map[c + row * numCols()] = _map[ c+1 + row *numCols()];
updateCell(row, c, false);
}
}
}
// cols match -> shift pieces
else if (col == fcol) {
if (row < frow) {
for(int r = frow; r > row; r--) {
_map[col + r * numCols()] = _map[ col + (r-1) *numCols()];
updateCell(r, col, false);
}
}
else if (row > frow) {
for(int r = frow; r < row; r++) {
_map[col + r * numCols()] = _map[ col + (r+1) *numCols()];
updateCell(r, col, false);
}
}
}
// move free cell to click position
_map[col + row * numCols()] = 15;
updateCell(row, col, false);
// check if the player wins with this move
checkwin();
}
}
diff --git a/noncore/games/fifteen/fifteen.h b/noncore/games/fifteen/fifteen.h
index 703a8a7..58eb756 100644
--- a/noncore/games/fifteen/fifteen.h
+++ b/noncore/games/fifteen/fifteen.h
@@ -1,83 +1,89 @@
/**********************************************************************
-** Copyright (C) 2000 Trolltech AS. All rights reserved.
+** Copyright (C) 2000-2002 Trolltech AS. All rights reserved.
**
-** This file is part of Qtopia Environment.
+** This file is part of the Qtopia Environment.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#ifndef __fifteenapplet_h__
#define __fifteenapplet_h__
#include <qmainwindow.h>
#include <qtableview.h>
#include <qarray.h>
+#include <qpointarray.h>
class QPopupMenu;
class PiecesTable : public QTableView
{
Q_OBJECT
public:
PiecesTable(QWidget* parent = 0, const char* name = 0);
~PiecesTable();
protected slots:
void slotRandomize();
void slotReset();
protected:
void resizeEvent(QResizeEvent*);
void mousePressEvent(QMouseEvent*);
void paintCell(QPainter *, int row, int col);
void initMap();
void initColors();
void randomizeMap();
void checkwin();
void readConfig();
void writeConfig();
private:
QArray<int> _map;
QArray<QColor> _colors;
QPopupMenu *_menu;
bool _randomized;
+ QPointArray light_border;
+ QPointArray dark_border;
enum MenuOp { mRandomize = 1, mReset = 2 };
};
class FifteenWidget : public QWidget
{
Q_OBJECT
public:
FifteenWidget(QWidget *parent = 0, const char *name = 0);
private:
PiecesTable *_table;
};
class FifteenMainWindow : public QMainWindow
{
Q_OBJECT
public:
- FifteenMainWindow(QWidget *parent=0, const char* name=0);
+ static QString appName() {
+ return QString::fromLatin1("fifteen");
+ }
+ FifteenMainWindow(QWidget *parent=0, const char* name=0, WFlags fl=0);
};
#endif
diff --git a/noncore/games/fifteen/fifteen.pro b/noncore/games/fifteen/fifteen.pro
index 43d336d..14ea3c9 100644
--- a/noncore/games/fifteen/fifteen.pro
+++ b/noncore/games/fifteen/fifteen.pro
@@ -1,12 +1,10 @@
-DESTDIR = $(OPIEDIR)/bin
-TEMPLATE = app
-CONFIG = qt warn_on release
+CONFIG = qt warn_on release quick-app
HEADERS = fifteen.h
SOURCES = fifteen.cpp \
main.cpp
INCLUDEPATH += $(OPIEDIR)/include
DEPENDPATH += $(OPIEDIR)/include
LIBS += -lqpe
TARGET = fifteen
include ( $(OPIEDIR)/include.pro )
diff --git a/noncore/games/fifteen/main.cpp b/noncore/games/fifteen/main.cpp
index 4838a36..74a7368 100644
--- a/noncore/games/fifteen/main.cpp
+++ b/noncore/games/fifteen/main.cpp
@@ -1,33 +1,23 @@
/**********************************************************************
-** Copyright (C) 2000 Trolltech AS. All rights reserved.
+** Copyright (C) 2004 Holger Freyther. All rights reserved.
**
-** This file is part of Qtopia Environment.
+** This file is part of Opie Environment.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
-** Contact info@trolltech.com if any conditions of this licensing are
-** not clear to you.
-**
**********************************************************************/
#include "fifteen.h"
-#include <qpe/qpeapplication.h>
+#include <opie/oapplicationfactory.h>
+
+OPIE_EXPORT_APP( OApplicationFactory<FifteenMainWindow> )
-int main( int argc, char ** argv)
-{
- QPEApplication app( argc, argv );
-
- FifteenMainWindow mw;
- mw.setCaption( FifteenMainWindow::tr("Fifteen Pieces") );
- app.showMainWidget( &mw );
- return app.exec();
-}