C++ Index Values

I'm trying to figure out where I messed up in the valid index values. When it compiles, it accepts 1-9 except for 9. I thought I went through all the index checking in the code, but apparently I didn't....


//Fif Game against the computer
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#include<limits>
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';
// function prototypes

char askYesNo(string question);
int askNumber(string question, int high, int low);
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;
const int NUM_SQUARES = 9;
vector<char> board(NUM_SQUARES, EMPTY);
char human = humanPiece();
char computer = opponent(human);
char turn = X;
int ChoiceToPlayAgain;
string question;

cout << "Welcome to the 'Fif' Game! You are competing aganst the computer."<<endl;
cout << "Below is the board that you are using. The object of the game is to" <<endl;
cout << "make your values to where you can get 3 of the values to sum to 15."<<endl;
cout << "Valid input values are from 1-9" <<endl<<endl;

cout<<" 123456789"<<endl;
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;
}
cout<<" 123456789"<<endl;
displayBoard(board);
turn = opponent(turn);
}
announceWinner(winner(board), computer, human);
system("pause");
return 0;
}



char askYesNo(string question)
{
char response;
do
{
cout << question << "(C/Y): ";
cin >> response;
} while (response != 'y' && response != 'n');
return response;
}
int askNumber(string question, int high=9, int low=1)
{
int number;
do
{
cout << question << " (1-9): ";
cin >> number;
}while (number > high || number < low);
return number;
}
char humanPiece()

{
char go_first = askYesNo("Should I start or you?");
if (go_first == 'Y')
{
cout << "Make your move:";
return X;
}
else
{
cout << "I will start:";
return O;
}
}
char opponent(char piece)
{
if (piece == X)
return O;
else
return X;
}
void displayBoard(const vector<char>& board)
{
cout << board[0] << board[1] << board[2]<< board[3] << board[4] << board[5]<< 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] = {
{4,9,2},
{3,5,7},
{8,1,6},
{4,3,8},
{9,5,1},
{2,7,6},
{4,5,6},
{2,5,8}
};
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;
}
bool 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 << "\nThis square is already taken, choose a different square. \n";
move = askNumber("Where will you move?", (board.size()-1));
}
return move;
}
int computerMove(vector<char> board, char computer)
{
cout << "I'll take 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
const int BEST_MOVES[] = {5,4,2,8,6,9,3,7,1};
// 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 << "3 of my numbers sums to 15, so you lose! "<<endl;
}
else if (winner == human)
{
cout << winner << "'s won!\n";
cout << "3 of your numbers sums to 15, so you win!" <<endl;

}
else
{
cout << "Nobody reached a sum of 15 after board is filled, so it's a tie." << endl;
}

}
Indices start at 0. The highest valid index is one less then the size of the array/vector, so valid indices for board is 0-8.
Last edited on
I know. Don't I have that?
Yes you have. My bad. But then the problem is that askNumber rejects 9 because it is greater than high in that function. If you want the user to enter a number 1-9 you have to subtract 1 to get the index, right?
high = rejects 9
high-1=rejects 8 and 9
high+1=9 is treated as a square already used.
closed account (3TXyhbRD)
Use code tags and indent the source code, thanks.
Topic archived. No new replies allowed.