/** * 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 fullBoard_notices_an_empty_board(CuTest *tc) { int board[3][3]; ct_initialize(3, 3, board); board[0][1] = 0; board[0][2] = 0; board[1][0] = 0; board[1][1] = 0; board[1][2] = 0; board[2][0] = 0; board[2][1] = 0; board[2][2] = 0; int answer = fullBoard(3, 3, board); CuAssertIntEquals_Msg(tc, "Full board", -1, answer); }