from menace import *
import pprint
-import random
pp = pprint.PrettyPrinter()
epochs = 10
for i in range(epochs):
- print('Starting epoch', i)
- train_players(p1, p2, rounds=10**5)
+ print('Starting epoch', i)
+ train_players(p1, p2, rounds=10**5)
# pp.pprint(p1)
# pp.pprint(p2)
ph = new_human()
game_with_players(p1, ph, report_result_for=ph)
-
-
-
from nac import *
-import itertools
-import functools
import collections
import random
def new_game(player1, player2):
return {'board': empty_board(),
- 'player1': player1,
- 'player2': player2,
- 'player1_active': True,
- 'history': []}
+ 'player1': player1,
+ 'player2': player2,
+ 'player1_active': True,
+ 'history': []}
+
def game_finished(game):
return (winner(game['board']) is not None) or (game['board'].count('.') == 0)
boxes[b] = box
return boxes
+
def menace_move(game):
board, r, f = canonical(game['board'])
player = active_player(game)
moved_board = untransform(cmove_board, r, f)
return moved_board.index(token)
+
def new_human():
return {'human?': True}
print('Please enter a number.')
return move
+
def make_move(game):
if game['player1_active']:
active = game['player1']
while not game_finished(game):
make_move(game)
+
def winning_player(game):
if winner(game['board']) is None:
return None
else:
return game['player2']
+
def losing_player(game):
if winner(game['board']) is None:
return None
return [h for h in game['history']
if h['player1?'] == game['history'][-1]['player1?']]
+
def losing_moves(game):
return [h for h in game['history']
if h['player1?'] != game['history'][-1]['player1?']]
cmove = cmove_board.index('+')
player[board][cmove] += 1
+
def update_loser(game, allow_drop_move=False):
player = losing_player(game)
moves = losing_moves(game)
player[board][cmove] -= 1
-
def count_wins(p1, p2, plays=1000):
wins = 0
draws = 0
play_game(g)
if report_result_for:
- print('\nFinal position')
- print(show_board(g['board']))
- if winner(g['board']) is None:
- print('A draw')
- elif winning_player(g) == ph:
- print('You won')
- else:
- print('You lost')
-
+ print('\nFinal position')
+ print(show_board(g['board']))
+ if winner(g['board']) is None:
+ print('A draw')
+ elif winning_player(g) == ph:
+ print('You won')
+ else:
+ print('You lost')
return g
+
def train_players(p1, p2, rounds=10000, allow_drop_move=False):
for _ in range(rounds):
g = game_with_players(p1, p2)
update_players(g, allow_drop_move=allow_drop_move)
return p1, p2
-
\ No newline at end of file
import itertools
-import functools
-import collections
-import random
+
def xo_count(board):
xs = 0
os += 1
return xs, os
+
def valid_board(board):
xs, os = xo_count(board)
return (xs - os) == 0 or (xs - os) == 1
+
def empty_board():
return tuple('.' * 9)
def all_boards():
return [b for b in itertools.product('.xo', repeat=9)
- if valid_board(b)
- ]
+ if valid_board(b)]
+
def winner(board):
winning_player = None
s = ''.join(b)
return s[0:3] + '\n' + s[3:6] + '\n' + s[6:9]
+
def show_boards(bs):
rows = [[], [], []]
for b in bs:
# 6 7 8 8 7 6
reflection = {0: 2, 1: 1, 2: 0, 3: 5, 4: 4, 5: 3, 6: 8, 7: 7, 8: 6}
+
def rotate(board, n=1):
b = board
for _ in range(n):
else:
return board
+
def transform(board, n, r):
b = rotate(board, n)
return reflect(b, r)
+
def untransform(board, n, r):
b = reflect(board, r)
return rotate(b, abs(4-n))
+
def all_transforms(board):
return [(transform(board, rot, ref), rot, ref)
for rot in range(4)
for ref in [False, True]]
+
def score(board):
return ''.join(board)
+
def canonical(board):
return max(all_transforms(board), key=lambda brf: score(brf[0]))
+
def non_winning_boards():
return set([canonical(b)[0] for b in all_boards()
- if not winner(b)
- ])
+ if not winner(b)])
def successors(board):
def apply_move(board, position, piece):
return tuple(board[:position] + (piece,) + board[position+1:])
+
def token_for_player(is_player_1):
if is_player_1:
return 'x'
else:
return 'o'
-
\ No newline at end of file