⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 minesweep.cpp

📁 Trolltech公司发布的图形界面操作系统。可在qt-embedded-2.3.10平台上编译为嵌入式图形界面操作系统。
💻 CPP
字号:
/************************************************************************ Copyright (C) 2000-2005 Trolltech AS.  All rights reserved.**** This file is part of the Qtopia Environment.** ** This program is free software; you can redistribute it and/or modify it** under the terms of the GNU General Public License as published by the** Free Software Foundation; either version 2 of the License, or (at your** option) any later version.** ** A copy of the GNU GPL license version 2 is included in this package as ** LICENSE.GPL.**** This program is distributed in the hope that it will be useful, but** WITHOUT ANY WARRANTY; without even the implied warranty of** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ** See the GNU General Public License for more details.**** In addition, as a special exception Trolltech gives permission to link** the code of this program with Qtopia applications copyrighted, developed** and distributed by Trolltech under the terms of the Qtopia Personal Use** License Agreement. You must comply with the GNU General Public License** in all respects for all of the code used other than the applications** licensed under the Qtopia Personal Use License Agreement. If you modify** this file, you may extend this exception to your version of the file,** but you are not obligated to do so. If you do not wish to do so, delete** this exception statement from your version.** ** 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 "minesweep.h"#include "minefield.h"#include <qtopia/qpeapplication.h>#include <qtopia/resource.h>#include <qtopia/config.h>#ifdef QTOPIA_PHONE#include <qtopia/contextmenu.h>#include <qtopia/contextbar.h>#include <qaction.h>#else#include <qtopia/qpetoolbar.h>#include <qtopia/qpemenubar.h>#include <qpopupmenu.h>#include <qlcdnumber.h>#include <qpushbutton.h>#endif#include <qmessagebox.h>#ifndef QTOPIA_PHONE#include <qtimer.h>#endif#include <qpalette.h>#include <qapplication.h>#include <qlayout.h>#include <qlabel.h>#include <stdlib.h>#include <time.h>class ResultIndicator : private QLabel{public:       static void showResult( QWidget *ref, bool won );    static ResultIndicator* getInstance();private:        ResultIndicator( QWidget *parent, const char *name, WFlags f)	:QLabel( parent, name, f ) {}        static ResultIndicator* pInstance;        void timerEvent( QTimerEvent *);    void center();    bool twoStage;    int timerId;};ResultIndicator* ResultIndicator::pInstance = 0;ResultIndicator* ResultIndicator::getInstance() {    return ResultIndicator::pInstance;}void ResultIndicator::showResult( QWidget *ref, bool won ){    if (pInstance != 0)         delete pInstance;    pInstance = new ResultIndicator( ref, 0, WStyle_Customize | WStyle_Tool | WType_TopLevel );        pInstance->setAlignment( AlignCenter );    pInstance->setFrameStyle( Sunken|StyledPanel );    if ( won ) {	pInstance->setText( MineSweep::tr("You won!") );	pInstance->center();	pInstance->show();	pInstance->twoStage = FALSE;	pInstance->timerId = pInstance->startTimer(1500);    } else {	QPalette p( red );	pInstance->setPalette( p );	pInstance->setText( MineSweep::tr("You exploded!") );	pInstance->resize( ref->size() );	pInstance->move( ref->mapToGlobal(QPoint(0,0)) );	pInstance->show();	pInstance->twoStage = TRUE;	pInstance->timerId =pInstance->startTimer(200);    }}void ResultIndicator::center(){    QWidget *w = parentWidget();    QPoint pp = w->mapToGlobal( QPoint(0,0) );     QSize s = sizeHint()*3;    s.setWidth( QMIN(s.width(), w->width()) );    pp = QPoint( pp.x() + w->width()/2 - s.width()/2,		pp.y() + w->height()/ 2 - s.height()/2 );    setGeometry( QRect(pp, s) );    }void ResultIndicator::timerEvent( QTimerEvent *te ){    if ( te->timerId() != timerId )	return;    killTimer( timerId );    if ( twoStage ) {	center();	twoStage = FALSE;	timerId = startTimer( 1000 );    } else {        pInstance = 0;	delete this;    }}class MineFrame : public QFrame{public:    MineFrame( QWidget *parent, const char *name = 0 )	:QFrame( parent, name ), field(0) {	setFrameStyle(NoFrame);        //setBackgroundMode(NoBackground);    }    void setField( MineField *f ) {	field = f;	setMinimumSize( field->sizeHint() );    }protected:    void resizeEvent( QResizeEvent *e ) {	field->setAvailableRect( contentsRect());	QFrame::resizeEvent(e);     }    private:    MineField *field;};MineSweep::MineSweep( QWidget* parent, const char* name, WFlags f ): QMainWindow( parent, name, f ){    QPEApplication::setInputMethodHint(this,QPEApplication::AlwaysOff);    srand(::time(0));    setCaption( tr("Mine Hunt") );    setIcon( Resource::loadPixmap( "MineHunt" ) );#ifndef QTOPIA_PHONE    QPEToolBar *toolBar = new QPEToolBar( this );    toolBar->setHorizontalStretchable( TRUE );    QPEMenuBar *menuBar = new QPEMenuBar( toolBar );    QPopupMenu *gameMenu = new QPopupMenu( this );    gameMenu->insertItem( tr("Beginner"), this, SLOT( beginner() ) );    gameMenu->insertItem( tr("Advanced"), this, SLOT( advanced() ) );    if (qApp->desktop()->width() >= 240) {	gameMenu->insertItem( tr("Expert"), this, SLOT( expert() ) );    }    menuBar->insertItem( tr("Game"), gameMenu );        guessLCD = new QLCDNumber( toolBar );    toolBar->setStretchableWidget( guessLCD );    QPalette lcdPal( red );    lcdPal.setColor( QColorGroup::Background, QApplication::palette().active().background() );    lcdPal.setColor( QColorGroup::Button, QApplication::palette().active().button() );    //    guessLCD->setPalette( lcdPal );    guessLCD->setSegmentStyle( QLCDNumber::Flat );    guessLCD->setFrameStyle( QFrame::NoFrame );    guessLCD->setNumDigits( 2 );    guessLCD->setBackgroundMode( PaletteButton );    newGameButton = new QPushButton( toolBar );    newGameButton->setPixmap( mNewPM );    newGameButton->setFocusPolicy(QWidget::NoFocus);    connect( newGameButton, SIGNAL(clicked()), this, SLOT(newGame()) );        timeLCD = new QLCDNumber( toolBar );//    timeLCD->setPalette( lcdPal );    timeLCD->setSegmentStyle( QLCDNumber::Flat );    timeLCD->setFrameStyle( QFrame::NoFrame );    timeLCD->setNumDigits( 5 ); // "mm:ss"    timeLCD->setBackgroundMode( PaletteButton );        setToolBarsMovable ( FALSE );    addToolBar( toolBar );#endif    MineFrame *mainframe = new MineFrame( this );    field = new MineField( mainframe );#ifdef QTOPIA_PHONE    connect( field, SIGNAL(newGameSelected()), this, SLOT(newGame()) );#endif    mainframe->setField( field );    QFont fnt = field->font();    fnt.setBold( TRUE );    field->setFont( QFont( fnt ) );    field->setFocus();    setCentralWidget( mainframe );        connect( field, SIGNAL( gameOver(bool) ), this, SLOT( gameOver(bool) ) );    connect( field, SIGNAL( mineCount(int) ), this, SLOT( setCounter(int) ) );    connect( field, SIGNAL( gameStarted()), this, SLOT( startPlaying() ) );#ifdef QTOPIA_PHONE    ContextMenu *contextMenu = new ContextMenu(field);    QAction *beginnerAction = new QAction( tr( "Beginner" ), QString::null, 0, this, 0 );    QAction *advancedAction = new QAction( tr( "Advanced" ), QString::null, 0, this, 0 );    connect( beginnerAction, SIGNAL(activated()), this, SLOT(beginner()) );    connect( advancedAction, SIGNAL(activated()), this, SLOT(advanced()) );    beginnerAction->addTo( contextMenu );    advancedAction->addTo( contextMenu );#endif#ifndef QTOPIA_PHONE    timer = new QTimer( this );    connect( timer, SIGNAL( timeout() ), this, SLOT( updateTime() ) );#endif    mWorriedPM = Resource::loadPixmap( "worried" );    mNewPM = Resource::loadPixmap( "new" );    mHappyPM = Resource::loadPixmap( "happy" );    mDeadPM = Resource::loadPixmap( "dead" );    readConfig();}MineSweep::~MineSweep(){}void MineSweep::closeEvent(QCloseEvent *e) {    ResultIndicator* r = ResultIndicator::getInstance();    if (r) {        delete r;    }    writeConfig();    QMainWindow::closeEvent(e);}void MineSweep::gameOver( bool won ){    field->showMines();    if ( won ) {#ifndef QTOPIA_PHONE	newGameButton->setPixmap( mHappyPM );#else	ContextBar::setLabel( field, Qt::Key_Select, "happy", QString::null );#endif    } else {#ifndef QTOPIA_PHONE	newGameButton->setPixmap( mDeadPM );#else	ContextBar::setLabel( field, Qt::Key_Select, "dead", QString::null );#endif    }    ResultIndicator::showResult( this, won );#ifndef QTOPIA_PHONE    timer->stop();#endif}void MineSweep::newGame(){    newGame(field->level());}void MineSweep::newGame(int level){#ifndef QTOPIA_PHONE    timeLCD->display( "0:00" );#endif    field->setup( level );#ifndef QTOPIA_PHONE    newGameButton->setPixmap( mNewPM );    timer->stop();#else	ContextBar::setLabel( field, Qt::Key_Select, "new", QString::null );#endif}void MineSweep::startPlaying(){#ifndef QTOPIA_PHONE    newGameButton->setPixmap( mWorriedPM );    starttime = QDateTime::currentDateTime();    timer->start( 1000 );#else	ContextBar::setLabel( field, Qt::Key_Select, "worried", QString::null );#endif}void MineSweep::beginner(){    newGame(1);}void MineSweep::advanced(){    newGame(2);}void MineSweep::expert(){    newGame(3);}void MineSweep::setCounter( int c ){#ifndef QTOPIA_PHONE    if ( !guessLCD )	return;    guessLCD->display( c );#endif}void MineSweep::updateTime(){#ifndef QTOPIA_PHONE    if ( !timeLCD )	return;    int s = starttime.secsTo(QDateTime::currentDateTime());    if ( s/60 > 99 )	timeLCD->display( "-----" );    else	timeLCD->display( QString().sprintf("%2d:%02d",s/60,s%60) );#endif}void MineSweep::writeConfig() const{    Config cfg("MineSweep");    cfg.setGroup("Panel");#ifndef QTOPIA_PHONE    cfg.writeEntry("Time",	    timer->isActive() ? starttime.secsTo(QDateTime::currentDateTime()) : -1);#endif    field->writeConfig(cfg);}void MineSweep::readConfig(){    Config cfg("MineSweep");    field->readConfig(cfg);    cfg.setGroup("Panel");    int s = cfg.readNumEntry("Time",-1);    if ( s<0 ) {	newGame();    } else {	startPlaying();#ifndef QTOPIA_PHONE	starttime = QDateTime::currentDateTime().addSecs(-s);#endif	updateTime();    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -