bool MaximiseOwnMovementRule::applicable(Gameboard board, int player)
{
    int max = -1;
    int x = qrand()%8;
    int y = qrand()%8;
    int xstart = x;
    int ystart = y;
    int xmax = -1;
    int ymax = -1;
    Gameboard testboard;

    do
    {
        do
        {
            testboard = board;

            if(testboard.play(x,y,player))
            {
                int temp = 0;

                for(int newX = 0; newX < 8; ++newX)
                {
                    for(int newY = 0; newY < 8; ++newY)
                    {
                        if(testboard.play(newX, newY,player,true))
                        {
                            ++temp;
                        }
                    }
                }

                if(temp > max && (!canTakeCorner(testboard, opponent(player))) && (!canGetZeroDiscs(testboard,player)))
                {
                    max = temp;
                    xmax = x;
                    ymax = y;
                }
            }

            y = (y+1)%8;
        }while(y != ystart);

        x = (x+1)%8;
    }while(x != xstart);

    if(max >= _borderMoves)
    {
        _x = xmax;
        _y = ymax;
        _asked = true;
    }
    else
    {
        _x = -1;
        _y = -1;
        _asked = false;
    }
    return _asked;
}
void MinimiseOpponentMovementRule::doTurn(Gameboard board, int player)
{
    calculateMove(board, player);
    if(_asked)
    {
        int x = _x;
        int y = _y;
        deleteMove();
        emit turn(x,y);
        return;
    }
    else
    {
        possibleMove move = getPossibleTurn(board, player);
        if(move.possible)
        {
            emit turn(move.x, move.y);
        }
        else
        {
            qCritical() << "FATAL ERROR in " __FILE__ << " " << __LINE__ << ": No possible move";
        }
    }
}
void MaximiseOwnMovementRule::doTurn(Gameboard board, int player)
{
    calculateMove(board, player);
    if(_asked)
    {
        int x = _x;
        int y = _y;
        deleteMove();
        emit turn(x,y);
        return;
    }
    else
    {
        possibleMove move = getPossibleTurn(board, player);
        if(move.possible)
        {
            emit turn(move.x, move.y);
        }
        else
        {
            REVERSI_ERROR_MSG("No possible move");
        }
    }
}
bool MinimiseOpponentMovementRule::calculateMove(Gameboard board, int player)
{
    int min = 100;
    int x = qrand()%8;
    int y = qrand()%8;
    int xstart = x;
    int ystart = y;
    int xmin = -1;
    int ymin = -1;
    int opponentPlayer = opponent(player);
    Gameboard testboard;

    do
    {
        do
        {
            testboard = board;

            if(testboard.play(x,y,player))
            {
                int temp = 0;

                for(int opponentX = 0; opponentX < 8; ++opponentX)
                {
                    for(int opponentY = 0; opponentY < 8; ++opponentY)
                    {
                        if(testboard.play(opponentX, opponentY,opponentPlayer,true))
                        {
                            ++temp;
                        }
                    }
                }

                if(temp < min && (!canTakeCorner(testboard, opponent(player))) && (!canGetZeroDiscs(testboard,player)))
                {
                    min = temp;
                    xmin = x;
                    ymin = y;
                }
            }

            y = (y+1)%8;
        }while(y != ystart);

        x = (x+1)%8;
    }while(x != xstart);

    if(min <= _borderMoves)
    {
        _x = xmin;
        _y = ymin;
        _asked = true;
    }
    else
    {
        _x = -1;
        _y = -1;
        _asked = false;
    }
    return _asked;
}