diff --git a/tic-tac-toe.py b/tic-tac-toe.py new file mode 100644 index 0000000..9310ebb --- /dev/null +++ b/tic-tac-toe.py @@ -0,0 +1,78 @@ +import itertools +import json +EMPTY = ' '*9 +def get_pos(x,y,board): + i=3*y+x + return board[i] + +def set_pos(x,y,marker,board): + i=3*y+x + return board[:i]+marker+board[i+1:] + +def print_board(board): + l = ('|'.join(board[i:i+3]) for i in range(0,9,3)) + print('\n-----\n'.join(l)) + +def check_win(board): + rows = ['']*3 + cols = ['']*3 + diags = ['']*2 + for y in range(3): + for x in range(3): + cur = get_pos(x,y,board) + rows[y] += cur + cols[x] += cur + if x == y: + diags[0] += cur + if x == (2-y): + diags[1] += cur + for thing in rows+cols+diags: + if thing == 'ooo': + return 'o' + if thing == 'xxx': + return 'x' +INIT_MOVES = set(itertools.product( *(range(3),)*2 )) +def recurse(board=EMPTY,moveset=INIT_MOVES,x=True): + #print_board(board) + #print('-'*3) + ret = {}# {'parent':parent} + for move in moveset: + if x: + cur_board = set_pos(*move,'x',board) + else: + cur_board = set_pos(*move,'o',board) + if len(moveset) > 1: + cur_moves = moveset.copy() + cur_moves.remove(move) + ret[cur_board] = recurse(cur_board,cur_moves,not x) + else: + ret[cur_board] = None + return ret +def save(): + moves = recurse() + with open('tree.json','w') as file: + json.dump(moves,file,indent=4) + return moves +def count_wins(moves): + x_total = 0 + o_total = 0 + for board,sub_board in moves.items(): + if len(board) == 9: + if sub_board is not None: + sub_x_total,sub_o_total = count_wins(sub_board) + x_total += sub_x_total + o_total += sub_o_total + else: + win = check_win(board) + if win is not None: + if win == 'x': + x_total += 1 + else: + o_total += 1 + moves['x'] = x_total + moves['o'] = o_total + return x_total,o_total +def load(): + with open('tree.json') as file: + return json.load(file) +