ogrin_knyaz's blog

By ogrin_knyaz, history, 7 years ago, In Russian

include

include

include

include

using namespace std; const char X = 'X'; const char O = '0'; 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& board); char winner(const vector& board); bool isLegal(const vector& board, int move); int humanMove(const vector& board, char human); int computerMove(vector board, char computer); void announceWinner(char winner, char computer, char human); void instructions() { cout << "Добро пожаловать в игру: Tic-Tac-Toe.\n"; cout << "--где человеческий мозг ничто против кремниевого процессора\n\n"; cout << "Делайте ход с помощью номеров. От 0 до 8. Номер\n"; cout << "соответствует указанному положению в таблице. Как показано:\n\n"; cout << " О | 1 | 2 "<< endl; cout << " --------- "<< endl; cout << " 3 | 4 | 5 "<< endl; cout <<" --------- " << endl; cout << " 6 | 7 | 8" << endl; cout << endl; cout << "приготовься человек, игра начинается...\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 num; do { cout << question << "(" << low << "-" << high << "):"; cin >> num; } while(num>high || num < low); return num; } char humanPiece() { char go_first=askYesNo("Вы будете ходить первым?"); if (go_first=='y') { cout << "Тогда ходи, человек." << endl; return X; } else { cout << "Ваша храбрость будет вашим поражением. Что ж, я хожу первый" << endl; return O; } } char opponent(char piece) { if (piece == X) { return O; } else { return X; } } void displayBoard(const vector& 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& 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]]; } } if (count(board.begin(), board.end(), EMPTY) == 0) return TIE; return NO_ONE; } inline bool isLegal(int move, const vector& board) { return (board[move] == EMPTY); } int humanMove(const vector& board, char human) { int move = askNumber("Ваш следующий ход?", (board.size() -1)); while (!isLegal(move, board)) { cout << "\nЭто поле уже занято, глупый человек.\n"; move = askNumber("Ваш следующий ход?", (board.size() -1)); } cout << "Допустим...\n"; return move; } int computerMove(vector 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 << "Тогда я схожу так " << move << endl; return move; } void announceWinner(char winner, char computer, char human) { if (winner == computer) { cout << winner << " выйграл!\n"; cout << "Как я и предсказывал, человек,\n"; cout << " компьютеры во всех отношениях превосходят вас!\n"; }

else if (winner == human)
{
    cout << winner << " выйграл!\n";
    cout << "Нет, нет, нет. Ты меня обманул где-то!\n";
    cout << "Этого больше не повторится, клянусь свои процессором!\n";
}
else
{
    cout << "Это ничья.\n";
    cout << "Тебе повезло, человек, пусть будет так...\n";
    cout << "Отпразднуйте ... это лучшее, чего вы когда-либо достигнете.\n";
}

} int main() { int move; const int NUM_SQUARES = 9; vector 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; }

  • Vote: I like it
  • -26
  • Vote: I do not like it