Модераторы: Rickert
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Алгоритм результата комбинации в "Покер на костях" 
:(
    Опции темы
Septim
Дата 15.9.2011, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 15.9.2011

Репутация: нет
Всего: нет



Здравствуйте.Столкнулся с написанием алгоритма просчета собранной комбинации "покер на костях" .Опишу вкратце суть:

Есть массив с возможных 5 собранных кубиков(значение от 1 до 6)

Когда я запускаю функцию с этим алгоритмом,она должна сделать поиск в этом массиве,найти комбинации(всего 5 Каре,Фулхаус,Короткий стрит,Длинный стрит,Покер и Любая),перевести эти комбинации в очки и вернуть эти очки.

Как оптимально перебирать этот массив с заданными комбинациями.Если перебирать обычными условиями(if(mass[1][1]==if(mass[1][2]&& и т.д)),то выходит слишком много комбинаций.Тоесть,если каре(4 одинаковых значения с 5),то 
может быть вариант 2222б или 26222 или 22622 и т.д

Подскажите пожалуйста,как правильно расставить циклы и условия.

Это сообщение отредактировал(а) Septim - 15.9.2011, 13:50
PM MAIL   Вверх
Septim
Дата 15.9.2011, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 15.9.2011

Репутация: нет
Всего: нет



Написал на две комбинации,теперь запара с коротким стритом

вот ссылка на комбинации комбинации

Код

Int ResultCombination ()
{
    Bool Kare , FullHouse , ShortStreet , LongStreet , Poker ;

    Int Result;    // конечный результат очков

    Byte Point[6]; // количество выпавших значений от 1 до 6

    FREP(5) // цикл от 0 до 4
    {
        if(SlotsDice[1][i]==1)Point[0]++;
        if(SlotsDice[1][i]==2)Point[1]++;
        if(SlotsDice[1][i]==3)Point[2]++;
        if(SlotsDice[1][i]==4)Point[3]++;
        if(SlotsDice[1][i]==5)Point[4]++;
        if(SlotsDice[1][i]==6)Point[5]++;
    }

    if( Point[0]==4 || Point[1]==4 || Point[2]==4 || Point[3]==4 || Point[4]==4 || Point[5]==4 ) // Каре
    {
        FREP(5) Result+=SlotsDice[1][i]; 
        return Result;
    }

    if( Point[0]==3 || Point[1]==3 || Point[2]==3 || Point[3]==3 || Point[4]==3 || Point[5]==3 ) // ФулХаус
    {
        // ищем пару
        if( (Point[0]==Point[1] && Point[0]==Point[2] && Point[0]==Point[3] && Point[0]==Point[4] && Point[0]==Point[5]) ||
            (Point[1]==Point[0] && Point[1]==Point[2] && Point[1]==Point[3] && Point[1]==Point[4] && Point[1]==Point[5]) ||
            (Point[2]==Point[0] && Point[2]==Point[1] && Point[2]==Point[3] && Point[2]==Point[4] && Point[2]==Point[5]) ||
            (Point[3]==Point[0] && Point[3]==Point[1] && Point[3]==Point[2] && Point[3]==Point[4] && Point[3]==Point[5]) ||
            (Point[4]==Point[0] && Point[4]==Point[1] && Point[4]==Point[2] && Point[4]==Point[3] && Point[4]==Point[5]) )

        FREP(5) Result+=SlotsDice[1][i]; 
        return Result;
    }

}


Если не трудно подскажите как оптимизировать код.

Это сообщение отредактировал(а) Septim - 15.9.2011, 14:30
PM MAIL   Вверх
Septim
Дата 15.9.2011, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 15.9.2011

Репутация: нет
Всего: нет



С горем пополам написал функцию,работает правильно,но уж больно громоздкая получилась. Помогите пожалуйста оптимизировать
Код

Int ResultCombination ()
{
    Bool Kare=false, FullHouse=false , ShortStreet=false, LongStreet=false , Poker=false ;
    Bool EmptySlot=false;

    Int Result=0;    // конечный результат очков

    Byte Point[6]={0,0,0,0,0,0}; // количество выпавших значений от 1 до 6

    FREP(5) // цикл от 0 до 4
    {
        if(SlotsDice[1][i]==1)Point[0]++;
        if(SlotsDice[1][i]==2)Point[1]++;
        if(SlotsDice[1][i]==3)Point[2]++;
        if(SlotsDice[1][i]==4)Point[3]++;
        if(SlotsDice[1][i]==5)Point[4]++;
        if(SlotsDice[1][i]==6)Point[5]++;
        if(SlotsDice[1][i]==0)EmptySlot=true;
    }

    if(!EmptySlot)
    {

    if( Point[0]==4 || Point[1]==4 || Point[2]==4 || Point[3]==4 || Point[4]==4 || Point[5]==4 ) // Каре
    {
        //FREP(5) Result+=SlotsDice[1][i]; 
        Kare=true;
        Result = 50;
        return Result;
    }

    if( Point[0]==3 || Point[1]==3 || Point[2]==3 || Point[3]==3 || Point[4]==3 || Point[5]==3 ) // ФулХаус
    {
        // ищем пару
        if( (Point[0]==Point[1] && Point[0]==Point[2] && Point[0]==Point[3] && Point[0]==Point[4] && Point[0]==Point[5]) ||
            (Point[1]==Point[0] && Point[1]==Point[2] && Point[1]==Point[3] && Point[1]==Point[4] && Point[1]==Point[5]) ||
            (Point[2]==Point[0] && Point[2]==Point[1] && Point[2]==Point[3] && Point[2]==Point[4] && Point[2]==Point[5]) ||
            (Point[3]==Point[0] && Point[3]==Point[1] && Point[3]==Point[2] && Point[3]==Point[4] && Point[3]==Point[5]) ||
            (Point[4]==Point[0] && Point[4]==Point[1] && Point[4]==Point[2] && Point[4]==Point[3] && Point[4]==Point[5]) )

        //FREP(5) Result+=SlotsDice[1][i]; 
        FullHouse=true;
        Result = 100;
        return Result;
    }

    if( !Kare && !FullHouse ) // Длинный стрит
    {
        if( (Point[0]>0 && Point[1]>0 && Point[2]>0 && Point[3]>0 && Point[4]>0 ) || (Point[1]>0 && Point[2]>0 && Point[3]>0 && Point[4]>0 && Point[5]>0 ) )
        {
            LongStreet=true;
            Result = 300 ;
            return Result;
        }
    }

    if( !Kare && !FullHouse && !LongStreet ) // Короткий стрит
    {
        if( (Point[0]>0 && Point[1]>0 && Point[2]>0 && Point[3]>0) || (Point[1]>0 && Point[2]>0 && Point[3]>0 && Point[4]>0) || (Point[2]>0 && Point[3]>0 && Point[4]>0 && Point[5]>0) )
        {
            ShortStreet=true;
            Result = 200 ;
            return Result;
        }
    } 

    if( Point[0]==5 || Point[1]==5 || Point[2]==5 || Point[3]==5 || Point[4]==5 || Point[5]==5 ) // Покер
    {
        Poker=true;
        Result = 500 ; 
        return Result;
    }

    if( !Kare && !FullHouse && !ShortStreet && !LongStreet && !Poker) // Нет комбинации
    {
        FREP(5)Result+=SlotsDice[1][i]; 
        return Result;
    }

    }
    else FREP(5) Result+=SlotsDice[1][i]; 
     return Result;
}

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование игр, графики и искуственного интеллекта"
Rickert

НА ЗЛОБУ ДНЯ: Дорогие посетители, прошу обратить внимание что новые темы касающиеся новых вопросов создаются кнопкой "Новая тема" а не "Ответить"! Любые оффтопиковые вопросы, заданные в текущих тематических темах будут удалены а их авторы, при рецедиве, забанены.

  • Литературу, связанную с программированием графики, обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы связанные с программированием графики и мультимедии на языках С++ и Delphi
  • Вопросы по реализации алгоритмов рассматриваются здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Программирование игр, графики и искусственного интеллекта | Следующая тема »


 




[ Время генерации скрипта: 0.0893 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.