/** * Same as before, but perform alpha-beta pruning. * The main routine should make the call with * alpha = COMP_LOSS and beta = COMP_WIN. */ int TicTacToe::findCompMove( int & bestMove, int alpha, int beta ) { int i, responseValue; int dc; // dc means don't care; its value is unused int value; if( fullBoard( ) ) value = DRAW; else if( immediateCompWin( bestMove ) ) return COMP_WIN; // bestMove will be set by immediateCompWin else { value = alpha; bestMove = 1; for( i = 1; i <= 9 && value < beta; i++ ) // Try each square { if( isEmpty( i ) ) { place( i, COMP ); responseValue = findHumanMove( dc, value, beta ); unplace( i ); // Restore board if( responseValue > value ) { // Update best move value = responseValue; bestMove = i; } } } } return value; }
void TicTacToe::findCompMove(int& bestMove,int &value, int alpha, int beta) { if (board.isFull()) value = Draw; else if (board.immediateComWin(bestMove)) value = CompWin; else { value = alpha; for (int i = 0; i < GridNuber&&value < beta; i++) { if (board.isEmpty(i)) { board.placeComp(i); int tmp = -1, response = -1; // Tmp is useless findHumanMove(tmp, response, value, beta); board.unPlace(i); if (response > value) { value = response; bestMove = i; } } } } }