summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/games/tictac/tictac.cpp2
1 files changed, 2 insertions, 0 deletions
diff --git a/noncore/games/tictac/tictac.cpp b/noncore/games/tictac/tictac.cpp
index 12ce35f..db8ee1e 100644
--- a/noncore/games/tictac/tictac.cpp
+++ b/noncore/games/tictac/tictac.cpp
@@ -18,128 +18,129 @@
18 18
19 19
20//*************************************************************************** 20//***************************************************************************
21//* TicTacButton member functions 21//* TicTacButton member functions
22//*************************************************************************** 22//***************************************************************************
23 23
24// -------------------------------------------------------------------------- 24// --------------------------------------------------------------------------
25// Creates a TicTacButton 25// Creates a TicTacButton
26// 26//
27 27
28TicTacButton::TicTacButton( QWidget *parent ) : QPushButton( parent ) 28TicTacButton::TicTacButton( QWidget *parent ) : QPushButton( parent )
29{ 29{
30 t = Blank; // initial type 30 t = Blank; // initial type
31} 31}
32 32
33// -------------------------------------------------------------------------- 33// --------------------------------------------------------------------------
34// Paints TicTacButton 34// Paints TicTacButton
35// 35//
36 36
37void TicTacButton::drawButtonLabel( QPainter *p ) 37void TicTacButton::drawButtonLabel( QPainter *p )
38{ 38{
39 QRect r = rect(); 39 QRect r = rect();
40 p->setPen( QPen( white,2 ) ); // set fat pen 40 p->setPen( QPen( white,2 ) ); // set fat pen
41 if ( t == Circle ) { 41 if ( t == Circle ) {
42 p->drawEllipse( r.left()+4, r.top()+4, r.width()-8, r.height()-8 ); 42 p->drawEllipse( r.left()+4, r.top()+4, r.width()-8, r.height()-8 );
43 } else if ( t == Cross ) { // draw cross 43 } else if ( t == Cross ) { // draw cross
44 p->drawLine( r.topLeft() +QPoint(4,4), r.bottomRight()-QPoint(4,4)); 44 p->drawLine( r.topLeft() +QPoint(4,4), r.bottomRight()-QPoint(4,4));
45 p->drawLine( r.bottomLeft()+QPoint(4,-4),r.topRight() -QPoint(4,-4)); 45 p->drawLine( r.bottomLeft()+QPoint(4,-4),r.topRight() -QPoint(4,-4));
46 } 46 }
47} 47}
48 48
49 49
50//*************************************************************************** 50//***************************************************************************
51//* TicTacGameBoard member functions 51//* TicTacGameBoard member functions
52//*************************************************************************** 52//***************************************************************************
53 53
54// -------------------------------------------------------------------------- 54// --------------------------------------------------------------------------
55// Creates a game board with N x N buttons and connects the "clicked()" 55// Creates a game board with N x N buttons and connects the "clicked()"
56// signal of all buttons to the "buttonClicked()" slot. 56// signal of all buttons to the "buttonClicked()" slot.
57// 57//
58 58
59TicTacGameBoard::TicTacGameBoard( int n, QWidget *parent, const char *name ) 59TicTacGameBoard::TicTacGameBoard( int n, QWidget *parent, const char *name )
60 : QWidget( parent, name ) 60 : QWidget( parent, name )
61{ 61{
62 QPEApplication::showWidget( this ); 62 QPEApplication::showWidget( this );
63 st = Init; // initial state 63 st = Init; // initial state
64 nBoard = n; 64 nBoard = n;
65 n *= n; // make square 65 n *= n; // make square
66 comp_starts = FALSE; // human starts 66 comp_starts = FALSE; // human starts
67 buttons = new TicTacButtons(n); // create real buttons 67 buttons = new TicTacButtons(n); // create real buttons
68 btArray = new TicTacArray(n); // create button model 68 btArray = new TicTacArray(n); // create button model
69 QGridLayout * grid = new QGridLayout( this, 3, 3, 4 ); 69 QGridLayout * grid = new QGridLayout( this, 3, 3, 4 );
70 QPalette p( blue ); 70 QPalette p( blue );
71 for ( int i=0; i<n; i++ ) { // create and connect buttons 71 for ( int i=0; i<n; i++ ) { // create and connect buttons
72 TicTacButton *ttb = new TicTacButton( this ); 72 TicTacButton *ttb = new TicTacButton( this );
73 ttb->setPalette( p ); 73 ttb->setPalette( p );
74 ttb->setEnabled( FALSE ); 74 ttb->setEnabled( FALSE );
75 connect( ttb, SIGNAL(clicked()), SLOT(buttonClicked()) ); 75 connect( ttb, SIGNAL(clicked()), SLOT(buttonClicked()) );
76 grid->addWidget( ttb, i%3, i/3 ); 76 grid->addWidget( ttb, i%3, i/3 );
77 buttons->insert( i, ttb ); 77 buttons->insert( i, ttb );
78 btArray->at(i) = TicTacButton::Blank; // initial button type 78 btArray->at(i) = TicTacButton::Blank; // initial button type
79 } 79 }
80 QTime t = QTime::currentTime(); // set random seed 80 QTime t = QTime::currentTime(); // set random seed
81 srand( t.hour()*12+t.minute()*60+t.second()*60 ); 81 srand( t.hour()*12+t.minute()*60+t.second()*60 );
82
82} 83}
83 84
84TicTacGameBoard::~TicTacGameBoard() 85TicTacGameBoard::~TicTacGameBoard()
85{ 86{
86 delete buttons; 87 delete buttons;
87 delete btArray; 88 delete btArray;
88} 89}
89 90
90 91
91// -------------------------------------------------------------------------- 92// --------------------------------------------------------------------------
92// TicTacGameBoard::computerStarts( bool v ) 93// TicTacGameBoard::computerStarts( bool v )
93// 94//
94// Computer starts if v=TRUE. The human starts by default. 95// Computer starts if v=TRUE. The human starts by default.
95// 96//
96 97
97void TicTacGameBoard::computerStarts( bool v ) 98void TicTacGameBoard::computerStarts( bool v )
98{ 99{
99 comp_starts = v; 100 comp_starts = v;
100} 101}
101 102
102 103
103// -------------------------------------------------------------------------- 104// --------------------------------------------------------------------------
104// TicTacGameBoard::newGame() 105// TicTacGameBoard::newGame()
105// 106//
106// Clears the game board and prepares for a new game 107// Clears the game board and prepares for a new game
107// 108//
108 109
109void TicTacGameBoard::newGame() 110void TicTacGameBoard::newGame()
110{ 111{
111 st = HumansTurn; 112 st = HumansTurn;
112 for ( int i=0; i<nBoard*nBoard; i++ ) 113 for ( int i=0; i<nBoard*nBoard; i++ )
113 btArray->at(i) = TicTacButton::Blank; 114 btArray->at(i) = TicTacButton::Blank;
114 if ( comp_starts ) 115 if ( comp_starts )
115 computerMove(); 116 computerMove();
116 else 117 else
117 updateButtons(); 118 updateButtons();
118} 119}
119 120
120 121
121// -------------------------------------------------------------------------- 122// --------------------------------------------------------------------------
122// TicTacGameBoard::buttonClicked() - SLOT 123// TicTacGameBoard::buttonClicked() - SLOT
123// 124//
124// This slot is activated when a TicTacButton emits the signal "clicked()", 125// This slot is activated when a TicTacButton emits the signal "clicked()",
125// i.e. the user has clicked on a TicTacButton. 126// i.e. the user has clicked on a TicTacButton.
126// 127//
127 128
128void TicTacGameBoard::buttonClicked() 129void TicTacGameBoard::buttonClicked()
129{ 130{
130 if ( st != HumansTurn ) // not ready 131 if ( st != HumansTurn ) // not ready
131 return; 132 return;
132 int i = buttons->findRef( (TicTacButton*)sender() ); 133 int i = buttons->findRef( (TicTacButton*)sender() );
133 TicTacButton *b = buttons->at(i); // get piece that was pressed 134 TicTacButton *b = buttons->at(i); // get piece that was pressed
134 if ( b->type() == TicTacButton::Blank ) { // empty piece? 135 if ( b->type() == TicTacButton::Blank ) { // empty piece?
135 btArray->at(i) = TicTacButton::Circle; 136 btArray->at(i) = TicTacButton::Circle;
136 updateButtons(); 137 updateButtons();
137 if ( checkBoard( btArray ) == 0 ) // not a winning move? 138 if ( checkBoard( btArray ) == 0 ) // not a winning move?
138 computerMove(); 139 computerMove();
139 int s = checkBoard( btArray ); 140 int s = checkBoard( btArray );
140 if ( s ) { // any winners yet? 141 if ( s ) { // any winners yet?
141 st = s == TicTacButton::Circle ? HumanWon : ComputerWon; 142 st = s == TicTacButton::Circle ? HumanWon : ComputerWon;
142 emit finished(); 143 emit finished();
143 } 144 }
144 } 145 }
145} 146}
@@ -268,111 +269,112 @@ void TicTacGameBoard::computerMove()
268 st = NobodyWon; 269 st = NobodyWon;
269 emit finished(); 270 emit finished();
270 } 271 }
271 } 272 }
272 *btArray = a; // update model 273 *btArray = a; // update model
273 updateButtons(); // update buttons 274 updateButtons(); // update buttons
274 delete[] altv; 275 delete[] altv;
275} 276}
276 277
277 278
278//*************************************************************************** 279//***************************************************************************
279//* TicTacToe member functions 280//* TicTacToe member functions
280//*************************************************************************** 281//***************************************************************************
281 282
282// -------------------------------------------------------------------------- 283// --------------------------------------------------------------------------
283// Creates a game widget with a game board and two push buttons, and connects 284// Creates a game widget with a game board and two push buttons, and connects
284// signals of child widgets to slots. 285// signals of child widgets to slots.
285// 286//
286 287
287TicTacToe::TicTacToe( QWidget *parent, const char *name, WFlags fl ) 288TicTacToe::TicTacToe( QWidget *parent, const char *name, WFlags fl )
288 : QWidget( parent, name, fl ) 289 : QWidget( parent, name, fl )
289{ 290{
290 QVBoxLayout * l = new QVBoxLayout( this, 6 ); 291 QVBoxLayout * l = new QVBoxLayout( this, 6 );
291 292
292 // Create a message label 293 // Create a message label
293 boardSize = 3; 294 boardSize = 3;
294 295
295 message = new QLabel( this ); 296 message = new QLabel( this );
296 message->setFrameStyle( QFrame::WinPanel | QFrame::Sunken ); 297 message->setFrameStyle( QFrame::WinPanel | QFrame::Sunken );
297 message->setAlignment( AlignCenter ); 298 message->setAlignment( AlignCenter );
298 l->addWidget( message ); 299 l->addWidget( message );
299 300
300 // Create the game board and connect the signal finished() to this 301 // Create the game board and connect the signal finished() to this
301 // gameOver() slot 302 // gameOver() slot
302 303
303 board = new TicTacGameBoard( boardSize, this ); 304 board = new TicTacGameBoard( boardSize, this );
304 connect( board, SIGNAL(finished()), SLOT(gameOver()) ); 305 connect( board, SIGNAL(finished()), SLOT(gameOver()) );
305 l->addWidget( board ); 306 l->addWidget( board );
306 307
307 // Create a horizontal frame line 308 // Create a horizontal frame line
308 309
309 QFrame *line = new QFrame( this ); 310 QFrame *line = new QFrame( this );
310 line->setFrameStyle( QFrame::HLine | QFrame::Sunken ); 311 line->setFrameStyle( QFrame::HLine | QFrame::Sunken );
311 l->addWidget( line ); 312 l->addWidget( line );
312 313
313 // Create the combo box for deciding who should start, and 314 // Create the combo box for deciding who should start, and
314 // connect its clicked() signals to the buttonClicked() slot 315 // connect its clicked() signals to the buttonClicked() slot
315 316
316 whoStarts = new QComboBox( this ); 317 whoStarts = new QComboBox( this );
317 whoStarts->insertItem( tr( "Computer starts" ) ); 318 whoStarts->insertItem( tr( "Computer starts" ) );
318 whoStarts->insertItem( tr( "Human starts" ) ); 319 whoStarts->insertItem( tr( "Human starts" ) );
319 l->addWidget( whoStarts ); 320 l->addWidget( whoStarts );
320 321
321 // Create the push buttons and connect their clicked() signals 322 // Create the push buttons and connect their clicked() signals
322 // to this right slots. 323 // to this right slots.
323 324
324 newGame = new QPushButton( tr( "Play!" ), this ); 325 newGame = new QPushButton( tr( "Play!" ), this );
325 connect( newGame, SIGNAL(clicked()), SLOT(newGameClicked()) ); 326 connect( newGame, SIGNAL(clicked()), SLOT(newGameClicked()) );
326 quit = new QPushButton( tr( "Quit" ), this ); 327 quit = new QPushButton( tr( "Quit" ), this );
327 connect( quit, SIGNAL(clicked()), qApp, SLOT(quit()) ); 328 connect( quit, SIGNAL(clicked()), qApp, SLOT(quit()) );
328 QHBoxLayout * b = new QHBoxLayout; 329 QHBoxLayout * b = new QHBoxLayout;
329 l->addLayout( b ); 330 l->addLayout( b );
330 b->addWidget( newGame ); 331 b->addWidget( newGame );
331 b->addWidget( quit ); 332 b->addWidget( quit );
333 move(0,0);
332 QPEApplication::showWidget( this ); 334 QPEApplication::showWidget( this );
333 newState(); 335 newState();
334} 336}
335 337
336 338
337// -------------------------------------------------------------------------- 339// --------------------------------------------------------------------------
338// TicTacToe::newGameClicked() - SLOT 340// TicTacToe::newGameClicked() - SLOT
339// 341//
340// This slot is activated when the new game button is clicked. 342// This slot is activated when the new game button is clicked.
341// 343//
342 344
343void TicTacToe::newGameClicked() 345void TicTacToe::newGameClicked()
344{ 346{
345 board->computerStarts( whoStarts->currentItem() == 0 ); 347 board->computerStarts( whoStarts->currentItem() == 0 );
346 board->newGame(); 348 board->newGame();
347 newState(); 349 newState();
348} 350}
349 351
350 352
351// -------------------------------------------------------------------------- 353// --------------------------------------------------------------------------
352// TicTacToe::gameOver() - SLOT 354// TicTacToe::gameOver() - SLOT
353// 355//
354// This slot is activated when the TicTacGameBoard emits the signal 356// This slot is activated when the TicTacGameBoard emits the signal
355// "finished()", i.e. when a player has won or when it is a draw. 357// "finished()", i.e. when a player has won or when it is a draw.
356// 358//
357 359
358void TicTacToe::gameOver() 360void TicTacToe::gameOver()
359{ 361{
360 newState(); // update text box 362 newState(); // update text box
361} 363}
362 364
363 365
364// -------------------------------------------------------------------------- 366// --------------------------------------------------------------------------
365// Updates the message to reflect a new state. 367// Updates the message to reflect a new state.
366// 368//
367 369
368void TicTacToe::newState() 370void TicTacToe::newState()
369{ 371{
370 QStringList msg; 372 QStringList msg;
371 msg << tr( "Click Play to start") 373 msg << tr( "Click Play to start")
372 << tr("Make your move") 374 << tr("Make your move")
373 << tr("You won!") 375 << tr("You won!")
374 << tr("Computer won!") 376 << tr("Computer won!")
375 << tr("It's a draw"); 377 << tr("It's a draw");
376 message->setText( msg[board->state()] ); 378 message->setText( msg[board->state()] );
377 return; 379 return;
378} 380}