Similar to the Yahtzee project you completed earlier, in order to really underst
ID: 3778305 • Letter: S
Question
Similar to the Yahtzee project you completed earlier, in order to really understand the artificial intelligence and how to improve it; you must first have a good grasp on the game, its concepts, and its rules.
Unzip the file, and run the game. (code listed below) Play a few games and begin to analyze the artificial intelligence that is currently programmed. Then, review the code itself. Begin to analyze how it and why it was programmed the way it was.
Create a 1-2 page paper that presents your findings on the current level of AI in the game. How was it coded? How does it function? Does it learn from the players? etc. Before you submit your paper, be sure that you have applied proper mechanics including spelling, grammar, and punctuation.
// 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 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(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 function
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;
}
// functions
void instructions()
{
cout << "Welcome to the ultimate man-machine showdown: Tic-Tac-Toe. ";
cout << "--where human brain is pit against silicon processor ";
cout << "Make your move known by entering a number, 0 - 8. The number ";
cout << "corresponds to the desired board position, as illustrated: ";
cout << " 0 | 1 | 2 ";
cout << " --------- ";
cout << " 3 | 4 | 5 ";
cout << " --------- ";
cout << " 6 | 7 | 8 ";
cout << "Prepare yourself, human. The battle is about to begin. ";
}
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 << " Then take the first move. You will need it. ";
return X;
}
else
{
cout << " Your bravery will be your undoing... I will go first. ";
return O;
}
}
char opponent(char piece)
{
if (piece == X)
return O;
else
return X;
}
void displayBoard(const vector<char>& board)
{
cout << " " << board[0] << " | " << board[1] << " | " << board[2];
cout << " " << "---------";
cout << " " << board[3] << " | " << board[4] << " | " << board[5];
cout << " " << "---------";
cout << " " << board[6] << " | " << board[7] << " | " << board[8];
cout << " ";
}
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 << " That square is already occupied, foolish human. ";
move = askNumber("Where will you move?", (board.size() - 1));
}
cout << "Fine... ";
return move;
}
int computerMove(vector<char> board, char computer)
{
cout << "I shall take square 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
const int BEST_MOVES[] = {4, 0, 2, 6, 8, 1, 3, 5, 7};
// 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 << winner << "'s won! ";
cout << "As I predicted, human, I am triumphant once more -- proof ";
cout << "that computers are superior to humans in all regards. ";
}
else if (winner == human)
{
cout << winner << "'s won! ";
cout << "No, no! It cannot be! Somehow you tricked me, human. ";
cout << "But never again! I, the computer, so swear it! ";
}
else
{
cout << "It's a tie. ";
cout << "You were most lucky, human, and somehow managed to tie me. ";
cout << "Celebrate... for this is the best you will ever achieve. ";
}
}
Explanation / Answer
Answer:
#include <iostream>
using namespace std;
char location[10] = {'o','1','2','3','4','5','6','7','8','9'};
int checkwinner();
void displayboard();
int main()
{
int player = 1,i,choice;
char mark;
do
{
displayboard();
player=(player%2)?1:2;
cout << "Player " << player << ", enter a number: ";
cin >> choice;
mark=(player == 1) ? 'X' : 'O';
if (choice == 1 && location[1] == '1')
location[1] = mark;
else if (choice == 2 && location[2] == '2')
location[2] = mark;
else if (choice == 3 && location[3] == '3')
location[3] = mark;
else if (choice == 4 && location[4] == '4')
location[4] = mark;
else if (choice == 5 && location[5] == '5')
location[5] = mark;
else if (choice == 6 && location[6] == '6')
location[6] = mark;
else if (choice == 7 && location[7] == '7')
location[7] = mark;
else if (choice == 8 && location[8] == '8')
location[8] = mark;
else if (choice == 9 && location[9] == '9')
location[9] = mark;
else
{
cout<<"Invalid move ";
player--;
cin.ignore();
cin.get();
}
i=checkwinner();
player++;
}while(i==-1);
displayboard();
if(i==1)
cout<<"==>Player "<<--player<<" win ";
else
cout<<"==>Game draw";
cin.ignore();
cin.get();
return 0;
}
int checkwinner()
{
if (location[1] == location[2] && location[2] == location[3])
return 1;
else if (location[4] == location[5] && location[5] == location[6])
return 1;
else if (location[7] == location[8] && location[8] == location[9])
return 1;
else if (location[1] == location[4] && location[4] == location[7])
return 1;
else if (location[2] == location[5] && location[5] == location[8])
return 1;
else if (location[3] == location[6] && location[6] == location[9])
return 1;
else if (location[1] == location[5] && location[5] == location[9])
return 1;
else if (location[3] == location[5] && location[5] == location[7])
return 1;
else if (location[1] != '1' && location[2] != '2' && location[3] != '3'
&& location[4] != '4' && location[5] != '5' && location[6] != '6'
&& location[7] != '7' && location[8] != '8' && location[9] != '9')
return 0;
else
return -1;
}
void displayboard()
{
system("cls");
cout << " Tic Tac Toe ";
cout << "Player 1 (X) - Player 2 (O)" << endl << endl;
cout << endl;
cout << " | | " << endl;
cout << " " << location[1] << " | " << location[2] << " | " << location[3] << endl;
cout << "_____|_____|_____" << endl;
cout << " | | " << endl;
cout << " " << location[4] << " | " << location[5] << " | " << location[6] << endl;
cout << "_____|_____|_____" << endl;
cout << " | | " << endl;
cout << " " << location[7] << " | " << location[8] << " | " << location[9] << endl;
cout << " | | " << endl << endl;
}
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.