Ответ 1
Просто относитесь к каждому тузу как 11. Тогда, когда значение больше 21, вычтите 10 из вашей общей суммы для каждого туза в вашей руке.
У моего киддо было домашнее задание написать Блэкджек на Java. Я помог ему немного, но по большей части он все это сделал сам, и на самом деле он неплохо играет. Он даже поймал ошибку, которую я не видел в том, как она вычисляет значения рук. Тем не менее, есть проблема, с которой он не справился, и каждое решение, о котором я могу думать, действительно сложное и далеко за рамки того, что он сможет легко кодировать своими еще рудиментарными навыками Java.
Туз. На самом деле, не только один туз, там четверо, и вы могли бы собрать всех четверо из них в одной руке. Как вы изящно занимаетесь вычислением стоимости карты, когда есть один или несколько тузов, каждый из которых может быть оценен в один или одиннадцать. Я чувствую, что для этого должен быть изящный алгоритм, но я этого не вижу. Конечно, частью этого может быть только то, что я устал, но, возможно, вы можете помочь.
Просто относитесь к каждому тузу как 11. Тогда, когда значение больше 21, вычтите 10 из вашей общей суммы для каждого туза в вашей руке.
Вы будете использовать только один туз для 11 очков. Итак, рассчитайте всех, кроме последнего туза, как 1, и если у вас 10 или меньше очков, последний туз считается 10.
Только 1 Ace всегда считается 11.
Таким образом, альтернативный метод лечения каждого Ace как 11 будет рассматривать каждый Ace как 1. Затем добавьте 10 к общей величине (переносимой независимо от Ace под рукой) и сохраните ее в отдельной "высокой" переменной (значение + 10). Также создайте логическое значение ~ ace: true, если (любой) появляется туз.
И поэтому при проверке счета против дилера; проверьте, есть ли у игрока рука (любой) Ace, и в этом случае вы можете использовать "высокое" значение, в противном случае (без Ace) использовать "низкое" значение.
Таким образом, King + 9 + Ace (возможно, плохой пример) будет ~ низким: 20 и высокий: 30 и туз: true - с этой информацией вы можете проверить, будет ли 30 - 10 "выиграть игру". Итак, King + 5 + 5 (low: 20 high: 30 ace: false) не будет использовать это значение 30.
Я использую этот метод, поэтому я знаю, когда показывать alt. Оценка туза на экране; как 3/13 (Ace + 2), используя тот же туз: true | false boolean, который у меня уже есть. Это, безусловно, тот же самый ответ, что и первый, но это имеет для меня больше смысла:)
Независимо от того, что должен подсчитать каждый туз, чтобы суммировать значение как 11, тогда, когда общая сумма достигла более 21, вычитайте 10 из руки, но дело в том, что вы должны следить за тем, сколько раз вы вычитаете 10 и сколько раз вы добавляете 11 (туз),
добавить 11 >= вычесть 10 - всегда нужно выполнить
пример alorithm:
int sum=0;
int ace=0;
int subtract=0;
while(!busted or !stay)
{
Hitme(value);
if(value=11)ace++;
sum+=value;
if(sum>21)
{
if(ace>=1)
{
if(ace>=subtract)
{
sum-=10
subtract++;
}
else
{
busted;
}
}
else
{
busted;
}
}
else
{
hit or stay;
//of course if sum== 21 then force stay
}
}
Как и elundmark answer...
Вероятнее всего, вы получили метод, который оценивает значение руки блэкджека. Всегда оценивайте тузы в одной точке. Если в руке есть туз, вычислите жесткое значение (все тузы - единицы, +10) и мягкое значение (все тузы).
Если жесткое значение не является бюстом, верните жесткое значение. Если жесткое значение является бюстом, верните мягкое значение.
пример 1
2, A, A
жесткое значение 2 + 1 + 1 + 10 = 14
мягкое value = 2 + 1 + 1 = 4
21, поэтому возвращаем твердую величину (ручное значение равно 14)
пример 2
2, A, A, 8
твердое value = 2 + 1 + 1 + 8 + 10 = 22 (бюст)
мягкое value = 2 + 1 + 1 + 8 = 12
hard value > 21, поэтому возвращайте мягкое значение (ручное значение равно 12)
Традиционное мышление о правилах и способе игры играет в том, что значение Ace является условным и может иметь два значения: 1 или 11. Эта концепция трудно реализовать. Программисту гораздо проще подсчитать все тузы как значение одного и условно добавить 10 очков к ручному значению. Таким образом, ваш рейтинг карт или значение может оставаться жестким и простым. Я экспериментировал с этим раньше, возвращая коллекцию значений и пару других методов. Это боль, и не стоит того, чтобы только один ранг Ace.
Если вы хотите показать alt на экране, как 2/12, вместо того, чтобы возвращать Integer, просто верните объект "BlackjackValue", который содержит объект Integer и String, который вы создаете в методе, который оценивает значение вашей руки.
short aces_count = 0;
short non_aces_sum = 0;
short global_sum = 0;
foreach card in _card:{
if( card.value != 11 ){ // assuming ace value is 11
if( card.value > 10 )
non_aces_sum += 10;
else
non_aces_sum += card.value
}else
aces_count += 1;
}
short aces_sum = 0;
if( aces_count > 0) aces_sum = 11;
for(int i=0 ; i < aces_count - 1; i++){ // - 1 cuz already asigned first ace
aces_sum += 1; // 2x aces == 22 so max 1 ace has value 11
}
if(aces_sum + non_aces_sum > 21)
aces_sum = aces_count; // no need for an 11 value ace, so all are 1
global_sum = non_aces_sum + aces_sum;
Проблема в том, что она не определена: вы можете считать (как я понимаю правила) туз как 1 или 11. Но вы знаете, что вы не будете считать его как 11 каждый раз, потому что вы разобьете.
Единственное решение, которое я считаю, - вычислить оценку для каждого возможного значения туза, где сумма <= 21.