void place(Chip *c) { register Pin *p; Chip *cp; int i; putpkg(c); if(!(c->flags&IGRECT)){ if(cp = rectadd(c)){ if(!quiet) fprint(2, "chip %s: rect collision with %s\n", c->name, cp->name); unplace(c); return; } } if(!(c->flags&IGPINS)){ for(i = 0, p = c->pins; i < c->npins; i++, p++) if(pinlook(XY(p->p.x, p->p.y), 0) == 0){ if(!quiet) fprint(2, "pin %s.%d[%p]; no pinhole\n", c->name, i+c->pmin, p->p); unplace(c); return; } } }
/** * 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; }