-rw-r--r-- | noncore/games/tictac/tictac.cpp | 2 |
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 | |||
@@ -1,378 +1,380 @@ | |||
1 | /**************************************************************************** | 1 | /**************************************************************************** |
2 | ** tictac.cpp,v 1.3.8.1 2003/08/29 06:50:40 harlekin Exp | 2 | ** tictac.cpp,v 1.3.8.1 2003/08/29 06:50:40 harlekin Exp |
3 | ** | 3 | ** |
4 | ** Copyright (C) 1992-2000 Trolltech AS. All rights reserved. | 4 | ** Copyright (C) 1992-2000 Trolltech AS. All rights reserved. |
5 | ** | 5 | ** |
6 | ** This file is part of an example program for Qt. This example | 6 | ** This file is part of an example program for Qt. This example |
7 | ** program may be used, distributed and modified without limitation. | 7 | ** program may be used, distributed and modified without limitation. |
8 | ** | 8 | ** |
9 | *****************************************************************************/ | 9 | *****************************************************************************/ |
10 | 10 | ||
11 | #include "tictac.h" | 11 | #include "tictac.h" |
12 | #include <qpe/qpeapplication.h> | 12 | #include <qpe/qpeapplication.h> |
13 | #include <qdrawutil.h> | 13 | #include <qdrawutil.h> |
14 | #include <qcombobox.h> | 14 | #include <qcombobox.h> |
15 | #include <qlabel.h> | 15 | #include <qlabel.h> |
16 | #include <qlayout.h> | 16 | #include <qlayout.h> |
17 | #include <stdlib.h> // rand() function | 17 | #include <stdlib.h> // rand() function |
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 | ||
28 | TicTacButton::TicTacButton( QWidget *parent ) : QPushButton( parent ) | 28 | TicTacButton::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 | ||
37 | void TicTacButton::drawButtonLabel( QPainter *p ) | 37 | void 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 | ||
59 | TicTacGameBoard::TicTacGameBoard( int n, QWidget *parent, const char *name ) | 59 | TicTacGameBoard::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 | ||
84 | TicTacGameBoard::~TicTacGameBoard() | 85 | TicTacGameBoard::~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 | ||
97 | void TicTacGameBoard::computerStarts( bool v ) | 98 | void 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 | ||
109 | void TicTacGameBoard::newGame() | 110 | void 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 | ||
128 | void TicTacGameBoard::buttonClicked() | 129 | void 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 | } |
146 | 147 | ||
147 | 148 | ||
148 | // -------------------------------------------------------------------------- | 149 | // -------------------------------------------------------------------------- |
149 | // TicTacGameBoard::updateButtons() | 150 | // TicTacGameBoard::updateButtons() |
150 | // | 151 | // |
151 | // Updates all buttons that have changed state | 152 | // Updates all buttons that have changed state |
152 | // | 153 | // |
153 | 154 | ||
154 | void TicTacGameBoard::updateButtons() | 155 | void TicTacGameBoard::updateButtons() |
155 | { | 156 | { |
156 | for ( int i=0; i<nBoard*nBoard; i++ ) { | 157 | for ( int i=0; i<nBoard*nBoard; i++ ) { |
157 | if ( buttons->at(i)->type() != btArray->at(i) ) | 158 | if ( buttons->at(i)->type() != btArray->at(i) ) |
158 | buttons->at(i)->setType( (TicTacButton::Type)btArray->at(i) ); | 159 | buttons->at(i)->setType( (TicTacButton::Type)btArray->at(i) ); |
159 | buttons->at(i)->setEnabled( buttons->at(i)->type() == | 160 | buttons->at(i)->setEnabled( buttons->at(i)->type() == |
160 | TicTacButton::Blank ); | 161 | TicTacButton::Blank ); |
161 | } | 162 | } |
162 | } | 163 | } |
163 | 164 | ||
164 | 165 | ||
165 | // -------------------------------------------------------------------------- | 166 | // -------------------------------------------------------------------------- |
166 | // TicTacGameBoard::checkBoard() | 167 | // TicTacGameBoard::checkBoard() |
167 | // | 168 | // |
168 | // Checks if one of the players won the game, works for any board size. | 169 | // Checks if one of the players won the game, works for any board size. |
169 | // | 170 | // |
170 | // Returns: | 171 | // Returns: |
171 | // - TicTacButton::Cross if the player with X buttons won | 172 | // - TicTacButton::Cross if the player with X buttons won |
172 | // - TicTacButton::Circle if the player with O buttons won | 173 | // - TicTacButton::Circle if the player with O buttons won |
173 | // - Zero (0) if there is no winner yet | 174 | // - Zero (0) if there is no winner yet |
174 | // | 175 | // |
175 | 176 | ||
176 | int TicTacGameBoard::checkBoard( TicTacArray *a ) | 177 | int TicTacGameBoard::checkBoard( TicTacArray *a ) |
177 | { | 178 | { |
178 | int t = 0; | 179 | int t = 0; |
179 | int row, col; | 180 | int row, col; |
180 | bool won = FALSE; | 181 | bool won = FALSE; |
181 | for ( row=0; row<nBoard && !won; row++ ) { // check horizontal | 182 | for ( row=0; row<nBoard && !won; row++ ) { // check horizontal |
182 | t = a->at(row*nBoard); | 183 | t = a->at(row*nBoard); |
183 | if ( t == TicTacButton::Blank ) | 184 | if ( t == TicTacButton::Blank ) |
184 | continue; | 185 | continue; |
185 | col = 1; | 186 | col = 1; |
186 | while ( col<nBoard && a->at(row*nBoard+col) == t ) | 187 | while ( col<nBoard && a->at(row*nBoard+col) == t ) |
187 | col++; | 188 | col++; |
188 | if ( col == nBoard ) | 189 | if ( col == nBoard ) |
189 | won = TRUE; | 190 | won = TRUE; |
190 | } | 191 | } |
191 | for ( col=0; col<nBoard && !won; col++ ) { // check vertical | 192 | for ( col=0; col<nBoard && !won; col++ ) { // check vertical |
192 | t = a->at(col); | 193 | t = a->at(col); |
193 | if ( t == TicTacButton::Blank ) | 194 | if ( t == TicTacButton::Blank ) |
194 | continue; | 195 | continue; |
195 | row = 1; | 196 | row = 1; |
196 | while ( row<nBoard && a->at(row*nBoard+col) == t ) | 197 | while ( row<nBoard && a->at(row*nBoard+col) == t ) |
197 | row++; | 198 | row++; |
198 | if ( row == nBoard ) | 199 | if ( row == nBoard ) |
199 | won = TRUE; | 200 | won = TRUE; |
200 | } | 201 | } |
201 | if ( !won ) { // check diagonal top left | 202 | if ( !won ) { // check diagonal top left |
202 | t = a->at(0); // to bottom right | 203 | t = a->at(0); // to bottom right |
203 | if ( t != TicTacButton::Blank ) { | 204 | if ( t != TicTacButton::Blank ) { |
204 | int i = 1; | 205 | int i = 1; |
205 | while ( i<nBoard && a->at(i*nBoard+i) == t ) | 206 | while ( i<nBoard && a->at(i*nBoard+i) == t ) |
206 | i++; | 207 | i++; |
207 | if ( i == nBoard ) | 208 | if ( i == nBoard ) |
208 | won = TRUE; | 209 | won = TRUE; |
209 | } | 210 | } |
210 | } | 211 | } |
211 | if ( !won ) { // check diagonal bottom left | 212 | if ( !won ) { // check diagonal bottom left |
212 | int j = nBoard-1; // to top right | 213 | int j = nBoard-1; // to top right |
213 | int i = 0; | 214 | int i = 0; |
214 | t = a->at(i+j*nBoard); | 215 | t = a->at(i+j*nBoard); |
215 | if ( t != TicTacButton::Blank ) { | 216 | if ( t != TicTacButton::Blank ) { |
216 | i++; j--; | 217 | i++; j--; |
217 | while ( i<nBoard && a->at(i+j*nBoard) == t ) { | 218 | while ( i<nBoard && a->at(i+j*nBoard) == t ) { |
218 | i++; j--; | 219 | i++; j--; |
219 | } | 220 | } |
220 | if ( i == nBoard ) | 221 | if ( i == nBoard ) |
221 | won = TRUE; | 222 | won = TRUE; |
222 | } | 223 | } |
223 | } | 224 | } |
224 | if ( !won ) // no winner | 225 | if ( !won ) // no winner |
225 | t = 0; | 226 | t = 0; |
226 | return t; | 227 | return t; |
227 | } | 228 | } |
228 | 229 | ||
229 | 230 | ||
230 | // -------------------------------------------------------------------------- | 231 | // -------------------------------------------------------------------------- |
231 | // TicTacGameBoard::computerMove() | 232 | // TicTacGameBoard::computerMove() |
232 | // | 233 | // |
233 | // Puts a piece on the game board. Very, very simple. | 234 | // Puts a piece on the game board. Very, very simple. |
234 | // | 235 | // |
235 | 236 | ||
236 | void TicTacGameBoard::computerMove() | 237 | void TicTacGameBoard::computerMove() |
237 | { | 238 | { |
238 | int numButtons = nBoard*nBoard; | 239 | int numButtons = nBoard*nBoard; |
239 | int *altv = new int[numButtons]; // buttons alternatives | 240 | int *altv = new int[numButtons]; // buttons alternatives |
240 | int altc = 0; | 241 | int altc = 0; |
241 | int stopHuman = -1; | 242 | int stopHuman = -1; |
242 | TicTacArray a = btArray->copy(); | 243 | TicTacArray a = btArray->copy(); |
243 | int i; | 244 | int i; |
244 | for ( i=0; i<numButtons; i++ ) { // try all positions | 245 | for ( i=0; i<numButtons; i++ ) { // try all positions |
245 | if ( a[i] != TicTacButton::Blank ) // already a piece there | 246 | if ( a[i] != TicTacButton::Blank ) // already a piece there |
246 | continue; | 247 | continue; |
247 | a[i] = TicTacButton::Cross; // test if computer wins | 248 | a[i] = TicTacButton::Cross; // test if computer wins |
248 | if ( checkBoard(&a) == a[i] ) { // computer will win | 249 | if ( checkBoard(&a) == a[i] ) { // computer will win |
249 | st = ComputerWon; | 250 | st = ComputerWon; |
250 | stopHuman = -1; | 251 | stopHuman = -1; |
251 | break; | 252 | break; |
252 | } | 253 | } |
253 | a[i] = TicTacButton::Circle; // test if human wins | 254 | a[i] = TicTacButton::Circle; // test if human wins |
254 | if ( checkBoard(&a) == a[i] ) { // oops... | 255 | if ( checkBoard(&a) == a[i] ) { // oops... |
255 | stopHuman = i; // remember position | 256 | stopHuman = i; // remember position |
256 | a[i] = TicTacButton::Blank; // restore button | 257 | a[i] = TicTacButton::Blank; // restore button |
257 | continue; // computer still might win | 258 | continue; // computer still might win |
258 | } | 259 | } |
259 | a[i] = TicTacButton::Blank; // restore button | 260 | a[i] = TicTacButton::Blank; // restore button |
260 | altv[altc++] = i; // remember alternative | 261 | altv[altc++] = i; // remember alternative |
261 | } | 262 | } |
262 | if ( stopHuman >= 0 ) // must stop human from winning | 263 | if ( stopHuman >= 0 ) // must stop human from winning |
263 | a[stopHuman] = TicTacButton::Cross; | 264 | a[stopHuman] = TicTacButton::Cross; |
264 | else if ( i == numButtons ) { // tried all alternatives | 265 | else if ( i == numButtons ) { // tried all alternatives |
265 | if ( altc > 0 ) // set random piece | 266 | if ( altc > 0 ) // set random piece |
266 | a[altv[rand()%(altc--)]] = TicTacButton::Cross; | 267 | a[altv[rand()%(altc--)]] = TicTacButton::Cross; |
267 | if ( altc == 0 ) { // no more blanks | 268 | if ( altc == 0 ) { // no more blanks |
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 | ||
287 | TicTacToe::TicTacToe( QWidget *parent, const char *name, WFlags fl ) | 288 | TicTacToe::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 | ||
343 | void TicTacToe::newGameClicked() | 345 | void 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 | ||
358 | void TicTacToe::gameOver() | 360 | void 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 | ||
368 | void TicTacToe::newState() | 370 | void 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 | } |