1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

C++ Index values in Fif Game

Discussion in 'C++' started by g0blu324, May 28, 2012.

  1. g0blu324

    g0blu324 New Member

    Joined:
    May 28, 2012
    Messages:
    1
    Likes Received:
    0
    Trophy Points:
    0
    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;
        }
    }
     
    Last edited by a moderator: May 29, 2012

Share This Page