Esempio n. 1
0
// cases 4-7
void test_disjoint_corner()
{
    bool all_pass = false;
    
    rect_list_type cliprects;
    rect_type mainrect(40,40,20,20);
    rect_type ul(35,55,10,10);
    rect_type ur(55,55,10,10);
    rect_type ll(35,35,10,10);
    rect_type lr(55,35,10,10);

    // upper left
    cliprects = disjoint_union(mainrect, ul);
    rect_type ul_1(35, 55, 5, 5);
    rect_type ul_2(35, 60, 10, 5);
    all_pass = (cliprects.size() == 3) && rect_list_contains(cliprects, ul_1) && \
               rect_list_contains(cliprects, ul_2) && rect_list_contains(cliprects, mainrect);
    if (!all_pass)
    {
        printf("Error in test_disjoint_corner()i: upper left\n");
    }

    // lower left
    cliprects = disjoint_union(mainrect, ll);
    rect_type ll_1(35, 35, 10, 5);
    rect_type ll_2(35, 40, 5, 5);
    all_pass = (cliprects.size() == 3) && rect_list_contains(cliprects, ll_1) && \
               rect_list_contains(cliprects, ll_2) && rect_list_contains(cliprects, mainrect);
    if (!all_pass)
    {
        printf("Error in test_disjoint_corner()i: upper left\n");
    }

    // upper right
    cliprects = disjoint_union(mainrect, ur);
    rect_type ur_1(55, 60, 10, 5);
    rect_type ur_2(60, 55, 5, 5);
    all_pass = (cliprects.size() == 3) && rect_list_contains(cliprects, ur_1) && \
               rect_list_contains(cliprects, ur_2) && rect_list_contains(cliprects, mainrect);
    if (!all_pass)
    {
        printf("Error in test_disjoint_corner()i: upper right\n");
    }

    // lower right
    cliprects = disjoint_union(mainrect, lr);
    rect_type lr_1(55, 35, 10, 5);
    rect_type lr_2(60, 40, 5, 5);
    all_pass = (cliprects.size() == 3) && rect_list_contains(cliprects, lr_1) && \
               rect_list_contains(cliprects, lr_2) && rect_list_contains(cliprects, mainrect);
    if (!all_pass)
    {
        printf("Error in test_disjoint_corner()i: lower right\n");
    }
}
Board::MoveList Board::nextMoves()
{
    Board::MoveList moves;
    checkers::Color player = this->currentPlayer();
    checkers::Move nil_move;

    for (int l = 0; l < 10; ++l)
    {
        for (int c = 0; c < 0; ++c)
        {
            if (_board[l][c].state != checkers::Empty
                    && _board[l][c].color != checkers::NoColor
                    && _board[l][c].piece != checkers::NoPiece
                    && _board[l][c].color == player)
            {
                int way = (player == checkers::White ? -1 : 1);
                int d_way = 2 * way;
                int promo = (player == checkers::White ? 9 : 0);

                checkers::Position ul_1(l + way, c - 1);
                checkers::Position ur_1(l + way, c + 1);

                checkers::Position bl_1(l - way, c - 1);
                checkers::Position br_1(l - way, c + 1);
                // takes
                checkers::Position ul_2(2 + d_way, c - 2);
                checkers::Position ur_2(2 + d_way, c + 2);

                checkers::Position bl_2(2 - d_way, c - 2);
                checkers::Position br_2(2 - d_way, c + 2);

                checkers::Position off[4];
                checkers::Position off_take[4];

                off[0] = ul_1;
                off[1] = ur_1;
                off[2] = bl_1;
                off[3] = br_1;

                off_take[0] = ul_2;
                off_take[1] = ur_2;
                off_take[2] = bl_2;
                off_take[3] = br_2;

                int most = (_board[l][c].piece == checkers::Lady ? 4 : 2);

                // moves
                for (int i = 0; i < most; ++i)
                {
                    checkers::Move move;
                    int flags = 0;

                    move.color = player;
                    move.valid = true;
                    // moves
                    if (_board[off[i].first][off[i].second].state == checkers::Empty
                            && _board[off[i].first][off[i].second].piece == checkers::NoPiece
                            && _board[off[i].first][off[i].second].color == checkers::NoColor
                            )
                    {
                        move.start = _board[l][c].pos;
                        move.finish = _board[off[i].first][off[i].second].pos;
                        flags |= checkers::ValidMove;
                        if (off[i].first == promo)
                            flags |= checkers::isPromotion;

                        move.type = static_cast<checkers::MoveType>(flags);
                        moves.push_back(move);
                    }
                }
                // take
                for (int i = 0; i < most; ++i)
                {
                    checkers::Move move;
                    int flags = 0;

                    move.color = player;
                    move.valid = true;

                    if (_board[off_take[i].first][off_take[i].second].state == checkers::Empty
                            && _board[off_take[i].first][off_take[i].second].piece == checkers::NoPiece
                            && _board[off_take[i].first][off_take[i].second].color == checkers::NoColor
                            && _board[off[i].first][off[i].second].state != checkers::Empty
                            && _board[off[i].first][off[i].second].piece != checkers::NoPiece
                            && _board[off[i].first][off[i].second].color != player
                            )
                    {
                        move.start = _board[l][c].pos;
                        move.taken = _board[off[i].first][off[i].second].pos;
                        move.finish = _board[off_take[i].first][off_take[i].second].pos;
                        flags |= checkers::ValidMove;
                    }
                    flags |= checkers::isTake;
                    if (off_take[i].first == promo)
                        flags |= checkers::isPromotion;

                    move.type = static_cast<checkers::MoveType>(flags);
                    moves.push_back(move);
                }
            }
        }
    }
    return moves;
}