Как проверить комбинацию Rummikub с джокерами - PullRequest
2 голосов
/ 14 сентября 2010

В игре Rummikub для тех, кто этого не знает, у вас есть плитки в 4 цветах и ​​с 13 различными числами на них (то есть 4 x 13 = 52 уникальных плитки), которые вы должны использовать для создания групп.Существует два вида групп:

  • Различные цвета, одинаковые номера (например, R1-B1-G1)
  • Одинаковые цвета, последовательность чисел (например, G6-G7-G8)

Я пишу код, который берет список плиток и проверяет, является ли это правильной комбинацией.Пока это работает и довольно просто.

Сложно, когда мы представляем плитки Джокера.Вы можете использовать их как любую плитку для завершения комбинации (например, G6-R6-J), и вы можете использовать несколько (например, R4-R5-J-J-R8).

Я решил, что проверю комбинации с Джокерами в два этапа:

  1. Заменить всех джокеров на плитку, за которую они стоят.
  2. Подтвердить "нормализованную" группу с помощью существующего кода (если шаг 1 не выдал ошибку, потому что он уже видел комбинациюневерно).

Теперь, как сделать шаг 1?Я думаю, что это довольно просто, если разрешен только один Джокер на группу:

  • Если плитки рядом с Джокером имеют одинаковый цвет, а правый на 2 выше, чем левый, замените начисло между
  • Если соседние плитки имеют одинаковое число, но разные цвета, замените их на цвет, которого еще нет.
  • И такой же, но немного измененный, если Джокер находится в началеили конец

К сожалению, допускается несколько джокеров, что делает это немного сложнее, и я застрял на том, как решить эту проблему.

Ответы [ 2 ]

2 голосов
/ 29 ноября 2011

Недавно я написал игру для Android Rummikub и, возможно, мой код поможет вам (или может быть слишком поздно; но все же может помочь кому-то еще). Я не уверен, есть ли ошибки в этом. Потому что я не очень много проверял.

Я предполагаю число от 0 до 105.
Соответствующие карты: черный красный желтый зеленый и GhostCard (B1 ~ 0, B13 ~ 12, R1 ~ 13 ... G13 ~ 51, B1 ~ 52 ... G13 ~ 103 GHOST1 ~ 104, GHOST2 ~ 105)

Вот код:

public boolean isLegal(List<Byte> cards)
{
    byte ghostNum = 0; 
    byte ghostRemain = 0;
    byte size = (byte) cards.size();
    if (size == 0)
    {
        return true;
    }
    else if (size < 3)
    {
        return false;
    }

    //get the num of ghostcard
    Collections.sort(cards);
    if (cards.get(size - 1) >= 104)
    {
        ghostNum++;
        if (cards.get(size - 2) >= 104)
        {
            ghostNum++;
        }
    }
    ghostRemain = ghostNum;

    byte[] a = new byte[size - ghostNum];
    byte[] b = new byte[size - ghostNum];
    for (byte i = 0; i < size - ghostNum; i++)
    {
        a[i] = (byte) (cards.get(i) % 13); // the num of the tiles 0~12
        b[i] = (byte) ((cards.get(i) / 13) % 4); // the color of the tiles 0~3(B,R,Y,G)
    }
    Arrays.sort(a);
    Arrays.sort(b);
    // tiles seems in same color
    if (b[0] == b[size - 1 - ghostNum])
    {
        for (int i = 0; i < size - 1 - ghostNum; i++)
        {
            if (a[i + 1] - a[i] != 1)
            {
                ghostRemain = (byte) (ghostRemain - a[i + 1] + a[i] + 1);
                if (ghostRemain < 0)
                {
                    return false;
                }
            }
            if (b[i] != b[i + 1])
            {
                return false;
            }
        }
        return true;
        // tiles in different colors
    }
    else if (b[0] != b[1])
    {
        for (int i = 0; i < size - 1 - ghostNum; i++)
        {
            if (a[i] != a[i + 1])
            {
                return false;
            }
            if (b[i] == b[i + 1])
            {
                return false;
            }
        }
        return true;
    }
    return false;
}
2 голосов
/ 26 сентября 2010

Если вы настаиваете на выполнении шага 1 как первое, что делаете, вы создаете себе проблемы.Просто с вычислительной точки зрения неэффективно подходить к проблеме с этой точки зрения.То, что вы в конечном итоге сделаете с таким подходом, - это попробовать все комбинации замен для джокеров.Это плохая идея.

Вот альтернативный подход, который будет работать без особых усилий:

  1. Содержит ли группа 0 или 1 не джокера, и содержит ли группа хотя бытри фигуры, затем успех.
  2. Все ли цвета не-джокеров имеют одинаковый цвет, а затем успех.
  3. Все ли фигуры лежат так (1, 2, джокер, 4), где всеДжокеры автоматически принимают значение на единицу выше предыдущего.Если это так, то успех.
  4. Если ничего из вышеперечисленного не было правдой, то не получилось.

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

Для шага 3 в этом, вы должны учитывать, что некоторые последовательности могут быть обратными, скажем (джокер, 3, 2, 1).чтобы обнаружить такие случаи, вы можете выполнить быстрое сканирование не-джокеров, чтобы увидеть, увеличиваются ли они или уменьшаются, а затем учесть это (тогда джокеры будут иметь значение на единицу меньше предыдущего).

Обратите внимание, что только на шаге 2 значимы цвета, и только на шаге 3 значимы цифры.

...