001 tic-tac-toe game

来源:互联网 发布:我的世界手机版月球js 编辑:程序博客网 时间:2024/05/29 15:46


// Tic-Tac-Toe// Plays the game of tic-tac-toe against a human opponent#include <iostream>#include <string>#include <vector>#include <algorithm>using namespace std;// global constantsconst char X = 'X';const char O = 'O';const char EMPTY = ' ';const char TIE = 'T';const char NO_ONE = 'N';// function prototypesvoid 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);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 functionint main(){    int move;    const 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);    return 0;}// functionsvoid 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 known 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 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;}inline 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 << "\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){     unsigned int move = 0;    bool found = false;    //if computer can win on next move, that’s the move to make    while (!found && move < board.size())    {        if (isLegal(move, board))        {//try move            board[move] = computer;            //test for winner            found = winner(board) == computer;   //undo move            board[move] = EMPTY;        }        if (!found)        {            ++move;        }    }      //otherwise, if opponent can win on next move, that's the move to make    if (!found)    {        move = 0;        char human = opponent(computer);        while (!found && move < board.size())        {            if (isLegal(move, board))            {//try moveboard[move] = human;  //test for winner                found = winner(board) == human;         //undo moveboard[move] = EMPTY;                    }            if (!found)            {                ++move;            }        }    }    //otherwise, moving to the best open square is the move to make    if (!found)    {        move = 0;        unsigned int i = 0;        const int BEST_MOVES[] = {4, 0, 2, 6, 8, 1, 3, 5, 7};        //pick best open square        while (!found && i <  board.size())        {            move = BEST_MOVES[i];            if (isLegal(move, board))            {                found = true;            }            ++i;        }    }    cout << "I shall take square number " << 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";    }else if (winner == human)    {        cout << winner << "'s won!\n";        cout << "No, no!  It cannot be!  Somehow 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 somehow managed to tie me.\n";        cout << "Celebrate... for this is the best you will ever achieve.\n";}}

wang@wang:~/Downloads/bcpp-4th-source/chapter 06$ ./tic-tac-toe
Welcome to the ultimate man-machine showdown: Tic-Tac-Toe.
--where human brain is pit against silicon processor

Make your move known by entering a number, 0 - 8.  The number
corresponds to the desired board position, as illustrated:

       0 | 1 | 2
       ---------
       3 | 4 | 5
       ---------
       6 | 7 | 8

Prepare yourself, human.  The battle is about to begin.

Do you require the first move? (y/n): y

Then take the first move.  You will need it.

      |   |  
    ---------
      |   |  
    ---------
      |   |  

Where will you move? (0 - 8): 2
Fine...

      |   | X
    ---------
      |   |  
    ---------
      |   |  

I shall take square number 4

      |   | X
    ---------
      | O |  
    ---------
      |   |  

Where will you move? (0 - 8): 1
Fine...

      | X | X
    ---------
      | O |  
    ---------
      |   |  

I shall take square number 0

    O | X | X
    ---------
      | O |  
    ---------
      |   |  

Where will you move? (0 - 8): 3
Fine...

    O | X | X
    ---------
    X | O |  
    ---------
      |   |  

I shall take square number 8

    O | X | X
    ---------
    X | O |  
    ---------
      |   | O

O's won!
As I predicted, human, I am triumphant once more -- proof
that computers are superior to humans in all regards.

0 0
原创粉丝点击