1 changed files with 78 additions and 0 deletions
@ -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) |
|||
|
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue