def next_move_AI(state, mill): g.STARTTIME = time() depth = 4 if h.getNumberOfPlayerPieces(state, 'B') + g.BLACKREMOVED == 9: g.PHASE = 'MOVE' else: g.PHASE = 'INIT' if h.getNumberOfPlayerPieces(state, 'B') == 3 and g.PHASE != 'INIT': g.PHASE = 'FLY' depth = 2 g.PHASECOPY = g.PHASE if mill: state.makeChildren('MILL') else: state.makeChildren(g.PHASECOPY) depth -= 1 bestMove = None alpha = -g.MAXIMUM for successor in state.nextStates: if time() - g.STARTTIME > g.TIMEALLOWED: break score = alphaBeta(successor, -g.MAXIMUM, g.MAXIMUM, depth, g.PHASECOPY) if score >= alpha: alpha, bestMove = score, successor.move if alpha >= g.MAXIMUM: break return bestMove
def check_counter_fly_plays(state): if g.PHASE != 'INIT': if h.getNumberOfPlayerPieces(state, 'B') == 3 and h.getNumberOfPlayerPieces( state, 'W') == 3: g.COUNTPLAYSFLY += 1 if g.COUNTPLAYSFLY == 20: print('==================DRAWN==================') sys.exit()
def isTerminalState(self): loserIsBlack, loserIsWhite = False, False if h.allPlayerPiecesClosed(self, 'B') or h.getNumberOfPlayerPieces(self, 'B') < 3: loserIsBlack = True if h.allPlayerPiecesClosed(self, 'W') or h.getNumberOfPlayerPieces(self, 'W') < 3: loserIsWhite = True if (not loserIsBlack) and (not loserIsWhite): return False self.isLoserBlack = (not loserIsWhite) return True
def check_if_over(state): if g.PHASE != 'INIT': if h.allPlayerPiecesClosed( state, 'B') or h.getNumberOfPlayerPieces(state, 'B') < 3: print( '=========================CONGRATULATIONS, YOU WIN!=========================' ) playsound(g.YOUWINSOUND) sys.exit() if h.allPlayerPiecesClosed( state, 'W') or h.getNumberOfPlayerPieces(state, 'W') < 3: print( '===========================YOU LOSE!==========================' ) playsound(g.YOULOSESOUND) sys.exit()
def human_play(state, mill): if h.getNumberOfPlayerPieces(state, 'W') + g.WHITEREMOVED == 9: g.PHASE = 'MOVE' else: g.PHASE = 'INIT' if h.getNumberOfPlayerPieces(state, 'W') == 3 and g.PHASE != 'INIT': g.PHASE = 'FLY' if mill: human_play_mill(state) elif g.PHASE == 'INIT': human_play_init(state) elif g.PHASE == 'MOVE': human_play_move(state) elif g.PHASE == 'FLY': human_play_fly(state)
def alphaBeta(state, alpha, beta, depth, phase, fly_previous=False): if phase == 'MILL': if fly_previous is False: phase = g.PHASECOPY else: phase = 'FLY' if phase == 'MOVE': if (state.blackToMove and h.getNumberOfPlayerPieces(state, 'B') == 3) or \ ((not state.blackToMove) and h.getNumberOfPlayerPieces(state, 'W')) == 3: phase = 'FLY' if state.isTerminalState() and phase != 'INIT': return state.getTerminal() if depth <= 0 or (time() - g.STARTTIME) > g.TIMEALLOWED: return h.evalute(state, phase) if state.parent is not None: if state.blackToMove: if h.millHasBeenMadeInLastTurn(state, 'W'): state.blackToMove = False if phase == 'FLY': #state.blackToMove = False return minValue(state, alpha, beta, depth, 'MILL', True) else: return minValue(state, alpha, beta, depth, 'MILL') else: if h.millHasBeenMadeInLastTurn(state, 'B'): state.blackToMove = True if phase == 'FLY': #state.blackToMove = True return maxValue(state, alpha, beta, depth, 'MILL', True) else: return maxValue(state, alpha, beta, depth, 'MILL') if state.blackToMove: return maxValue(state, alpha, beta, depth, phase) else: return minValue(state, alpha, beta, depth, phase)