📄 kmahjongg.cpp
字号:
/* $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 + -