94 lines
2.1 KiB
Python
Executable File
94 lines
2.1 KiB
Python
Executable File
import random
|
|
|
|
win_states = [
|
|
(0, 1, 2), (3, 4, 5), (6, 7, 8), # horizontal
|
|
(0, 3, 6), (1, 4, 7), (2, 5, 8), # vertical
|
|
(0, 4, 8), (2, 4, 6) # diagonal
|
|
]
|
|
|
|
|
|
def Terminal(state: list):
|
|
for win_state in win_states:
|
|
if all(state[i] == "O" for i in win_state) or all(state[i] == "X" for i in win_state):
|
|
return True
|
|
if state.count(" ") == 0:
|
|
return True
|
|
else:
|
|
return False
|
|
|
|
|
|
def Value(state):
|
|
for win_state in win_states:
|
|
if all(state[i] == "O" for i in win_state):
|
|
return -1
|
|
elif all(state[i] == "X" for i in win_state):
|
|
return 1
|
|
if state.count(" ") == 0:
|
|
return 0
|
|
|
|
|
|
def Player(state: list):
|
|
if state.count("X") == state.count("O"):
|
|
return "X"
|
|
else:
|
|
return "O"
|
|
|
|
|
|
def Actions(state):
|
|
indexes = []
|
|
for i in range(9):
|
|
if state[i] == " ":
|
|
indexes.append(i)
|
|
return indexes
|
|
|
|
|
|
def Result(state, index, player):
|
|
state[index] = player
|
|
return state
|
|
|
|
|
|
def Minimax(state):
|
|
if Terminal(state):
|
|
return Value(state)
|
|
if Player(state) == "X":
|
|
value = -9999
|
|
for a in Actions(state):
|
|
value = max(value, Minimax(Result(state.copy(), a, "X")))
|
|
return value
|
|
|
|
elif Player(state) == "O":
|
|
value = 9999
|
|
for a in Actions(state):
|
|
value = min(value, Minimax(Result(state.copy(), a, "O")))
|
|
return value
|
|
|
|
|
|
def aiO(state):
|
|
best_score = float('inf')
|
|
best_move = None
|
|
for move in Actions(state):
|
|
state[move] = 'O'
|
|
score = Minimax(state)
|
|
state[move] = ' '
|
|
if score < best_score:
|
|
best_score = score
|
|
best_move = move
|
|
return best_move
|
|
|
|
|
|
def aiX(state):
|
|
best_score = float('-inf')
|
|
best_move = None
|
|
for move in Actions(state):
|
|
state[move] = 'X'
|
|
score = Minimax(state)
|
|
state[move] = ' '
|
|
if score > best_score:
|
|
best_score = score
|
|
best_move = move
|
|
return best_move
|
|
|
|
|
|
def aiRandom(state):
|
|
return random.choice(Actions(state))
|