In: Computer Science
I am using C++
Write a program that allows two players to play a game of tic-tac-toe. Use a two-dimensional char array with three rows and three columns as the game board. Each element of the array should be initialized with an asterisk (*). The program should run a loop that does the following:
If a player wins, the program should immediately declare that player the winner and end. If a tie has occurred, the program should display an appropriate message and end. (You probably already know this, but just in case. Player 1 wins when there are three Xs in a row on the game board. The Xs can appear in a row, in a column, or diagonally across the board. Player 2 wins when there are three Os in a row on the game board. The Os can appear in a row, in a column, or diagonally across the board. A tie occurs when all of the locations on the board are full, but there is no winner.)
Note: Do not use global variables, except for global constants! You must create and use at least two functions, but are encouraged to modularize as much as possible. Each function must be named appropriately and obvious to what it does. The main function should have little more than an array for the board and call to the various functions. You should also define constants for the number of rows and columns and use them throughout the program. Make sure to check for valid input and ask again if necessary. Keep it simple and keep it clean! Here are some functions (not a complete list!) that I would suggest.
void displayBoard(char board[][COLS]); void playerTurn(char board[][COLS], char player); bool checkForWinner(char board[][COLS], char player); bool isBoardFull(char board[][COLS]); The output should look something like this -- user inputs are in bold blue type: Columns 1 2 3 Row 1: * * * Row 2: * * * Row 3: * * * Player X's turn. Enter a row and column to place an X. Row: 1 Column: 2 Columns 1 2 3 Row 1: * X * Row 2: * * * Row 3: * * * Player O's turn. Enter a row and column to place an O. Row: 1 Column: 2 That location is not available. Select another location. Row: 4 Invalid Row! Row: 2 Column: 3 Columns 1 2 3 Row 1: * X * Row 2: * * O Row 3: * * * Player X's turn. Enter a row and column to place an X. Row: 3 Column: 1 Columns 1 2 3 Row 1: * X * Row 2: * * O Row 3: X * * Player O's turn. Enter a row and column to place an O. Row: 2 Column: 1 Columns 1 2 3 Row 1: * X * Row 2: O * O Row 3: X * * Player X's turn. Enter a row and column to place an X. Row: 2 Column: 2 Columns 1 2 3 Row 1: * X * Row 2: O X O Row 3: X * * Player O's turn. Enter a row and column to place an O. Row: 1 Column: 3 Columns 1 2 3 Row 1: * X O Row 2: O X O Row 3: X * * Player X's turn. Enter a row and column to place an X. Row: 3 Column: 2 Columns 1 2 3 Row 1: * X O Row 2: O X O Row 3: X X * Player 1 (X) WINS!!!!!
Compile, run, and test your program. Make sure there are no errors
and it functions properly. You can hit [Ctrl or command]+[Shift]+B
to compile and run the program. Your program must run without
errors to get full credit! Commit and push (upload) your repo,
including your cpp file to GitHub for grading. It must be named
correctly and saved as a readable cpp file with the proper
extension.
#include <iostream>
using namespace std;
void initializeBoard(char board[][3]);
void displayBoard(char board[][3]);/*gets input from user returns character number of location chosen by user*/
void getInput(char board[][3], char marker,int& x,int& y);/* mark character marker of player on chosen character pos of board*/
void markBoard(char board[][3],int x,int y, char marker);/*checks to see if someone has won returns true or false*/
bool gameOver(char board[][3]); /*checks to see if someone won on rows of board*/
bool checkHorizontal(char board[][3], char marker);/*checks to see if someone won on columns of board*/
bool checkVertical(char board[][3], char marker);/*checks to see if someone won on diagonal of board*/
bool checkDiagonal(char board[][3], char marker);/*checks to see if players have tied*/
bool checkTie(char board[][3]);/*prints winner as marker or ties*/
void printWinner(char marker);/*checks to see if selected location is available returns false when location has already been taken or is an invalid number*/
bool validMove(char board[][3], int x,int y);
int main()
{ srand(time(0));
int start=rand()%2;
char board[3][3];
char exit;
char f,s;
int x,y;
f='X';
s='O';
initializeBoard(board);
displayBoard(board);
while(true)
{
f = '1';
getInput(board,f,x,y);
f = 'X';
markBoard(board, x,y, f);
displayBoard(board);
if (gameOver(board))
break;
s = '2';
getInput(board,s,x,y);
s='O';
markBoard(board, x,y, s);
displayBoard(board);
if (gameOver(board))
break;
}
system("pause");
return 0;
}
void initializeBoard(char board[][3])
{
char count = '*';
for (int i = 0; i<3; i++) {
for (int j = 0; j<3; j++){
board[i][j]= count;
}
}
}
bool validMove(char board[][3], int x, int y)
{if(x<0||x>2||y<0||y>2)
return false;
if(board[x][y]=='X'||board[x][y]=='O')
return false;
else
return true;
}
void displayBoard(char board[][3])
{ int t;
for(t=0; t<3; t++) {
cout<<" "<<board[t][0]<<" | "<< board[t][1]<<" | "<< board[t][2];
if(t!=2) cout<<"\n---|---|---\n";
}
cout<<"\n";
}
void getInput(char board[][3], char marker,int& x,int& y)
{for(;;)
{cout << "Player "<< marker << " Enter a Row and Column (between 1-3): ";
cin >> x>>y;
x--;
y--;
if (validMove(board,x,y))
return;
cout << "Invalid Move: Please Try Again\n\n";
}
}
void markBoard(char board[][3], int x,int y, char marker)
{ board[x][y]=marker;
}
bool gameOver(char board[][3])
{if (checkHorizontal(board,'X'))
{printWinner('X');
return true;
}
if (checkVertical(board, 'X'))
{printWinner('X');
return true;
}
if (checkDiagonal(board, 'X'))
{ printWinner('X');
return true;
}
if (checkHorizontal(board,'O'))
{printWinner('O');
return true;
}
if (checkVertical(board, 'O'))
{printWinner('O');
return true;
}
if (checkDiagonal(board, 'O'))
{printWinner('O');
return true;
}
if (checkTie(board))
{printWinner('T');
return true;
}
return false;
}
bool checkHorizontal(char board[][3], char marker)
{int i,j,count;
for(i=0; i<3; i++)
{count=0;
for(j=0;j<3;j++)
if(board[i][j]==marker)
count++;
if(count==3)
return true;
}
return false;
}
bool checkVertical(char board[][3], char marker)
{int i,j,count;
for(i=0; i<3; i++)
{count=0;
for(j=0;j<3;j++)
if(board[j][i]==marker)
count++;
if(count==3)
return true;
}
return false;
}
bool checkDiagonal(char board[][3], char marker)
{if(board[0][0]==board[1][1] && board[1][1]==board[2][2]&& board[0][0]==marker)
return true;
if(board[0][2]==board[1][1] && board[1][1]==board[2][0]&& board[0][2]==marker)
return true;
return false;
}
bool checkTie(char board[][3])
{int i,j;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
if(board[i][j] == '*')
return false;
return true;
}
void printWinner(char marker)
{ if(marker=='T')
cout<<"TIE GAME!\n";
else {
if(marker =='X') {
marker = '1';
}else{
marker = '2';
}
cout<<"The winner is player "<<marker<<"!!!\n";
}
}
=====================================
SEE OUTPUT
PLEASE COMMENT if there is any concern.
==============================