0

My prof. gave us this class project to do and we had to more or less fill in the blanks. So here is what i have for my code and it works up to the point where it asks you if you want to go first or not.

So weather you put yes or no it either crashes or ends up in a tie right away, depending on how your run the program.

I found another code like this on this forum and looked at it but it was no help.
I apreciate the time to look at it for me and help me figure out where i went wrong. And or if its just my computer or something.:-|

// Tic Tac Toe Against Computer
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
usingnamespace std;
//global constants
constchar X = 'X';
constchar O = 'O'; 
constchar EMPTY = ' ';
constchar TIE = 'T';
constchar NO_ONE = 'N';
// function prototypes 
void instructions();
char askYesNo(string question);
int askNumber(string question, int high, int low = 0);
char humanPiece();
char opponent(char piece);
void displayBoard(const vector<char>& board);
char winner(const vector<char>& board);
 
int humanMove(const vector<char>& board, char human);
bool isLegal(const vector<char>& board, int move);
int humanMove(const vector<char>& board, char human);
int computerMove(vector<char> board, char computer);
void announceWinner(char winner, char computer, char human);
//main function
int main()
{
 
int move;
constint NUM_SQUARES = 9;
vector<char> board(NUM_SQUARES, EMPTY);
instructions();
char human = humanPiece();
char computer = opponent(human);
char turn = X;
displayBoard(board);
while (winner(board) == NO_ONE)
{
if (turn == human)
{
move = humanMove(board, human);
board[move] = human;
}
else
{
move = computerMove(board, computer);
board[move] = computer;
}
displayBoard(board);
turn = opponent(turn);
}
announceWinner(winner(board), computer, human);
return 0;
}
void instructions()
{
cout << "Welcome to the ultimate man-machine showdown: Tic-Tac-Toe.\n";
cout << "-where human brain is pit against silicon processor\n\n";
cout << "Make your move now by entering a number, 0 - 8. The number\n";
cout << "corresponds to the desired board position, as illustrated:\n\n"; 
cout << " 0| 1 | 2\n";
cout << " ---------\n";
cout << " 3| 4 | 5\n";
cout << " ---------\n";
cout << " 6| 7 | 8\n\n";
cout << "Prepare yourself, human, The battle is about to begin.\n\n";
}
 
 
char askYesNo(string question)
{
char response;
do
{
cout << question << "(y/n): ";
cin >> response;
} while (response != 'y' && response != 'n');
return response;
}
int askNumber(string question, int high, int low)
{
int number;
do
{
cout << question << " (" << low << " - " << high << "): ";
cin >> number;
}while (number > high || number < low);
return number;
}
char humanPiece()
 
{
char go_first = askYesNo("Do you require the first move?");
if (go_first == 'Y')
{
cout << "\nThen take the first move. You will need it.\n";
return X;
}
else
{
cout << "\nYour bravery will be your undoing... I will go first.\n";
return O;
}
}
char opponent(char piece)
{
if (piece == X)
return O;
else
return X;
}
void displayBoard(const vector<char>& board)
{
cout << "\n\t" << board[0] << " | " << board[1] << " | " << board[2];
cout << "\n\t" << "-----";
cout << "\n\t" << board[3] << " | " << board[4] << " | " << board[5];
cout << "\n\t" << "-----";
 
cout << "\n\t" << board[6] << " | " << board[7] << " | " << board[8];
cout << "\n\n";
}
char winner(const vector<char>& board)
{
//all possible winning rows
const 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;
//if any winning row has three value that are the same (and not EMPTY),
// then we have a winner
for(int row = 0; row < TOTAL_ROWS; ++row)
{
if ( (board[WINNING_ROWS[row][0]] != EMPTY) &&
(board[WINNING_ROWS[row][0]] == board[WINNING_ROWS[row][1]]) &&
(board[WINNING_ROWS[row][1]] == board[WINNING_ROWS[row][2]]) );
{
return board[WINNING_ROWS[row][0]];
}
}
//since nobody has won, check for a tie (no empty squares left)
if (count(board.begin(), board.end(), EMPTY) == 0)
return TIE;
// since nobody has won it isn't a tie, the game ain't over 
return NO_ONE;
}
inlinebool isLegal(int move, const vector<char>& board)
{
return (board[move] == EMPTY);
}
int humanMove(const vector<char>& board, char human)
{
int move = askNumber("Where will you move?", (board.size() - 1));
while (!isLegal(move, board))
{
 
cout << "\nThat square is already occupied, foolish human. \n";
move = askNumber("Where will you move?", (board.size() - 1));
}
cout << " Fine...\n";
return move;
}
int computerMove(vector<char> board, char computer)
{
cout << "I shall take square number ";
//if computer can win on next move, make that move
for(int move = 0; move < board.size(); ++move)
{
if (isLegal(move, board))
{
board[move] = computer;
if (winner(board) == computer)
{
cout << move << endl;
return move;
}
//done checking this move, undo it
board[move] = EMPTY;
}
}
//if human can win on next move, block that move
char human = opponent(computer);
for(int move = 0; move < board.size(); ++move)
{
if (isLegal( move, board))
{
board[move] = human;
if (winner(board) == human)
{ 
cout << move << endl;
return move;
 
}
// done checking this move, undo it
board[move] = EMPTY;
}
}
// the best moves to make, in order
constint BEST_MOVES[] = {4,0,2,6,8,1,3,5,7};
// since no one can win on next move, pick best open square
for(int i = 0; i <board.size(); ++i)
{
int move = BEST_MOVES[i];
if (isLegal(move, board))
{
cout << move << endl;
return move;
}
}
}
void announceWinner(char winner, char computer, char human)
{
if (winner == computer)
{
cout << winner << "'s won!\n";
cout << "As I predicted, human, I am triumphant once more - proof\n";
cout << "that computers are superior to humans in all regards.\n";
}
elseif (winner == human)
{
cout << winner << "'s won!\n";
cout << "No, No! It can not be! Some how you tricked me, human.\n";
cout << "But never again I, the computer, so swear it!\n";
}
else
{
cout << "It's a tie.\n";
cout << "You were most lucky, human, and some how managed to tie me.\n";
cout << " Celebrate ... for this is the best you will ever achieve.\n";
}
}
1
Contributor
1
Reply
2
Views
10 Years
Discussion Span
Last Post by Praetorian
0

Ok after about 3 days of looking at it, it took me posting here to find my mistake.

I had a ";" sign at the end of this if statements

Wrong way:

if ( (board[WINNING_ROWS[row][0]] != EMPTY) &&
(board[WINNING_ROWS[row][0]] == board[WINNING_ROWS[row][1]]) && 
(board[WINNING_ROWS[row][1]] == board[WINNING_ROWS[row][2]]) );

Correct way:

if ( (board[WINNING_ROWS[row][0]] != EMPTY) &&
(board[WINNING_ROWS[row][0]] == board[WINNING_ROWS[row][1]]) && 
(board[WINNING_ROWS[row][1]] == board[WINNING_ROWS[row][2]]) )
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.