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, thats 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
- 001 tic-tac-toe game
- uva 11623 - Tic Tac Toe(game)
- B. Ilya and tic-tac-toe game
- Tic-Tac-Toe
- [cf]Tic-tac-toe
- C - Tic-tac-toe
- Minimax-Tic Tac Toe
- Design Tic-Tac-Toe
- Design Tic-Tac-Toe
- Design Tic-Tac-Toe
- FZU Tic-Tac-Toe
- Tic-Tac-Toe FZU
- FZU2283-Tic-Tac-Toe
- tic-tac-toe游戏
- 【Codeforces 754 B Ilya and tic-tac-toe game】
- 【codeforces 754B】 Ilya and tic-tac-toe game
- Cdoeforces 754 B - Ilya and tic-tac-toe game
- codeforces 754 B Ilya and tic-tac-toe game
- leetcode题解Java | 310. Minimum Height Trees
- Android 不要错过的 7 个完整项目学习
- Android 恢复Activity现场
- caffe 制作lmdb数据集
- Ajax详解
- 001 tic-tac-toe game
- 认认真真写安卓,服务篇,组件(Service)
- 抽象类与接口的区别
- android学习笔记
- 项目架构开发:服务层
- (1)ARM40-A5板应用程序——hello world
- 数据结构之队列
- 103:Fraction to Recurring Decimal
- strncmp函数