def test_reset(self): s = State() result = self.app.get('/reset') jd = json.loads(result.data) jd['can_castle'] = tuple(jd['can_castle']) actual = State.from_dict(jd['pieces'], jd['turn'], jd['in_check'], jd['can_castle'], jd['prev_move']) self.assertEqual(s, actual, 'Reset board state')
def make_move_ai(): data = request.get_json() try: state = State.from_dict(data['pieces'], data['turn'], data['in_check'], data['can_castle'], data['prev_move']) except Exception as e: if not app.testing: app.logger.exception(e) raise MalformedRequestException(str(e)) piece = 1 << data['piece'] target = 1 << data['target'] promo_type = data.get('promotion_type', 'q') if promo_type not in c2ix: raise IllegalMoveException() an = state.to_algebraic_notation(piece, target, c2ix[promo_type]) new_state = state.get_child(piece, target, c2ix[promo_type]) ai_an = None if not new_state.is_terminal(): ai_piece, ai_target = agent.select_move(new_state) ai_an = new_state.to_algebraic_notation(ai_piece, ai_target) new_state = new_state.get_child(ai_piece, ai_target) moves = new_state.list_legal_moves() legal_move_dict = {} for piece, target in moves: legal_move_dict[piece.bit_length() - 1] = legal_move_dict.get( piece.bit_length() - 1, []) + [target.bit_length() - 1] d = new_state.to_dict() d['legal_moves'] = legal_move_dict if ai_an is not None: d['AN'] = [an, ai_an] else: d['AN'] = [an] response = jsonify(d) response.status_code = 200 return response
def make_move(): data = request.get_json() app.logger.debug(data) try: state = State.from_dict(data['pieces'], data['turn'], data['in_check'], data['can_castle'], data['prev_move']) except Exception as e: if not app.testing: app.logger.exception(e) raise MalformedRequestException(str(e)) piece = 1 << data['piece'] target = 1 << data['target'] promo_type = data.get('promotion_type', 'q') if promo_type not in c2ix: raise IllegalMoveException() an = state.to_algebraic_notation(piece, target, c2ix[promo_type]) app.logger.debug(f'Piece: {data["piece"]}, Target: {data["target"]}, ' f'Turn: {data["turn"]}') app.logger.debug(state) app.logger.debug((state.white, state.black, state.castles)) new_state = state.get_child(piece, target, c2ix[promo_type]) moves = new_state.list_legal_moves() legal_move_dict = {} for piece, target in moves: legal_move_dict[piece.bit_length() - 1] = legal_move_dict.get( piece.bit_length() - 1, []) + [target.bit_length() - 1] d = new_state.to_dict() d['legal_moves'] = legal_move_dict d['AN'] = [an] response = jsonify(d) response.status_code = 200 return response
def test_valid_nowin(self): s = State() request = s.to_dict() request.pop('winner', None) request['piece'] = 1 request['target'] = 18 result = self.app.post('/moveai', data=json.dumps(request), headers={'content-type': 'application/json'}) self.assertEqual(200, result.status_code, 'Status is OK') move_one = s.get_child(1 << 1, 1 << 18) possible_children = set(move_one.get_children()) data = json.loads(result.data) actual = State.from_dict(data['pieces'], data['turn'], data['in_check'], data['can_castle'], data['prev_move']) self.assertTrue(actual in possible_children, 'Valid responding move')