📄 minefield.cpp
字号:
/************************************************************************ Copyright (C) 2000-2002 Trolltech AS. All rights reserved.**** 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 "minefield.h"#include <qtopia/config.h>#include <qtopia/qpeapplication.h>#include <qpainter.h>#include <qdrawutil.h>#include <qpixmap.h>#include <qimage.h>#include <qtimer.h>#include <stdlib.h>static const char *pix_flag[]={"13 13 3 1","# c #000000","x c #ff0000",". c None",".............",".............",".....#xxxxxx.",".....#xxxxxx.",".....#xxxxxx.",".....#xxxxxx.",".....#.......",".....#.......",".....#.......",".....#.......","...#####.....","..#######....","............."};static const char *pix_mine[]={"13 13 3 1","# c #000000",". c None","a c #ffffff","......#......","......#......","..#.#####.#..","...#######...","..##aa#####..","..##aa#####..","#############","..#########..","..#########..","...#######...","..#.#####.#..","......#......","......#......"};static const int maxGrid = 28;static const int minGrid = 12;class Mine : public Qt{public: enum MineState { Hidden = 0, Empty, Mined, Flagged,#ifdef MARK_UNSURE Unsure,#endif Exploded, Wrong }; Mine( MineField* ); void paint( QPainter * p, const QColorGroup & cg, const QRect & cr ); QSize sizeHint() const { return QSize( maxGrid, maxGrid ); } void activate( bool sure = TRUE ); void setHint( int ); void setState( MineState ); MineState state() const { return st; } bool isMined() const { return mined; } void setMined( bool m ) { mined = m; } static void paletteChange();private: bool mined; int hint; MineState st; MineField *field; static QPixmap* knownField; static QPixmap* unknownField; static QPixmap* flag_pix; static QPixmap* mine_pix;};QPixmap* Mine::knownField = 0;QPixmap* Mine::unknownField = 0;QPixmap* Mine::flag_pix = 0;QPixmap* Mine::mine_pix = 0;Mine::Mine( MineField *f ){ mined = FALSE; st = Hidden; hint = 0; field = f;}void Mine::activate( bool sure ){ if ( !sure ) { switch ( st ) { case Hidden: setState( Flagged ); break; case Flagged:#ifdef MARK_UNSURE setState( Unsure ); break; case Unsure:#endif setState( Hidden ); default: break; } } else if ( st == Flagged ) { return; } else { if ( mined ) { setState( Exploded ); } else { setState( Empty ); } }}void Mine::setState( MineState s ){ st = s;}void Mine::setHint( int h ){ hint = h;}void Mine::paletteChange(){ delete knownField; knownField = 0; delete unknownField; unknownField = 0; delete mine_pix; mine_pix = 0; delete flag_pix; flag_pix = 0;}void Mine::paint( QPainter* p, const QColorGroup &cg, const QRect& cr ){ int x = cr.x(); int y = cr.y(); if ( !knownField || knownField->width() != cr.width() || knownField->height() != cr.height() ) { delete knownField; knownField = new QPixmap( cr.width(), cr.height() ); QPainter pp( knownField ); QBrush br( cg.button().dark(115) ); qDrawWinButton( &pp, cr, cg, TRUE, &br ); } const int pmmarg=cr.width()/5; if ( !unknownField || unknownField->width() != cr.width() || unknownField->height() != cr.height() ) { delete unknownField; unknownField = new QPixmap( cr.width(), cr.height() ); QPainter pp( unknownField ); QBrush br( cg.button() ); qDrawWinButton( &pp, cr, cg, FALSE, &br ); } if ( !flag_pix || flag_pix->width() != cr.width()-pmmarg*2 || flag_pix->height() != cr.height()-pmmarg*2 ) { delete flag_pix; flag_pix = new QPixmap( cr.width()-pmmarg*2, cr.height()-pmmarg*2 ); flag_pix->convertFromImage( QImage(pix_flag).smoothScale(cr.width()-pmmarg*2, cr.height()-pmmarg*2) ); } if ( !mine_pix || mine_pix->width() != cr.width()-pmmarg*2 || mine_pix->height() != cr.height()-pmmarg*2 ) { delete mine_pix; mine_pix = new QPixmap( cr.width()-pmmarg*2, cr.height()-pmmarg*2 ); mine_pix->convertFromImage( QImage(pix_mine).smoothScale(cr.width()-pmmarg*2, cr.height()-pmmarg*2) ); } p->save(); switch(st) { case Hidden: p->drawPixmap( x, y, *unknownField ); break; case Empty: p->drawPixmap( x, y, *knownField ); if ( hint > 0 ) { switch( hint ) { case 1: p->setPen( blue ); break; case 2: p->setPen( green.dark() ); break; case 3: p->setPen( red ); break; case 4: p->setPen( darkYellow.dark() ); break; case 5: p->setPen( darkMagenta ); break; case 6: p->setPen( darkRed ); break; default: p->setPen( black ); break; } p->drawText( cr, AlignHCenter | AlignVCenter, QString::number( hint ) ); } break; case Mined: p->drawPixmap( x, y, *knownField ); p->drawPixmap( x+pmmarg, y+pmmarg, *mine_pix ); break; case Exploded: p->drawPixmap( x, y, *knownField ); p->drawPixmap( x+pmmarg, y+pmmarg, *mine_pix ); p->setPen( red ); p->drawText( cr, AlignHCenter | AlignVCenter, "X" ); break; case Flagged: p->drawPixmap( x, y, *unknownField ); p->drawPixmap( x+pmmarg, y+pmmarg, *flag_pix ); break;#ifdef MARK_UNSURE case Unsure: p->drawPixmap( x, y, *unknownField ); p->drawText( cr, AlignHCenter | AlignVCenter, "?" ); break;#endif case Wrong: p->drawPixmap( x, y, *unknownField ); p->drawPixmap( x+pmmarg, y+pmmarg, *flag_pix ); p->setPen( red ); p->drawText( cr, AlignHCenter | AlignVCenter, "X" ); break; } p->restore();}/* MineField implementation*/MineField::MineField( QWidget* parent, const char* name ): QScrollView( parent, name ){ viewport()->setBackgroundMode( NoBackground ); setState( GameOver ); setSizePolicy( QSizePolicy( QSizePolicy::Maximum, QSizePolicy::Maximum ) ); setFocusPolicy( QWidget::NoFocus ); holdTimer = new QTimer( this ); connect( holdTimer, SIGNAL( timeout() ), this, SLOT( held() ) ); flagAction = NoAction; ignoreClick = FALSE; currRow = currCol = -1; minecount=0; mineguess=0; nonminecount=0; cellSize = -1; numRows = numCols = 0; mines = NULL;}MineField::~MineField(){ for ( int i = 0; i < numCols*numRows; i++ ) delete mines[i]; delete[] mines;}void MineField::setState( State st ){ stat = st;}void MineField::setup( int level ){ lev = level; setState( Waiting ); //viewport()->setUpdatesEnabled( FALSE ); int i; for ( i = 0; i < numCols*numRows; i++ ) delete mines[i]; delete[] mines; switch( lev ) { case 1: numRows = 9 ; numCols = 9 ; minecount = 12; break; case 2: numRows = 13; numCols = 13; minecount = 33; break; case 3: numCols = 18; numRows = 18; minecount = 66 ; break; } mines = new Mine* [numRows*numCols]; for ( i = 0; i < numCols*numRows; i++ ) mines[i] = new Mine( this ); nonminecount = numRows*numCols - minecount; mineguess = minecount; emit mineCount( mineguess ); Mine::paletteChange(); if ( availableRect.isValid() ) setCellSize(findCellSize()); // viewport()->setUpdatesEnabled( TRUE ); //viewport()->repaint( TRUE ); updateContents( 0, 0, numCols*cellSize, numRows*cellSize ); updateGeometry();}void MineField::drawContents( QPainter * p, int clipx, int clipy, int clipw, int cliph ) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -