예제 #1
0
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
예제 #2
0
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()
예제 #3
0
	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
예제 #4
0
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()
예제 #5
0
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)
예제 #6
0
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)