-rw-r--r-- | noncore/games/tictac/tictac.cpp | 282 |
1 files changed, 143 insertions, 139 deletions
diff --git a/noncore/games/tictac/tictac.cpp b/noncore/games/tictac/tictac.cpp index 20cc942..3d727ac 100644 --- a/noncore/games/tictac/tictac.cpp +++ b/noncore/games/tictac/tictac.cpp @@ -1,10 +1,10 @@ /**************************************************************************** -** $Id$ -** -** Copyright (C) 1992-2000 Trolltech AS. All rights reserved. -** -** This file is part of an example program for Qt. This example -** program may be used, distributed and modified without limitation. -** -*****************************************************************************/ + ** $Id$ + ** + ** Copyright (C) 1992-2000 Trolltech AS. All rights reserved. + ** + ** This file is part of an example program for Qt. This example + ** program may be used, distributed and modified without limitation. + ** + *****************************************************************************/ @@ -18,4 +18,5 @@ #include <qlayout.h> -#include <stdlib.h> // rand() function -#include <qdatetime.h> // seed for rand() +#include <stdlib.h> // rand() function +#include <qdatetime.h> // seed for rand() +#include <qstringlist.h> //needed for proper internationalization @@ -32,3 +33,3 @@ TicTacButton::TicTacButton( QWidget *parent ) : QPushButton( parent ) { - t = Blank; // initial type + t = Blank; // initial type } @@ -42,8 +43,8 @@ void TicTacButton::drawButtonLabel( QPainter *p ) QRect r = rect(); - p->setPen( QPen( white,2 ) ); // set fat pen + p->setPen( QPen( white,2 ) ); // set fat pen if ( t == Circle ) { - p->drawEllipse( r.left()+4, r.top()+4, r.width()-8, r.height()-8 ); - } else if ( t == Cross ) { // draw cross - p->drawLine( r.topLeft() +QPoint(4,4), r.bottomRight()-QPoint(4,4)); - p->drawLine( r.bottomLeft()+QPoint(4,-4),r.topRight() -QPoint(4,-4)); + p->drawEllipse( r.left()+4, r.top()+4, r.width()-8, r.height()-8 ); + } else if ( t == Cross ) { // draw cross + p->drawLine( r.topLeft() +QPoint(4,4), r.bottomRight()-QPoint(4,4)); + p->drawLine( r.bottomLeft()+QPoint(4,-4),r.topRight() -QPoint(4,-4)); } @@ -62,23 +63,23 @@ void TicTacButton::drawButtonLabel( QPainter *p ) TicTacGameBoard::TicTacGameBoard( int n, QWidget *parent, const char *name ) - : QWidget( parent, name ) + : QWidget( parent, name ) { -showMaximized(); - st = Init; // initial state + showMaximized(); + st = Init; // initial state nBoard = n; - n *= n; // make square - comp_starts = FALSE; // human starts - buttons = new TicTacButtons(n); // create real buttons - btArray = new TicTacArray(n); // create button model + n *= n; // make square + comp_starts = FALSE; // human starts + buttons = new TicTacButtons(n); // create real buttons + btArray = new TicTacArray(n); // create button model QGridLayout * grid = new QGridLayout( this, 3, 3, 4 ); QPalette p( blue ); - for ( int i=0; i<n; i++ ) { // create and connect buttons - TicTacButton *ttb = new TicTacButton( this ); - ttb->setPalette( p ); - ttb->setEnabled( FALSE ); - connect( ttb, SIGNAL(clicked()), SLOT(buttonClicked()) ); - grid->addWidget( ttb, i%3, i/3 ); - buttons->insert( i, ttb ); - btArray->at(i) = TicTacButton::Blank; // initial button type + for ( int i=0; i<n; i++ ) { // create and connect buttons + TicTacButton *ttb = new TicTacButton( this ); + ttb->setPalette( p ); + ttb->setEnabled( FALSE ); + connect( ttb, SIGNAL(clicked()), SLOT(buttonClicked()) ); + grid->addWidget( ttb, i%3, i/3 ); + buttons->insert( i, ttb ); + btArray->at(i) = TicTacButton::Blank; // initial button type } - QTime t = QTime::currentTime(); // set random seed + QTime t = QTime::currentTime(); // set random seed srand( t.hour()*12+t.minute()*60+t.second()*60 ); @@ -115,7 +116,7 @@ void TicTacGameBoard::newGame() for ( int i=0; i<nBoard*nBoard; i++ ) - btArray->at(i) = TicTacButton::Blank; + btArray->at(i) = TicTacButton::Blank; if ( comp_starts ) - computerMove(); + computerMove(); else - updateButtons(); + updateButtons(); } @@ -124,3 +125,3 @@ void TicTacGameBoard::newGame() // -------------------------------------------------------------------------- -// TicTacGameBoard::buttonClicked() - SLOT +// TicTacGameBoard::buttonClicked() - SLOT // @@ -132,16 +133,16 @@ void TicTacGameBoard::buttonClicked() { - if ( st != HumansTurn ) // not ready - return; + if ( st != HumansTurn ) // not ready + return; int i = buttons->findRef( (TicTacButton*)sender() ); - TicTacButton *b = buttons->at(i); // get piece that was pressed - if ( b->type() == TicTacButton::Blank ) { // empty piece? - btArray->at(i) = TicTacButton::Circle; - updateButtons(); - if ( checkBoard( btArray ) == 0 ) // not a winning move? - computerMove(); - int s = checkBoard( btArray ); - if ( s ) { // any winners yet? - st = s == TicTacButton::Circle ? HumanWon : ComputerWon; - emit finished(); - } + TicTacButton *b = buttons->at(i); // get piece that was pressed + if ( b->type() == TicTacButton::Blank ) { // empty piece? + btArray->at(i) = TicTacButton::Circle; + updateButtons(); + if ( checkBoard( btArray ) == 0 ) // not a winning move? + computerMove(); + int s = checkBoard( btArray ); + if ( s ) { // any winners yet? + st = s == TicTacButton::Circle ? HumanWon : ComputerWon; + emit finished(); + } } @@ -159,6 +160,6 @@ void TicTacGameBoard::updateButtons() for ( int i=0; i<nBoard*nBoard; i++ ) { - if ( buttons->at(i)->type() != btArray->at(i) ) - buttons->at(i)->setType( (TicTacButton::Type)btArray->at(i) ); - buttons->at(i)->setEnabled( buttons->at(i)->type() == - TicTacButton::Blank ); + if ( buttons->at(i)->type() != btArray->at(i) ) + buttons->at(i)->setType( (TicTacButton::Type)btArray->at(i) ); + buttons->at(i)->setEnabled( buttons->at(i)->type() == + TicTacButton::Blank ); } @@ -183,47 +184,47 @@ int TicTacGameBoard::checkBoard( TicTacArray *a ) bool won = FALSE; - for ( row=0; row<nBoard && !won; row++ ) { // check horizontal - t = a->at(row*nBoard); - if ( t == TicTacButton::Blank ) - continue; - col = 1; - while ( col<nBoard && a->at(row*nBoard+col) == t ) - col++; - if ( col == nBoard ) - won = TRUE; + for ( row=0; row<nBoard && !won; row++ ) { // check horizontal + t = a->at(row*nBoard); + if ( t == TicTacButton::Blank ) + continue; + col = 1; + while ( col<nBoard && a->at(row*nBoard+col) == t ) + col++; + if ( col == nBoard ) + won = TRUE; } - for ( col=0; col<nBoard && !won; col++ ) { // check vertical - t = a->at(col); - if ( t == TicTacButton::Blank ) - continue; - row = 1; - while ( row<nBoard && a->at(row*nBoard+col) == t ) - row++; - if ( row == nBoard ) - won = TRUE; + for ( col=0; col<nBoard && !won; col++ ) { // check vertical + t = a->at(col); + if ( t == TicTacButton::Blank ) + continue; + row = 1; + while ( row<nBoard && a->at(row*nBoard+col) == t ) + row++; + if ( row == nBoard ) + won = TRUE; } - if ( !won ) { // check diagonal top left - t = a->at(0); // to bottom right - if ( t != TicTacButton::Blank ) { - int i = 1; - while ( i<nBoard && a->at(i*nBoard+i) == t ) - i++; - if ( i == nBoard ) - won = TRUE; - } + if ( !won ) { // check diagonal top left + t = a->at(0); // to bottom right + if ( t != TicTacButton::Blank ) { + int i = 1; + while ( i<nBoard && a->at(i*nBoard+i) == t ) + i++; + if ( i == nBoard ) + won = TRUE; + } } - if ( !won ) { // check diagonal bottom left - int j = nBoard-1; // to top right - int i = 0; - t = a->at(i+j*nBoard); - if ( t != TicTacButton::Blank ) { - i++; j--; - while ( i<nBoard && a->at(i+j*nBoard) == t ) { - i++; j--; - } - if ( i == nBoard ) - won = TRUE; - } + if ( !won ) { // check diagonal bottom left + int j = nBoard-1; // to top right + int i = 0; + t = a->at(i+j*nBoard); + if ( t != TicTacButton::Blank ) { + i++; j--; + while ( i<nBoard && a->at(i+j*nBoard) == t ) { + i++; j--; + } + if ( i == nBoard ) + won = TRUE; + } } - if ( !won ) // no winner - t = 0; + if ( !won ) // no winner + t = 0; return t; @@ -241,3 +242,3 @@ void TicTacGameBoard::computerMove() int numButtons = nBoard*nBoard; - int *altv = new int[numButtons]; // buttons alternatives + int *altv = new int[numButtons]; // buttons alternatives int altc = 0; @@ -246,32 +247,32 @@ void TicTacGameBoard::computerMove() int i; - for ( i=0; i<numButtons; i++ ) { // try all positions - if ( a[i] != TicTacButton::Blank ) // already a piece there - continue; - a[i] = TicTacButton::Cross; // test if computer wins - if ( checkBoard(&a) == a[i] ) { // computer will win - st = ComputerWon; - stopHuman = -1; - break; - } - a[i] = TicTacButton::Circle; // test if human wins - if ( checkBoard(&a) == a[i] ) { // oops... - stopHuman = i; // remember position - a[i] = TicTacButton::Blank; // restore button - continue; // computer still might win - } - a[i] = TicTacButton::Blank; // restore button - altv[altc++] = i; // remember alternative + for ( i=0; i<numButtons; i++ ) { // try all positions + if ( a[i] != TicTacButton::Blank ) // already a piece there + continue; + a[i] = TicTacButton::Cross; // test if computer wins + if ( checkBoard(&a) == a[i] ) { // computer will win + st = ComputerWon; + stopHuman = -1; + break; + } + a[i] = TicTacButton::Circle; // test if human wins + if ( checkBoard(&a) == a[i] ) { // oops... + stopHuman = i; // remember position + a[i] = TicTacButton::Blank; // restore button + continue; // computer still might win + } + a[i] = TicTacButton::Blank; // restore button + altv[altc++] = i; // remember alternative } - if ( stopHuman >= 0 ) // must stop human from winning - a[stopHuman] = TicTacButton::Cross; - else if ( i == numButtons ) { // tried all alternatives - if ( altc > 0 ) // set random piece - a[altv[rand()%(altc--)]] = TicTacButton::Cross; - if ( altc == 0 ) { // no more blanks - st = NobodyWon; - emit finished(); - } + if ( stopHuman >= 0 ) // must stop human from winning + a[stopHuman] = TicTacButton::Cross; + else if ( i == numButtons ) { // tried all alternatives + if ( altc > 0 ) // set random piece + a[altv[rand()%(altc--)]] = TicTacButton::Cross; + if ( altc == 0 ) { // no more blanks + st = NobodyWon; + emit finished(); + } } - *btArray = a; // update model - updateButtons(); // update buttons + *btArray = a; // update model + updateButtons(); // update buttons delete[] altv; @@ -290,3 +291,3 @@ void TicTacGameBoard::computerMove() TicTacToe::TicTacToe( int boardSize, QWidget *parent, const char *name ) - : QWidget( parent, name ) + : QWidget( parent, name ) { @@ -294,3 +295,3 @@ TicTacToe::TicTacToe( int boardSize, QWidget *parent, const char *name ) - // Create a message label + // Create a message label @@ -301,4 +302,4 @@ TicTacToe::TicTacToe( int boardSize, QWidget *parent, const char *name ) - // Create the game board and connect the signal finished() to this - // gameOver() slot + // Create the game board and connect the signal finished() to this + // gameOver() slot @@ -308,3 +309,3 @@ TicTacToe::TicTacToe( int boardSize, QWidget *parent, const char *name ) - // Create a horizontal frame line + // Create a horizontal frame line @@ -314,4 +315,4 @@ TicTacToe::TicTacToe( int boardSize, QWidget *parent, const char *name ) - // Create the combo box for deciding who should start, and - // connect its clicked() signals to the buttonClicked() slot + // Create the combo box for deciding who should start, and + // connect its clicked() signals to the buttonClicked() slot @@ -322,4 +323,4 @@ TicTacToe::TicTacToe( int boardSize, QWidget *parent, const char *name ) - // Create the push buttons and connect their clicked() signals - // to this right slots. + // Create the push buttons and connect their clicked() signals + // to this right slots. @@ -333,3 +334,3 @@ TicTacToe::TicTacToe( int boardSize, QWidget *parent, const char *name ) b->addWidget( quit ); -showMaximized(); + showMaximized(); newState(); @@ -339,3 +340,3 @@ showMaximized(); // -------------------------------------------------------------------------- -// TicTacToe::newGameClicked() - SLOT +// TicTacToe::newGameClicked() - SLOT // @@ -353,3 +354,3 @@ void TicTacToe::newGameClicked() // -------------------------------------------------------------------------- -// TicTacToe::gameOver() - SLOT +// TicTacToe::gameOver() - SLOT // @@ -361,3 +362,3 @@ void TicTacToe::gameOver() { - newState(); // update text box + newState(); // update text box } @@ -371,5 +372,8 @@ void TicTacToe::newState() { - static const char *msg[] = { // TicTacGameBoard::State texts - "Click Play to start", "Make your move", - "You won!", "Computer won!", "It's a draw" }; + QStringList msg; + msg << tr( "Click Play to start") + << tr("Make your move") + << tr("You won!") + << tr("Computer won!") + << tr("It's a draw"); message->setText( msg[board->state()] ); |