Логика игры в блэкджек

Я кодирую игру в блэкджек, и я очень далеко. Тем не менее, я только что дошел до того, чтобы складывать счет после каждой руки (что, как я думал, будет легко), но тузы бесконечно ломают мне голову. Поскольку в казино играют несколькими колодами, математически возможно получить до 21 туза в одной руке.

Как мне сделать цикл для прохождения ArrayList целых чисел с именем Hand, в котором есть целые числа, соответствующие картам, которые находятся в руке. БЫВШИЙ. Игрок получает и теперь у него туз, 5, 2, король, а теперь тянет туз. Arraylist для представления его руки [1, 10, 2, 5, 1]

Моя идея:

public void calculatePlayerScore()
{
    int counter = 0;
    int aceCount = 0;

    for (int i = 0; i < hand.size(); i++)
    {
        if (hand.get(i) != 1)
        {
            counter++;
        }
        else
        {
            aceCount++;
        }
    }

    for (int i = 0; i < aceCount; i++)
    {

      //Now that we know the regular cards
      //and we know how many aces there are
      //we should be able to loop to find the most
      //optimal score without busting, and pick the highest among those

    }

Если у кого-то есть идея для этого, пожалуйста, дайте мне знать. Большое спасибо за помощь.


person Hatefiend    schedule 29.03.2015    source источник
comment
Это очень широкий вопрос для этого сайта, и ответ на него потребует значительных усилий. См. stackoverflow.com/help/how-to-ask.   -  person clearlight    schedule 29.03.2015
comment
Я понимаю, что это немного необычно для вопросов, но, честно говоря, я не знаю, могу ли я задать его более кратко. Я никогда не сталкивался с ситуацией, когда числа в моем массиве могут быть либо 11, либо 1. Я спрашиваю о SO, поскольку у кого-то может быть умный метод для решения проблемы такого типа. Я извиняюсь за то, что моя строка темы была такой плохой, если кто-то может отредактировать ее на: Как подсчитать значения в ArrayList, которые могут быть либо теми, либо другими числами - игра в блэкджек.   -  person Hatefiend    schedule 29.03.2015


Ответы (4)


Обратите внимание, что только один туз может считаться за 11 в руке. (В противном случае общее количество будет не менее 22.)

Calculate hand with all aces counting 1
if ( (hand total is <= 11) AND (there is at least one ace) )
      hand total += 10  // one ace counts as 11
person beaker    schedule 29.03.2015

Только один туз может быть 11. Суммирование руки выглядит так:

public int calculateScore(Hand hand) {
    int total = 0;
    bool hasAce = false;

    for (int i = 0; i < hand.size(); i++) {
        int r = hand.get(i);
        total += r;

        if (1 == r) { hasAce = true; }
    }
    if (hasAce && total < 12) { total += 10; }
    return total;
}

В реальной игре в блэкджек вы также можете захотеть вернуть тот факт, является ли тотал руки мягким или жестким.

person Lee Daniel Crocker    schedule 29.03.2015

ЕСЛИ общая сумма руки больше 21, НО одна из карт в руке = 11, тогда сделайте 11 = 1.

person Marcel Duran    schedule 23.03.2016

Возьмите сумму вашего ArrayList "Hand" для любого местоположения, в котором вы видите "Ace", рассчитайте эту сумму с 1 или 11 в качестве добавки. Если ваша сумма больше 21, вы проиграли. Если нет, продолжайте. Если это ровно 21, добавьте эту руку к своим успехам и перестаньте бить.

Метод грубой силы для решения этой проблемы заключается в реализации функции «прогнозирования», когда вы можете один раз просмотреть всю свою руку, а затем вычислить все возможные комбинации, которые дает ваша рука, включая тузы в вашей руке как 1 или 11. . После того, как вы сгенерируете этот список возможностей, вы сможете увидеть, какая из них имеет наименьшее количество карт для создания блэкджека или наибольшего достоинства руки, и выбрать эту возможность. Это распространенная проблема алгоритма, и, вероятно, есть очень эффективные решения, на которые вы можете обратить внимание.

person Kevin Hou    schedule 29.03.2015