Нужна помощь в переборах массива, поиск двух вариантов без повторов для Poker AI - PullRequest
0 голосов
/ 11 мая 2010

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

Итак, я на флопе, я знаю, какие у меня две карты, и на доске 3 карты. Итак, существует 47 неизвестных карт, и я хочу перебрать все возможные комбинации этих 47 карт, предполагая, что две карты были розданы, поэтому у вас не может быть двух карт одинакового ранга и масти, и вы, если вы предварительно вычислили установите, что вы не хотите делать это снова, потому что я буду терять время, и это будет называться много раз. Если вы не понимаете, хотите, я прошу, пожалуйста, скажите мне, и я уточню больше. Итак, я могу настроить что-то вроде этого, если этот элемент равен единице, это означает, что его нет в моей руке и нет на доске, 4 для каждой масти и 13 для каждого ранга. setOfCards[4][13] .

Если я сделаю простой набор для таких циклов: (псевдокод)
<code>
//remove cards I know are in play from setOfCards by setting values to zero
for(int i = 0; i < 4; i++)
    for(int j = 0; j < 13; j++)
        for(int k = 0; k < 4; k++)
            for(int l = 0; l < 4; l++)
                //skip if values equal zero
                card1 = setOfCards[i][j]
                card2 = setOfCards[k][l]
                //now compare card1, card2 and set of board cards

Итак, на самом деле это будет повторять много значений, например: card1 = AceOfHearts, card2 = KingOfHearts - это то же самое, что card1 = KingOfHearts, card2 = AceOfHearts. Это также изменит мои расчеты. Как мне избежать этого? Кроме того, есть ли название для этой техники? Спасибо.

1 Ответ

3 голосов
/ 11 мая 2010

Было бы проще иметь один массив из 52 карт, тогда вы можете сказать

for (int i=0; i<52; i++)
    for (int j=i+1; j<52; j++)

Теперь j всегда будет выше, чем i, поэтому вы не получите повторов. Вы можете сделать то же самое для 2-го массива, но это немного сложнее:

for (int k=i; ...) 
    for (int l=j+1; ...)

во внутренних двух петлях следует это сделать.

...