Home | | Syllabus | | Assignments | | Lectures | | Resources
//********************************************************
// board.cc
// Author: A good solution writer
// Date: April 11, 2014
// Class: CSCI 131 project4, Professor Royden
// Purpose: Defines board functions to play tic tac toe.
// Functions to clear the board, print the board
// Place a marker on a position and determine the winner
// Input: (from keyboard) Location to place a marker on the board.
// Output: (to monitor) Playing board and who has wone (if game over)
//********************************************************
#include <iostream>
#include "board.h"
using namespace std;
//*************************************************************************
// void ClearBoard(board playingBoard)
// Purpose: Places a space character in each board location
// Input: None
// Output: None
// Pre: None
// Post: Every position in the playing board has a space value
//************************************************************************
void ClearBoard( /*in out*/ board playingBoard){
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++){
playingBoard[i][j] = ' ';
} //end for each column
} //end for each row
} //end ClearBoard( )
//*************************************************************************
// void GetSpot(board playingBoard, char which)
// Purpose: Gets row and column for move from current player (repeatedly
// if move not legal) and places the current player's marker there.
// Input: (from keyboard) row and column for move
// Output:(to monitor) prompts to user for row and column
// Pre: Game is in progress and is not done
// Post: Player's mark has been placed for a legal move
//************************************************************************
void GetSpot( /*in out*/ board playingBoard, /*in*/ char which) {
int good = 0; //0 if move not good, 1 otherwise
int row; //row position for move
int col; //column position for move
while(!good) {
good = 1;
//Get row and column from player
cout << "Player " << which
<< " - please enter a row and column number for your move ==> ";
cin >> row >> col;
cout << row << " " << col << endl;
//Check for illegal move
if ((row < 1) || (row > 3)){
cout << "Illegal row number. Please enter again." << endl< 3)){
cout << "Illegal column number. Please enter again." << endl << endl;
good = 0;
} //end if column out of range
else if (playingBoard[row-1][col-1] != ' ') {
cout << "This spot is already taken. " << endl;
cout << "Please enter a different spot." << endl << endl;
good = 0;
} //end if already a marker in position
else {
playingBoard[row-1][col-1] = which;
good = 1;
} //end else (move is legal)
} //end while move not good
} //end GetSpot( )
//*************************************************************************
// void PrintBoard(board playingBoard)
// Purpose: Prints the playing board in the current state
// Input: None
// Output: (to Monitor) playing board with all values in each position
// Pre: None
// Post: The playing board has been printed to the monitor
//************************************************************************
void PrintBoard( /*in*/ board playingBoard) {
cout << endl;
for (int i = 0; i < 3; i++) {
cout << " -------------" << endl;
cout << " ";
for (int j = 0; j < 3; j++ ) {
cout << "| " << playingBoard[i][j] << " ";
} //end for each column
cout << "|" << endl;
} //end for each row
cout << " -------------" << endl << endl;
} //end PrintBoard( )
//*************************************************************************
// void DetermineWinner( board playingBoard, int& done, int& Xwins,
// int& Owins, int& draws)
// Purpose: Determines whether a player has won the game or whether it
// is a draw. Increments statistics variables appropriately
// Input: None
// Output: (to monitor) Player who has one or statement that the game is
// a draw, if applicable.
// Pre: Game is in progress
// Post: Winner has been determined, statistics variables updated
// appropriately and done set to 1 if game is done.
//************************************************************************
void DetermineWinner( /*in*/ board playingBoard, /*out*/ int& done,
/*in out*/ int& Xwins,
/*in out*/ int& Owins, /*in out */ int& draws) {
char which = 'N'; //Player who wins
done = 0; //0 if game not done, 1 otherwise
for (int i = 0; i < 3; i++) {
if ((playingBoard[i][0] != ' ') &&
(playingBoard[i][0] == playingBoard[i][1])&&
(playingBoard[i][0] == playingBoard[i][2])){
which = playingBoard[i][0];
done = 1;
} //end if horizontal three-in-a-row
else if ((playingBoard[0][i] != ' ') &&
(playingBoard[0][i] == playingBoard[1][i] ) &&
(playingBoard[0][i] == playingBoard[2][i])) {
which = playingBoard[0][i];
done = 1;
}//end if vertical three-in-a-row
} // end for each row and column
if (!done) {
if ((playingBoard[0][0] != ' ') &&
(playingBoard[0][0] == playingBoard[1][1]) &&
(playingBoard[0][0] == playingBoard[2][2])) {
which = playingBoard[0][0];
done = 1;
} //end if diagonal three-in-a-row
else if ((playingBoard[0][2] != ' ') &&
(playingBoard[0][2] == playingBoard[1][1]) &&
(playingBoard[0][2] == playingBoard[2][0])) {
which = playingBoard[0][2];
done = 1;
} //end if other diagonal three-in-a-row
} //end if game not done
if (done) {
cout << "Player " << which << " is the winner!" << endl;
if (which == 'X') {
Xwins++;
} //end if player 'X' wins
else {
Owins++;
} //end else (player 'O' wins)
} //end if game done
else {
//check if any spaces left
done = 1;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (playingBoard[i][j] == ' ')
done = 0;
} //end for each column
} //end for each row
if (done) {
cout << "The game is a draw. " << endl;
draws++;
} //end if game done (its a draw)
} //end else (no three-in-a-row)
} //end DetermineWinner( )
Home | | Syllabus | | Assignments | | Lectures | | Resources
Constance Royden--croyden@cs.holycross.edu
CSCI 131: Techniques of Programming
Last Modified: April 11, 2014
Page Expires: August 15, 2014