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

📄 kmahjongg.cpp

📁 四川麻将程序代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
/*    $Id: kmahjongg.cpp,v 1.52 2000/09/25 20:36:43 gebauer Exp $    kmahjongg, the classic mahjongg game for KDE project    Requires the Qt widget libraries, available at no cost at    http://www.troll.no    Copyright (C) 1997 Mathias Mueller   <in5y158@public.uni-hamburg.de>    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.    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.    You should have received a copy of the GNU General Public License    along with this program; if not, write to the Free Software    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.*/#include <string.h>#include <stdlib.h>#include <qmsgbox.h>#include <qtimer.h>#include <qaccel.h>#include <qfile.h>#include <kmessagebox.h>#include <kiconloader.h>#include <kglobal.h>#include <klocale.h>#include <kcmdlineargs.h>#include <kio/netaccess.h>#include <kmenubar.h>#include <kstddirs.h>#include "kmahjongg.moc"#include "version.h"#include "PrefsDlg.h"#include <qpainter.h>#include "Progress.h"#include <kaboutdata.h>static const char *description = I18N_NOOP("KDE Game");//----------------------------------------------------------// Defines//----------------------------------------------------------#define ID_STATUS_TILENUMBER 1#define ID_STATUS_MESSAGE    2#define ID_STATUS_GAME	     3#define ANIMSPEED    200// tiles symbol names:#define TILE_OFFSET      2#define TILE_CHARACTER  ( 0 + TILE_OFFSET)#define TILE_BAMBOO      ( 9 + TILE_OFFSET)#define TILE_ROD         (18 + TILE_OFFSET)#define TILE_SEASON      (27 + TILE_OFFSET)#define TILE_WIND        (31 + TILE_OFFSET)#define TILE_DRAGON      (36 + TILE_OFFSET)#define TILE_FLOWER      (39 + TILE_OFFSET)#define ID_FILE_NEW              101#define ID_FILE_LOAD_TILESET     102#define ID_FILE_LOAD_BACKGND     103#define ID_FILE_LOAD_THEME       104#define ID_FILE_LOAD_GAME        105#define ID_FILE_LOAD_BOARD	 106#define ID_FILE_SAVE_GAME        107#define ID_FILE_EXIT             108#define ID_FILE_NEW_NUMERIC	 109#define ID_FILE_SAVE_THEME	 110#define ID_EDIT_UNDO             201#define ID_EDIT_REDO             202#define ID_EDIT_BOARD_EDIT       203#define ID_EDIT_PREFS            204#define ID_GAME_HELP             301#define ID_GAME_DEMO             302#define ID_GAME_SHOW             303#define ID_GAME_SHOW_HISCORE     305#define ID_GAME_PAUSE            306#define ID_GAME_CONTINUE	 307#define ID_GAME_SHUFFLE		 308#define ID_GAME_TIMER 		999#define EXT_BACKGROUND		"*.bgnd"#define EXT_TILESET		"*.tileset"#define EXT_LAYOUT              "*.layout"#define EXT_THEME		"*.theme"int debug_flag = 0;int is_paused = 0;Progress *splash=NULL;void progress(const QString& foo) {	if (splash != NULL) {		splash->status(foo);	}}// ---------------------------------------------------------int main( int argc, char** argv ){    KAboutData aboutData( "kmahjongg", I18N_NOOP("KMahjongg"),      KMAHJONGG_VERSION, description, KAboutData::License_GPL,      "(c) 1997, Mathias Mueller");    aboutData.addAuthor("Mathias Mueller",0, "in5y158@public.uni-hamburg.de");    KCmdLineArgs::init( argc, argv, &aboutData );    KApplication a; //    splash = new Progress(); //    splash->show();     //p.repaint(0,0,-1,-1);    KMahjonggWidget *w = new KMahjonggWidget(); //   splash->hide();    w->show();    return( a.exec() );}// ---------------------------------------------------------/**    Constructor.*/KMahjonggWidget::KMahjonggWidget()    : KMainWindow(0, "kmahjonggwidget"){    prefsDlg = new PrefsDlg(this);    previewLoad = new Preview(this);    setCaption("");    boardEditor = 0;    progress("Reading Preferences");    preferences.initialise(KGlobal::config());    bShowStatusbar = preferences.showStatus();progress("Creating board widget");    // init board widget    bw = new BoardWidget( this );    setCentralWidget( bw );progress("Initialising status bar");    setupStatusBar();progress("Initialising menu bar");    setupMenuBar();progress("Setting up tool bar");    setupToolBar();progress("Initialising highscores");    theHighScores = new HighScore(this);progress("Initialising game number dialog");    gameNum = new GameNum(this);    bDemoModeActive = false;    bShowMatchingTiles = false;progress("Updating status bar");    updateStatusbar( bShowStatusbar );progress("Connecting signals");    connect( bw, SIGNAL( statusTextChanged(const QString&, long) ),                 SLOT( showStatusText(const QString&, long) ) );    connect( bw, SIGNAL( message(const QString&) ),                 SLOT( showMessage(const QString&) ) );    connect( bw, SIGNAL( tileNumberChanged(int,int) ),                 SLOT( showTileNumber(int,int) ) );    connect( bw, SIGNAL( demoModeChanged(bool) ),                 SLOT( demoModeChanged(bool) ) );	connect(bw, SIGNAL(  gameOver(unsigned short , unsigned short)),		    this, SLOT(  gameOver(unsigned short , unsigned short)));	connect(bw, SIGNAL(gameCalculated(void)),		this, SLOT(timerReset(void)));    // preferences signals    connect( prefsDlg, SIGNAL( boardRedraw(bool ) ),                bw, SLOT( drawBoard(bool) ) );    connect( prefsDlg, SIGNAL( statusBar(int) ),                 SLOT( statusBarMode(int) ) );    connect( prefsDlg, SIGNAL( backgroundModeChanged(void) ),                 SLOT( backgroundMode(void) ) );    connect( prefsDlg, SIGNAL(showRemovedChanged(void) ),	      SLOT(setDisplayedWidth() ));    connect( prefsDlg, SIGNAL(tileSizeChanged(void) ),	      SLOT(tileSizeChanged() ));	    // Make connections for the preview load dialog    connect( previewLoad, SIGNAL( boardRedraw(bool) ),              bw,   SLOT( drawBoard(bool) ) );    connect( previewLoad, SIGNAL( layoutChange(void) ),              this,   SLOT( newGame(void) ) );    connect( previewLoad, SIGNAL( loadBackground(const QString&, bool) ),              bw,   SLOT(loadBackground(const QString&, bool) ) );    connect( previewLoad, SIGNAL( loadTileset(const QString &) ),               bw,  SLOT(loadTileset(const QString&) ) );    connect( previewLoad, SIGNAL( loadBoard(const QString&) ),                 SLOT(loadBoardLayout(const QString&) ) );progress("Starting new game");    startNewGame(  );}// ---------------------------------------------------------KMahjonggWidget::~KMahjonggWidget(){    delete pStatusBar;    delete pMenuBar;}// ---------------------------------------------------------void KMahjonggWidget::setupToolBar(){	toolBar = new KToolBar( this );	// new game	toolBar->insertButton(BarIcon("filenew"),		ID_FILE_NEW, TRUE, i18n("New game."));	// new numbered game	toolBar->insertButton(UserIcon("newnum"),		ID_FILE_NEW_NUMERIC, TRUE, i18n("New numbered game."));	// open game	toolBar->insertButton(BarIcon("fileopen"),		ID_FILE_LOAD_GAME, TRUE, i18n("Open game."));	// save game	toolBar->insertButton(BarIcon("filesave"),		ID_FILE_SAVE_GAME, TRUE, i18n(" Save game."));	// undo move	toolBar->insertButton(BarIcon("undo"),		ID_EDIT_UNDO, TRUE, i18n("Undo move."));	// redo move	toolBar->insertButton(BarIcon("redo"),		ID_EDIT_REDO, TRUE, i18n("Redo move."));	// pause	toolBar->insertButton(BarIcon("player_pause"),		ID_GAME_PAUSE, TRUE, i18n("Pause game."));	// play	toolBar->insertButton(BarIcon("1rightarrow"),		ID_GAME_CONTINUE, TRUE, i18n("Play game."));	// Show hint	toolBar->insertButton(BarIcon("help"),		ID_GAME_HELP, TRUE, i18n("Hint."));		// add the timer widget   	 gameTimer = new GameTimer(toolBar);    	toolBar->insertWidget(ID_GAME_TIMER, gameTimer->width() , gameTimer);	toolBar->alignItemRight( ID_GAME_TIMER, true );	toolBar->setBarPos(KToolBar::Top);	toolBar->show();	    connect( toolBar,  SIGNAL(clicked(int) ), SLOT( menuCallback(int) ) );}// ---------------------------------------------------------void KMahjonggWidget::setupStatusBar(){    pStatusBar = new KStatusBar( this );    // The following isn't possible with the new KStatusBar anymore.    // The correct fix is probably to reverse the order of adding the    // widgets. :/    // Just commenting it out for now (order is not as important    // as compilation), in case someone comes up with a better fix.    // pStatusBar->setInsertOrder( KStatusBar::RightToLeft );    tilesLeftLabel= new QLabel("Removed: 0000/0000", pStatusBar);    tilesLeftLabel->setFrameStyle( QFrame::Panel | QFrame::Sunken );    pStatusBar->addWidget(tilesLeftLabel, tilesLeftLabel->sizeHint().width(), ID_STATUS_GAME);    gameNumLabel = new QLabel("Game: 000000000000000000000", pStatusBar);    gameNumLabel->setFrameStyle( QFrame::Panel | QFrame::Sunken );    pStatusBar->addWidget(gameNumLabel, gameNumLabel->sizeHint().width(), ID_STATUS_TILENUMBER);    statusLabel= new QLabel("Kmahjongg", pStatusBar);    statusLabel->setFrameStyle( QFrame::Panel | QFrame::Sunken );    pStatusBar->addWidget(statusLabel, statusLabel->sizeHint().width(), ID_STATUS_MESSAGE);  //  pStatusBar->setAlignment( ID_STATUS_TILENUMBER, AlignCenter );    pStatusBar->show();}// ---------------------------------------------------------void KMahjonggWidget::updateStatusbar( bool bShow ){  //    pMenuBar->setItemChecked( ID_VIEW_STATUSBAR, bShow );    if (bShow)       statusBar()->show();    else       statusBar()->hide();    setDisplayedWidth();}void KMahjonggWidget::setDisplayedWidth() {    bw->setDisplayedWidth();    setFixedSize( bw->size() +                  QSize( 2, (preferences.showStatus() ? pStatusBar->height() : 0)                     + 2 + pMenuBar->height() ) );	toolBar->setFixedWidth(bw->width());	toolBar->alignItemRight( ID_GAME_TIMER, true );	bw->drawBoard();}// ---------------------------------------------------------void KMahjonggWidget::setupMenuBar(){  // set up the file menu  KPopupMenu *file = new KPopupMenu;  file->insertItem(SmallIcon("filenew"), i18n("New game"), ID_FILE_NEW);  file->insertItem(i18n("New numbered game..."), ID_FILE_NEW_NUMERIC);  file->insertSeparator();  file->insertItem(SmallIcon("fileopen"), i18n("&Open Game... "), ID_FILE_LOAD_GAME);  file->insertItem(i18n("Open The&me..."), ID_FILE_LOAD_THEME);  file->insertItem(i18n("Open &Tileset..."), ID_FILE_LOAD_TILESET);  file->insertItem(i18n("Open &Background..."), ID_FILE_LOAD_BACKGND);  file->insertItem( i18n("Open &Layout..."), ID_FILE_LOAD_BOARD );  file->insertSeparator();  file->insertItem(i18n("&Save Theme..."), ID_FILE_SAVE_THEME);  file->insertItem(SmallIcon("filesave"), i18n("&Save Game..."), ID_FILE_SAVE_GAME);  file->insertSeparator();  file->insertItem(SmallIcon("exit"), i18n("&Quit "), ID_FILE_EXIT);  KPopupMenu *edit = new KPopupMenu;  edit->insertItem(SmallIcon("undo"), i18n("&Undo"), ID_EDIT_UNDO);  edit->insertItem(SmallIcon("redo"), i18n("&Redo"), ID_EDIT_REDO);  edit->insertSeparator();  edit->insertItem(i18n("&Board editor..."), ID_EDIT_BOARD_EDIT);  edit->insertSeparator();  edit->insertItem(SmallIcon("configure"), i18n("&Preferences..."), ID_EDIT_PREFS);  KPopupMenu *game = new KPopupMenu;  game->insertItem( i18n("&Help me"),           ID_GAME_HELP );  game->insertItem( SmallIcon("reload"), i18n("Shu&ffle"),           ID_GAME_SHUFFLE );  game->insertItem( i18n("&Demo mode"),         ID_GAME_DEMO );  game->insertItem( i18n("Show &matching tiles"), ID_GAME_SHOW );  game->insertItem( i18n("&Show Hiscores..."), ID_GAME_SHOW_HISCORE );  game->insertSeparator();  game->insertItem( SmallIcon("player_pause"), i18n("&Pause"), ID_GAME_PAUSE );  game->insertItem( SmallIcon("1rightarrow"), i18n("&Continue"), ID_GAME_CONTINUE );  QPopupMenu *help = helpMenu(QString(i18n("Mahjongg"))           + " " + KMAHJONGG_VERSION           + i18n("\n\nOriginal version by Mathias Mueller")           + " (in5y158@public.uni-hamburg.de)"           + i18n("\n\nRewritten and extended by ")           + "David Black"           + " (david.black@connectfree.co.uk)"	   + i18n("\n\nTile set contributor and web page maintainer: ")	   + "Osvaldo Stark (starko@dnet.it)"	   + i18n("\nsee http://freeweb.dnet.it/kmj/ for tile sets and layouts") );    pMenuBar = new KMenuBar( this );    pMenuBar->insertItem( i18n("&File"), file );    pMenuBar->insertItem( i18n("&Edit"), edit );    pMenuBar->insertItem( i18n("&Game"), game );    pMenuBar->insertSeparator();    pMenuBar->insertItem( i18n("&Help"), help );    // initialize menu accelerators    //    // file menu    pMenuBar->setAccel(CTRL+Key_N, ID_FILE_NEW);    pMenuBar->setAccel(CTRL+Key_O, ID_FILE_LOAD_GAME);    pMenuBar->setAccel(CTRL+Key_S, ID_FILE_SAVE_GAME);    pMenuBar->setAccel( CTRL+Key_Q, ID_FILE_EXIT );    pMenuBar->setAccel(CTRL+Key_Z, ID_EDIT_UNDO);    pMenuBar->show();    connect( pMenuBar,  SIGNAL(activated(int) ), SLOT( menuCallback(int) ) );}// ---------------------------------------------------------void KMahjonggWidget::menuCallback( int item ){    switch( item )    {        case ID_FILE_NEW:	  	startNewGame();	  	break;	case ID_FILE_NEW_NUMERIC:		if (gameNum->exec()) {			startNewGame(gameNum->getNumber());		}		break;        case ID_FILE_EXIT:	    	// write configuration	    	preferences.sync();	    	kapp->quit();            	break;        case ID_GAME_HELP:            	bw->helpMove();            	break;        case ID_EDIT_UNDO:            	bw->Game.allow_redo += bw->undoMove();	    	demoModeChanged(false);            	break;        case ID_EDIT_REDO:	    	if (bw->Game.allow_redo >0) {            		bw->Game.allow_redo--;			bw->redoMove();	    		demoModeChanged(false);	    	}            	break;        case ID_EDIT_PREFS:	      	prefsDlg->initialise();	      	prefsDlg->exec();

⌨️ 快捷键说明

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