0
#include <iostream>
#include <vector>

using namespace std;

// global constants
const char X = 'X';
const char O = 'O';
const char EMPTY = ' ';
const char TIE = 'T';
const char NO_ONE = 'N';

// game function's prototypes
void displayBoard(const vector<char>& board); // function that displays the game board
char choosePiece(); // function to let the user choose their pieces
char winner(const vector<char>& board); // determines the game winner
char firstMove(const char& player1, const char& player2); // function that determines who makes the first move
int playerOneMove(const vector<char>& board, const char player1); // returns the move of player1
int playerTwoMove(const vector<char>& board, const char player2); // returns the move of player2

int main()
{
	// vector that holds the game board
	vector<char> board(9, EMPTY); // there are only 9 positions in a tic-tac-toe board so a vector with 9 elements is fine
	//and initialized all elements with the EMPTY char

	// show the instructions
	// this is how the board would look like
	cout << "\n\n" << 0 << " | " << 1 << " | " << 2 << endl;
	cout << "---------" << endl;
	cout << 3 << " | " << 4 << " | " << 5 << endl;
	cout << "---------" << endl;
	cout << 6 << " | " << 7 << " | " << 8 << endl;

	cout << "\n\nThe above is the game board" << endl;
	cout << "To put your piece in the center of the game board, enter number 4."
	 	 << "\nTo put your piece elsewhere in the board, then enter its corresponding position"
	 	 << "\nnumber as illustrated in the diagram above" << endl;



	char player1, player2;
	player1 = choosePiece();

	// player1 has chosen its piece now chose the opposite piece of player1 for player2
	if (player1 == 'X')
	{
		player2 = 'O';
	}
	else {
		player2 = 'X';
	}

	cout << "\n\nPlayer 1's piece is " << player1 << endl;
	cout << "Player 2's piece is " << player2 << endl;

	char turn; // variable to store whose turn it is

	turn = firstMove(player1, player2); // who goes first, returns either X or O

	cout << "\n\nGood luck to both of the players!" << endl;

	// while nobody has one the game and its not a tie
	while (winner(board) == NO_ONE)
	{
		int move;
		
		displayBoard(board);
		
		if (turn == player1)
		{
			move = playerOneMove(board, player1);
			board[move] = player1;
			turn = player2;
		}
		else
		{
			move = playerTwoMove(board, player2);
			board[move] = player2;
			turn = player1;
		}
	}
	
	displayBoard(board);
	cin.ignore();
	cout << "\n\nPress Enter...";
	cin.get();
	cout << "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n" << endl;	
	cout << "\n                              " << winner(board) << " has won the game!" << endl;
	cin.ignore();
	cout << "Press Enter to Exit...";
	cin.get();
}

void displayBoard(const vector<char>& board)
{
	cout << "\n\n" << board[0] << " | " << board[1] << " | " << board[2] << endl;
	cout << "---------" << endl;
	cout << board[3] << " | " << board[4] << " | " << board[5] << endl;
	cout << "---------" << endl;
	cout << board[6] << " | " << board[7] << " | " << board[8] << endl;

}

char choosePiece()
{
	cout << "\n\nPiece 1 = X" << endl;
	cout << "Piece 2 = O" << endl;

	char piece;

	cout << "Enter a number to choose your piece [1-2]: " << endl;
	cin >> piece;

	if (piece == '1')
	{
		return X;
	}
	else {
		return O;
	}
}

char winner(const vector<char>& board)
{
	// multi-dimensional array that holds all possible winning rows
	int WINNING_ROWS[8][3] = { {0, 1, 2},
							   {3, 4, 5},
							   {6, 7, 8},
							   {0, 3, 6},
							   {1, 4, 7},
							   {2, 5, 8},
							   {0, 4, 8},
							   {2, 4, 6} };

	const int TOTAL_ROWS = 8; // there are only 8 possible winning rows

	// check to see if any winning row has three values that are the same and not empty
	// then we have a winner and return the value of that row ( either X or O )
	for (int i = 0; i < TOTAL_ROWS; i++)
	{
		if (board[WINNING_ROWS[i][0]] != EMPTY &&
			board[WINNING_ROWS[i][0]] == board[WINNING_ROWS[i][1]] &&
			board[WINNING_ROWS[i][1]] == board[WINNING_ROWS[i][2]])
			{
				return board[WINNING_ROWS[i][0]];
			}
	}

	// since no body has won, check for a tie, that is there are no empty squares left
	const int NUM_OF_POSITIONS = 9; // number of square in the game board
	int emptyPositions = 0;

	for (int i = 0; i < NUM_OF_POSITIONS; i++)
	{
		if (board[i] == EMPTY)
		{
			emptyPositions++;
		}
	}

	// if there are no empty positions left in the board then the game is a tie
	if (emptyPositions == 0)
	{
		return TIE;
	}
	else {
		return NO_ONE; // it's neither a tie nor any player has won the game yet, the game is still remaining
	}
}

char firstMove(const char& player1, const char& player2)
{
	char move;

	cout << "\n\nWho will make the first move? " << player1 << " or " << player2 << " ?" << endl;
	cout << "Enter "<< player1 << " or " << player2 << " : ";
	cin >> move;



	return toupper(move);
}

int playerOneMove(const vector<char>& board, const char player1)
{
	int move;
	bool done = false;
	while (done != true)
	{
		cout << "\n" << player1 << " has to make the move" << endl;
		cout << "Where will you move?" << " (0-" << board.size() - 1 << "): ";

		// Proceed only if input succeeds
		if (cin >> move)
		{
			// if the move is less than zero or move is greater than 8 then print error message
			// if move is 0 then it is not less than zero so no error, same goes for when move is 8
			if (move < 0 || move > 8)
			{
				cout << "\n!!! No such move exists - try again !!!" << endl;
				displayBoard(board);
			}
			// check if that move is legal, that is it is not filled with X or O
			else if (board[move] != EMPTY)
			{
				cout << "\n!!! Place is taken - choose another position !!!" << endl;
				displayBoard(board);
			}
			// if none of the if...else statements above are executed
			// then initialize done with true value so that the for loop could execute
			else
			{
				done = true;
			}
		}
		else
		{
			cout << "\n!!! WRONG INPUT !!!" << endl;
		}

	}
	return move;
}

int playerTwoMove(const vector<char>& board, const char player2)
{
	int move;
	bool done = false;
	while ( done != true )
	{
		cout << "\n" << player2 << " has to make the move" << endl;
		cout << "Where will you move?" << " (0-" << board.size() - 1 << "): ";
		
		// Proceed only if input succeeds
		if (cin >> move)
		{
		
			// if the move is less than zero or move is greater than 8 then print error message
			// if move is 0 then it is not less than zero so no error, same goes for when move is 8
			if (move < 0 || move > 8)
			{
				cout << "\n!!! No such move exists - try again !!!" << endl;
				displayBoard(board);
			}
			// check if that move is legal, that is it is not filled with X or O
			else if (board[move] != EMPTY)
			{
				cout << "\n!!! Place is taken - choose another position !!!" << endl;
				displayBoard(board);
			}
			// if none of the if...else statements above are executed
			// then initialize done with true value so that the for loop could execute
			else
			{
				done = true;
			}
		}
		else
		{
			cout << "\n!!! WRONG INPUT !!!" << endl;
		}
	}
	return move;
}

In the last two functions, (both are the same)

When it asks for input, if one enters anything else than integer like an alphabet it starts looping infinitely?

What am I doing wrong here ?

2
Contributors
1
Reply
2
Views
9 Years
Discussion Span
Last Post by Ancient Dragon
This topic has been dead for over six months. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.