Question: You have to implement minimax algorithm with Alpha Beta pruning in C++ by change this part of code for the the program of an agent

You have to implement minimax algorithm with Alpha Beta pruning in C++ by change this part of code for the the program of an agent allowing to play the game Othello.

Please modify this part of code and share only this part of code changed with the new functions if needed:

if(moi == player) {

auto actionsPossible = listDesCoupsPossible();

// TODO : CHOOSE BEST MOVE ////////////

std::tie(row, col) = actionsPossible[ rand()%actionsPossible.size() ]; // Choix alatoire

std::cout << row << col << ' ' << std::flush;

//////////////////////////////////////////////

}

Here is the whole code:

#include

#include

#include

#include

#include

#include

std::vector> board;

char player = 'X';

void initBoard() {

board.resize(8, std::vector(8, '-'));

board[3][3] = 'X';

board[3][4] = 'O';

board[4][3] = 'O';

board[4][4] = 'X';

}

void printBoard() {

clear();

for(auto &line: board) {

for(auto c: line) {

printw("%c ", c);

}

printw(" ");

}

printw("Player: %c ", player);

refresh();

}

bool isValidMove(int x, int y, char player) {

if (x < 0 || x >= board.size() || y < 0 || y >= board[x].size()) return false; // Vrifier si la case est dans les limites du plateau de jeu

if (board[x][y] != '-') return false; // Vrifier si la case est vide

// Vrifier les huit directions autour de la case

for (int i = -1; i <= 1; i++) {

for (int j = -1; j <= 1; j++) {

if (i == 0 && j == 0) continue; // On ignore la case actuelle

int k = 1;

while (true) {

int newX = x + i * k;

int newY = y + j * k;

if (newX < 0 || newX >= board.size() || newY < 0 || newY >= board[newX].size()) break; // Sortir si on est en dehors du plateau

if (board[newX][newY] == '-') break; // Sortir si la case est vide

if (board[newX][newY] == player) {

if (k > 1) {

return true; // Si on a trouv une pice du joueur actuel aprs avoir trouv une pice de l'autre joueur, alors le coup est valide

}

break;

}

k++;

}

}

}

return false;

}

void playMove(int x, int y) {

assert( isValidMove(x, y, player) );

board[x][y] = player; // Placer la pice du joueur actuel sur la case choisie

// Vrifier les huit directions autour de la case

for (int i = -1; i <= 1; i++) {

for (int j = -1; j <= 1; j++) {

if (i == 0 && j == 0) continue; // On ignore la case actuelle

int k = 1;

while (true) {

int newX = x + i * k;

int newY = y + j * k;

if (newX < 0 || newX >= board.size() || newY < 0 || newY >= board[newX].size()) break; // Sortir si on est en dehors du plateau

if (board[newX][newY] == '-') break; // Sortir si la case est vide

if (board[newX][newY] == player) {

if (k > 1) {

for(int k2 = k-1; k2 > 0; k2--) {

int newX = x + i * k2;

int newY = y + j * k2;

board[newX][newY] = player;

}

break;

}

break;

}

k++;

}

}

}

}

// Change de joueur si l'autre joueur peut jouer, si non le joueur garde la main. Si personne ne peut jouer, retourne false

bool switchPlayer() {

char newPlayer = (player == 'X') ? 'O' : 'X';

for (int i = 0; i < board.size(); i++) {

for (int j = 0; j < board[i].size(); j++) {

if (isValidMove(i, j, newPlayer)) {

player = newPlayer;

return true;

}

}

}

for (int i = 0; i < board.size(); i++) {

for (int j = 0; j < board[i].size(); j++) {

if (isValidMove(i, j, player)) {

return true;

}

}

}

return false;

}

int scoreX() {

int X = 0;

int O = 0;

for(auto &line: board) {

for(auto c: line) {

X += (c == 'X');

O += (c == 'O');

}

}

return X-O;

}

void afficherFin() {

clear();

for(auto &line: board) {

for(auto c: line) {

printw("%c ", c);

}

printw(" ");

}

int s = scoreX();

if(s > 0) {

printw("Player X a gagner de %d points ! ", s);

} else if(s < 0) {

printw("Player O a gagner de %d points ! ", -s);

} else {

printw("Egalit ! ");

}

refresh();

}

std::vector< std::tuple > listDesCoupsPossible() {

std::vector< std::tuple > result;

for (int i = 0; i < board.size(); i++) {

for (int j = 0; j < board[i].size(); j++) {

if (isValidMove(i, j, player)) {

result.push_back({i,j});

}

}

}

return result;

}

int main(int argc, char *argv[]) {

if( argc != 2 ) {

std::cerr << "Utilisation :" << std::endl;

std::cerr << argv[0] << " [X|O]" << std::endl;

return 0;

}

if((argv[1][0] != 'X') && (argv[1][0] != 'O')) {

std::cerr << "Utilisation :" << std::endl;

std::cerr << argv[0] << " [X|O]" << std::endl;

return 0;

}

char moi = argv[1][0];

srand(time(NULL));

initBoard();

while (true) {

int row;

int col;

if(moi == player) {

auto actionsPossible = listDesCoupsPossible();

// TODO : CHOISIR LE COUPS A JOUER ////////////

std::tie(row, col) = actionsPossible[ rand()%actionsPossible.size() ]; // Choix alatoire

std::cout << row << col << ' ' << std::flush;

//////////////////////////////////////////////

} else {

std::string coups;

std::cin >> coups;

std::cerr << "coups: \"" << coups << "\"" << std::endl;

row = coups[0]-'0';

col = coups[1]-'0';

}

if (isValidMove(row, col, player)) {

playMove(row, col);

if(!switchPlayer()) {

break;

}

} else {

std::cerr << "ERREUR: coups " << row << " " << col << " est invalide !" << std::endl;

return 0;

}

}

return 0;

}

Step by Step Solution

There are 3 Steps involved in it

1 Expert Approved Answer
Step: 1 Unlock blur-text-image
Question Has Been Solved by an Expert!

Get step-by-step solutions from verified subject matter experts

Step: 2 Unlock
Step: 3 Unlock

Students Have Also Explored These Related Databases Questions!