Слишком много операторов возврата в методе в соответствии с 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;
}