Removing obsolete ttt_learn
This commit is contained in:
parent
13997976f0
commit
fa5b4c6c1a
78
ttt_learn.py
78
ttt_learn.py
|
@ -1,78 +0,0 @@
|
|||
|
||||
# A state is a dictionary with two keys, "board" and "player." Here's an example:
|
||||
#
|
||||
# {
|
||||
# "board": [None, None, "X", None, "O", None, "X", "O", None],
|
||||
# "player": "X",
|
||||
# }
|
||||
|
||||
from itertools import count
|
||||
counter = count()
|
||||
|
||||
def get_actions(state):
|
||||
"""Given a board state, returns a dictionary whose keys are possible actions and whose
|
||||
values are the resulting state from each action. If the game is over, returns an empty
|
||||
dictionary because no further moves are possible.
|
||||
"""
|
||||
if is_over(state):
|
||||
return {}
|
||||
else:
|
||||
actions = {}
|
||||
for i in range(9):
|
||||
if state["board"][i] is None or state["board"][i] == ' ':
|
||||
actions[i] = get_next_state(state, i)
|
||||
return actions
|
||||
|
||||
def choose_best_action(state, depth=0, explain=False):
|
||||
"""Given a state, returns the best action, its resulting state, and that state's value.
|
||||
For each possible action, we find the value of the resulting state.
|
||||
Then, if the player is 'X', choose the action corresponding to the highest
|
||||
value. If the player is 'O', choose the action corresponding to the lowest
|
||||
value.
|
||||
"""
|
||||
if explain:
|
||||
question_number = next(counter)
|
||||
pose_question(state, question_number, depth)
|
||||
actions = get_actions(state)
|
||||
values_and_actions = []
|
||||
for action, result in actions.items():
|
||||
values_and_actions.append([get_value(result, depth=depth, explain=explain), action])
|
||||
if state["player"] == "X":
|
||||
value, action = max(values_and_actions)
|
||||
else:
|
||||
value, action = min(values_and_actions)
|
||||
if explain:
|
||||
answer_question(state, action, question_number, depth)
|
||||
return action, actions[action], value
|
||||
|
||||
def get_value(state, depth=0, explain=False):
|
||||
"""Determines the value of the state.
|
||||
"""
|
||||
if is_win(state, 'X'):
|
||||
return 1
|
||||
elif is_win(state, 'O'):
|
||||
return -1
|
||||
elif is_draw(state):
|
||||
return 0
|
||||
else:
|
||||
action, result, value = choose_best_action(state, depth=depth+1, explain=explain)
|
||||
return value
|
||||
|
||||
# =========================================================================================
|
||||
# ================================== HELPERS ==============================================
|
||||
# =========================================================================================
|
||||
|
||||
def pose_question(state, index, depth):
|
||||
"Logs a question asking about a player's best move at a state."
|
||||
board = format_board_inline(state['board'])
|
||||
log(f"What is the best action for {state['player']} at {board}?", index, depth)
|
||||
|
||||
def answer_question(state, action, index, depth):
|
||||
"Logs the answer to a question about a player's best move at a state."
|
||||
board = format_board_inline(state['board'])
|
||||
log(f"The best action for {state['player']} at {board} is {action}", index, depth)
|
||||
|
||||
def log(message, index, depth):
|
||||
"Prints a message at the appropriate depth, with each message numbered."
|
||||
indent = ' ' * depth
|
||||
print(f"{indent}{index}. {message}")
|
Loading…
Reference in New Issue