не могу понять, почему некорректно работает программа

пробежался по отладке, но не понимаю, почему компьютер сам не делает ход и мне не дает его сделать. помогите, пожалуйста...

// Программа Крестики - нолики
// Компьютер играет в "Крестики-нолики" против пользователя
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
    // глобальные константы
const char X = 'X';
const char O = 'O';
const char EMPTY = ' ';
const char TIE = 'T';
const char NO_ONE = 'N';
    // прототипы функций
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);
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);


int 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;
}


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 known by entering а 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 == 'у')
    {
        cout << "\nThen take the first move. You will need it.\n";
        return X;
    }
    else
    {
        cout << "\nYour bravery will Ье your undoing ... I will go first.\n";
        return O;
    }
}

char opponent(char piece)
{
    if (piece == 1)
    {
        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)
{
    // все возможные выигрышные ряды
    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;
    // если в одном из выигрышных рядов уже присутствуют три одинаковых значения
        // (причем они не равны ЕМРТУ).то победитель определился
    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]];
        }
    }
    //1 поскольку победитель не определился.проверяем.не наступила ли ничья
        // (остались ли на поле пустые клетки)
    if (count( board.begin(), board.end(), EMPTY) == 0);
    return TIE;
    // Поскольку победитель не определился.но и ничья еще не наступила.
    // игра продолжается
    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;
    // если компьютер может выиграть следующим ходом.то он делает этот ход
    while (!found && move < board.size())
    {
        if (islegal(move, board))
        {
            board[move] = computer;
            found = winner(board) == computer;
            board[move] = EMPTY;
        }

        if (!found)
        {
            ++move;
        }
    }


    // иначе.если человек может победить следующим ходом.блокировать этот ход
    if (!found)
    {
        move = 0;
        char human = opponent(computer);
        while (!found && move < board.size())
        {
            if (islegal(move, board))
            {
                board[move] = human;
                found = winner(board) == human;
                board[move] = EMPTY;
            }

            if (!found)
            {
                ++move;
            }
        }
    }

    // иначе занять следующим ходом оптимальную свободную клетку
    if (!found)
    {
        move = 0;
        unsigned int i = 0;
        const int BEST_MOVES[] = { 4, 0, 2, 6, 8, 1, 3, 5, 7 };
        // выбрать оптимальную свободную клетку
        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. по! It cannot Ье! Somehow you tricked me. human. \n";
        cout << "But never again! I. the computer. so swear it!\n";
    }
    else
    {

        cout << "It's а 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";
    }
}



Ответы (1 шт):

Автор решения: KoVadim

Посмотрите внимательно здесь

if (count( board.begin(), board.end(), EMPTY) == 0);
  return TIE;

лишнюю точку с запятой видите?

и вот здесь компилятор должен был намекнуть

if (go_first == 'у') // это не совсем та буковка в кавычках, которая кажется
{

после этого как минимум человек сам с собой уже может играть

→ Ссылка