Слишком много операторов возврата в методе в соответствии с Java-стилем проверки, как я могу упростить мой код, чтобы он соответствовал максимуму 2?

Один из моих методов игры в баккара - проверить, может ли банкир взять третью карту в зависимости от значения руки игрока.

Сама игра имеет много условий относительно того, может ли банкир рисовать, и это привело меня к созданию метода со многими условными утверждениями. У меня слишком много возвращаемых утверждений, и я не знаю, как ограничить их до 2.

/**
     * Determines if banker draws third card.
     * @param playerCard Card object
     * @param bankerHand Hand object
     * @return boolean if banker gets third card.
     */
    public static boolean mustHit(Card playerCard, Hand bankerHand) {
        int playerValue = valueOf(playerCard);
        int bankerValue = valueOf(bankerHand);
        if (playerValue == 2 || playerValue == 3) { //player has 2 or 3
            return bankerValue >= 0 && bankerValue <= 4; //banker must have 0-4
        } else if (playerValue == 4 || playerValue == 5) { //player has 4 or 5 
            return bankerValue >= 0 && bankerValue <= 5; //banker must have 0-5
        } else if (playerValue == 6 || playerValue == 7) { //player has 6 or 7
            return bankerValue >= 0 && bankerValue <= 8; //banker must have 0-8
        } else if (playerValue == 8) { //player has 8
            return bankerValue >= 0 && bankerValue <= 2; //banker must have 0-2
        } else {
            return bankerValue >= 0 && bankerValue <= 3;
            //if none of the above, banker must have 0-3
        }
    }

Как я могу упростить это?

редактировать:

Исправлено, я, скорее всего, задумался над этим. Создал логическую переменную и назначил ее вместо возврата каждой логической.

/**
 * Determines if banker gets third card.
 * @param playerCard Card object
 * @param bankerHand Hand object
 * @return boolean if banker gets third card.
 */
public static boolean mustHit(Card playerCard, Hand bankerHand) {
    int playerValue = valueOf(playerCard);
    int bankerValue = valueOf(bankerHand);
    boolean bankerDraw = false;
    if (playerValue == 2 || playerValue == 3) {
        bankerDraw = bankerValue >= 0 && bankerValue <= 4;
    } else if (playerValue == 4 || playerValue == 5) {
        bankerDraw = bankerValue >= 0 && bankerValue <= 5;
    } else if (playerValue == 6 || playerValue == 7) {
        bankerDraw = bankerValue >= 0 && bankerValue <= 8;
    } else if (playerValue == 8) {
        bankerDraw = bankerValue >= 0 && bankerValue <= 2;
    } else {
        bankerDraw = bankerValue >= 0 && bankerValue <= 3;
    }
    return bankerDraw;
}

3 ответа

Решение

Вы можете установить bankerValue в качестве переменной и установить его значение в каждом операторе if, а затем просто вернуть bankerValue в конце операторов if.

Вы можете попробовать Switch Switch

int playerValue = valueOf(playerCard);
int bankerValue = valueOf(bankerHand); 
switch(playerValue){  
case 2: // Will roll down to the next condition.
case 3: return bankerValue >= 0 && bankerValue <= 4; break; 
case 4: 
case 5: return bankerValue >= 0 && bankerValue <= 5; break; 
case 6: 
case 7: return bankerValue >= 0 && bankerValue <= 8; break;
case 8: return bankerValue >= 0 && bankerValue <= 2; break;  
default:return bankerValue >= 0 && bankerValue <= 3; 

Вы можете переписать свой метод так:

/**
 * Determines if banker draws third card.
 * @param playerCard Card object
 * @param bankerHand Hand object
 * @return boolean if banker gets third card.
 */
public static boolean mustHit(Card playerCard, Hand bankerHand) {
    int playerValue = valueOf(playerCard);
    int bankerValue = valueOf(bankerHand);
    int bankerLimit;
    switch (playerValue) {
    case 2:
    case 3:
        bankerLimit = 4;
        break;
    case 4:
    case 5:
        bankerLimit = 5;
        break;
    case 6:
    case 7:
        bankerLimit = 8;
        break;
    case 8:
        bankerLimit = 2;
        break;
    default:
        bankerLimit = 8;
        break;
    }
    return bankerValue >= 0 && bankerValue <= bankerLimit;
}
Другие вопросы по тегам