#include #include "mywidget.h" //constructor! MyWidget::MyWidget() { //Setup GUI objects QGridLayout *layout = new QGridLayout; signalMapper = new QSignalMapper(this); for(int i = 0; i < 9; i++){ //setup this row on the board board[i] = 0; gameButton[i] = new QPushButton(""); //Add button to layout layout->addWidget(gameButton[i],i / 3,i % 3); //setup signal mapper for this button connect(gameButton[i],SIGNAL(clicked()),signalMapper,SLOT(map())); signalMapper->setMapping(gameButton[i], i); } connect(signalMapper,SIGNAL(mapped(int)),this,SLOT(moveMade(int))); setLayout(layout); playerOneTurn = true; } //moveMade slot handler void MyWidget::moveMade(int location) { QString displayMessage(""); if(board[location] != 0){ QTextStream(stdout) << "That spot has already been taken, try again\n"; displayMessage = "That spot has already been taken, try again"; } else { if(playerOneTurn){ board[location] = 1; gameButton[location]->setText("X"); playerOneTurn = false; } else { board[location] = -1; gameButton[location]->setText("O"); playerOneTurn = true; } } switch(checkWinner()){ case -1: reset(); //reset game displayMessage = "Cat has won the game :("; break; case 1: reset(); //reset game displayMessage = "Player one has won the game!"; break; case 2: reset(); //reset game displayMessage = "Player two has won the game!"; break; } if(displayMessage != "") QMessageBox::information(this,"Tic Tac Toe - Qt",displayMessage,"ok"); } //returns 1 or 2 if a player one, -1 if cat won, and 0 if game is still in play int MyWidget::checkWinner() { int i; //Ill be using this in a lot of loops int value; //used for adding rows, cols, etc int winner = -1; // -1 for cat, if its not a cat game this will be changed //check to see if game is over (I.E. No moves left) for(i = 0; i < 9; i++){ if(board[i] == 0){ winner = 0; //Game is not over! keep playing } } //check rows for winner for(i = 0; i < 9; i += 3){ value = board[i] + board[i+1] + board[i+2]; if(value == 3) winner = 1; //player one won! if(value == -3) winner = 2; //player two won! } //check cols for a winner for(i = 0; i <= 3; i++){ value = board[i] + board[i+3] + board[i+6]; if(value == 3) winner = 1; //player one won! if(value == -3) winner = 2; //player two won! } //check for wins not in cols or rows value = board[0] + board[4] + board[8]; //top left, middle, bottom right if(value == 3) winner = 1; //player one won! if(value == -3) winner = 2; //player two won! value = board[2] + board[4] + board[6]; //top right, middle, bottom left if(value == 3) winner = 1; //player one won! if(value == -3) winner = 2; //player two won! //return return winner; } //resets the game! void MyWidget::reset() { playerOneTurn = true; for(int i = 0; i < 9; i++){ //reset all the values board[i] = 0; gameButton[i]->setText(""); } }