def test_is_terminal(self): for b in [DEMO_BOARD_1, DEMO_BOARD_2]: board = MinMax(b, 'x') self.assertFalse(board.is_terminal, 'this board should not be terminal: %s' % b) for b in [DEMO_BOARD_3, DEMO_BOARD_4]: board = MinMax(b, 'x') self.assertTrue(board.is_terminal, 'this board should be terminal: %s' % b)
def test_get_children(self): board = MinMax(DEMO_BOARD_1, 'x') # this board has player 'x', children should have player 'o' count = 0 for child, move in board._get_children(): self.assertEquals(child.player, 'o', 'child has wrong player set') self.assertTrue(move in [5, 6, 7], 'unexpected move: %s' % move) count += 1 self.assertEquals(count, 3, "wrong number of children: %s" % count)
def move(request): cell_id = request.GET.get('cell_id', _marker) player = request.GET.get('player', _marker) if player == _marker: # we don't know who's turn it is. error out return json_response('error') board = get_current_board(request) cell = None if cell_id == _marker: # the computer did this one. Make a move time.sleep(0.25) engine = MinMax(board, player) score, cell = engine.choose(8, -999999, 999999) board[cell] = player else: # the human did it, check the incoming value try: cell = int(cell_id) except ValueError: return json_response('error') else: # make a new engine with the player's choice and get the score board[cell] = player request.session['board'] = board engine = MinMax(board, player) score = engine.score if engine.is_terminal: if abs(score) > 200: return json_response('win', value=cell, player=player) else: return json_response('tie', value=cell, player=player) return json_response(value=cell, player=player)