コード例 #1
0
ファイル: server_test.py プロジェクト: cnapun/python-chess
    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')
コード例 #2
0
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
コード例 #3
0
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
コード例 #4
0
ファイル: server_test.py プロジェクト: cnapun/python-chess
    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')