Есть ли элегантный способ борьбы с тузом в блэкджеке? - PullRequest
14 голосов
/ 08 мая 2009

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

Туз. На самом деле, не один туз, их четверо, и вы можете получить все четыре в одной руке. Как вы изящно справляетесь с подсчетом стоимости карточной руки, когда есть один или несколько тузов, каждый из которых может быть оценен в один или одиннадцать. Я чувствую, что для этого должен быть изящный алгоритм, но я его не вижу. Конечно, отчасти это может быть из-за того, что я устал, но, может быть, вы можете помочь.

Ответы [ 7 ]

24 голосов
/ 08 мая 2009

Просто отнеситесь к каждому тузу как 11. Тогда, когда значение больше 21, вычтите 10 из вашей суммы для каждого туза в вашей руке.

7 голосов
/ 08 мая 2009

Вы будете использовать только 1 туза для 11 очков. Поэтому рассчитайте все, кроме последнего туза, как 1, и если у вас 10 или меньше очков, последний туз считается как 10.

5 голосов
/ 17 сентября 2010

Только 1 туз считается 11.

Таким образом, альтернативный способ рассматривать каждого туза как 11 - это рассматривать каждого туза как 1. Затем добавьте 10 к общему значению (переносится независимо от туза под рукой) и сохраните его в отдельной «высокой» переменной (значение + 10). Также создайте логическое значение ~ ace: true, если (любой) туз появится.

И так при сверке счета с дилером; проверьте, есть ли на руке игрока (любой) туз, и в этом случае вы можете (можете) использовать значение "high", в противном случае (без туза) используйте значение "low".

Таким образом, King + 9 + Ace (возможно, плохой пример) будет ~ low: 20 & high: 30 & ace: true - С помощью этой информации вы можете проверить, «выиграет ли игра 30 - 10». Таким образом, King + 5 + 5 (low: 20 high: 30 ace: false) не будет использовать свое высокое значение 30.

Я использую этот метод, поэтому я знаю, когда показывать альт. Туз на экране; как 3/13 (туз + 2), используя ту же туз: true | ложное логическое значение, которое у меня уже есть. Это, конечно, тот же ответ, что и первый, но для меня это имеет больше смысла:)

3 голосов
/ 08 мая 2009

Независимо от того, что каждый туз следует считать суммой 11, тогда, когда общая сумма превысила 21, вычтите из руки 10, но дело в том, что вы должны следить за тем, сколько раз вычтите 10 и сколько раз вы добавляете 11 (туз),

добавить 11> = вычесть 10 - всегда должно быть удовлетворено

Пример алгоритма:

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

  }
}
2 голосов
/ 18 октября 2012

Аналогично ответу Elundmark ...

Скорее всего, у вас есть метод, который оценивает значение руки блэкджека. Всегда цените тузов в одной точке. Если в руке есть туз, вычислите жесткое значение (все тузы равны +10) и мягкое значение (все тузы).

Если сложное значение не является перебором, верните сложное значение. Если жестким значением является перебор, верните мягкое значение.

пример 1
2, А, А
твердое значение 2 + 1 + 1 + 10 = 14
мягкое значение = 2 + 1 + 1 = 4

жесткое значение <21, поэтому верните сложное значение (значение руки 14) </p>

пример 2
2, А, А, 8
твердое значение = 2 + 1 + 1 + 8 + 10 = 22 (бюст)
мягкое значение = 2 + 1 + 1 + 8 = 12

жесткое значение> 21, поэтому возвращает мягкое значение (значение руки 12)

Традиционное представление о правилах и способе игры состоит в том, что значение туза условно и может иметь два значения: 1 или 11. Эту концепцию сложно реализовать. Программисту намного проще посчитать все тузы как значение одного и условно добавить 10 очков к значению руки. Таким образом, реализация ранга или стоимости вашей карты может оставаться жесткой и простой. Я экспериментировал с этим раньше, возвращая коллекцию значений и пару других методов. Это боль, и она не стоит того, чтобы получить только одно звание Эйса.

Если вы хотите показать alt на экране, например 2/12, вместо того, чтобы возвращать Integer, просто верните объект "BlackjackValue", который содержит Integer и объект String, который вы создаете в методе, который оценивает значение вашей руки .

0 голосов
/ 26 июня 2017
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;
0 голосов
/ 08 мая 2009

Проблема в том, что он не определен: вы можете посчитать (как я понимаю правила) туза как 1 или 11. Но вы знаете, что не будете считать его как 11 каждый раз, потому что вы обанкротитесь .

Единственное решение, которое я думаю, состоит в том, чтобы вычислить оценку для каждого возможного значения туза, где сумма <= 21. </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...