Go4Expert

Go4Expert (http://www.go4expert.com/)
-   C++ (http://www.go4expert.com/forums/cpp/)
-   -   C++ Index values in Fif Game (http://www.go4expert.com/forums/cpp-index-values-fif-game-t28465/)

g0blu324 29May2012 03:41

C++ Index values in Fif Game
 
Hello, can I get assistance on why the index values won't 100% work right. Right now, it's set for 0-8, which is fine. However, I need 1-9. I tried manipulating the high and low variables in the "askNumber" function but even though I can get a "(1-9)" instead of "(0-8)" the the X's and O's still go in the index values of 0-8. Can someone look into this and find my mistake? Thanks.


Code:

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

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
void instructions();
char askYesNo(string question);
int askNumber(string question, int high, int low = 0);
char humanPiece();
char opponent(char piece);
void displayBoard( vector<char>& board);
char winner( vector<char>& board);
bool isLegal( vector<char>& board, int move);
int humanMove( 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;
    int 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);
    system("pause");
    return 0;
}

// functions
void instructions()
{
    cout << " Get a sum of 15 with atleast 3 squares first " << endl;
    cout << "      4 | 9 | 2\n";
    cout << "      ---------\n";
    cout << "      3 | 5 | 7\n";
    cout << "      ---------\n";
    cout << "      8 | 1 | 6\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+1 || number < low);

    return number;
}


char humanPiece()
{
    char go_first = askYesNo("Would you like to go first?");
    if (go_first == 'y')
    {
        cout << "\nYou go first." <<endl;
        return X;
    }
    else
    {
        cout << "\n Then I'll start." <<endl;
        return O;
    }
}


char opponent(char piece)
{
    if (piece == X)
        return O;
    else
        return X;
}


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


char winner( vector<char>& board)
{
    // all possible winning rows
    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}};
    int TOTAL_ROWS = 8;

    // if any winning row has three values 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 and it isn't a tie, the game ain't over
    return NO_ONE;
}


bool isLegal(int move,  vector<char>& board)
{
    return (board[move] == EMPTY);
}


int humanMove( vector<char>& board, char human)
{
    int move = askNumber("Where will you move?", (board.size() - 1));
    while (!isLegal(move, board))
    {
        cout << "\nSquare is already used" << endl;
        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
    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 << "You lost!" << endl;
    }

    else if (winner == human)
    {
        cout <<"You won." <<endl;
    }

    else
    {
        cout << "Tie." <<endl;
    }
}



All times are GMT +5.5. The time now is 15:02.