Суббота, 14.06.2025, 11:00
Приветствую Вас Гость | RSS
Меню сайта
Вход на сайт
Поиск
Календарь
«  Январь 2025  »
Пн Вт Ср Чт Пт Сб Вс
  12345
6789101112
13141516171819
20212223242526
2728293031
Статистика

Главная » 2025 » Январь » 10 » Карты задача на С
01:58
Карты задача на С

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define SUITS 4
#define FACES 13
#define CARDS 52
//тасовать карты
void shuffle(unsigned int wDeck[][FACES]);
//раздать карты игрокам
void deal(unsigned int wDeck[][FACES], unsigned int wPlayer[][2], const char *wFace[], const char *wSuit[], unsigned int start,  unsigned int finish);
//оценка карт игроков
void mark(unsigned int wPlayer1[][2], unsigned int wPlayer2[][2], const char *wFace[], const  char *wSuit[], unsigned int *nominal1, unsigned int *nominal2);

int  printRating(unsigned int*, unsigned int*);//печать результата оценивания карт
int fPriority(unsigned int wPlayer[][2], const char *wFace[],  const char *wSuit[], unsigned int *nominal);//определение приоритета карт игроков
void  sort(unsigned int wPlayer[][2],  const char *wFace[], const  char *wSuit[]);//сортировка карт, которые находятся на руках у каждого игрока

int main(void)
{   
    unsigned int deck[SUITS][FACES] = {0};
            
    unsigned int player1[5][2];//карты на руках у первого игрока
    unsigned int player2[5][2];//карты на руках у второго игрока
    
    unsigned int nominal1;
    unsigned int nominal2;
       
    srand(time(NULL));
    shuffle(deck); // shuffle the deck

    const char *suit[SUITS] = {"Hearts", "Diamonds", "Clubs", "Spades"};
    
    const char *face[FACES] = {"Ace", "Deuce", "Three", "Four",
                                "Five", "Six", "Seven", "Eight",
                                "Nine", "Ten", "Jack", "Queen", "King"};
    
    printf("\nHand1\n\n");
    
    //сдать карты первому игроку с 1 по 5
    deal(deck, player1, face, suit, 1, 5);
    
    printf("\nHand1_sort\n\n");
    sort(player1, face, suit);
    
    printf("\nHand2\n\n");

    //сдать карты второму игроку с 6 по 10
    deal(deck, player2, face, suit, 6, 10);
    
    printf("\nHand2_sort\n\n");
    sort(player2, face, suit);
    
    //оценить карты игроков
    mark(player1, player2, face, suit, &nominal1, &nominal2);    
}

void mark(unsigned int wPlayer1[][2], unsigned int wPlayer2[][2], const char *wFace[], const  char *wSuit[], unsigned int *nominal1, unsigned int *nominal2)
{
    unsigned int p1, p2;
    int flag = 0;
    
    p1 = fPriority(wPlayer1, wFace, wSuit, nominal1);
    p2 = fPriority(wPlayer2, wFace, wSuit, nominal2);
    
    if(!printRating(&p1, &p2))//сравнить комбинации карт
    {
        if(!printRating(nominal1, nominal2))//если комбинации равны, сравнить номиналы
        {
            for(size_t i =0 ; i < 5; ++i)
            {
                if(!printRating(&wPlayer1[i][1], &wPlayer2[i][1]))//если номиналы равны, сравнение идет по сортированному массиву по старшей карте
                {
                    flag++;
                }
                else
                {
                    break;
                }
                if( flag == 5)
                {
                    printf("\nHand1 = Hand2\n");//карты игроков равны
                }
            }
        }
    }
}

void  sort(unsigned int wPlayer[][2],  const char *wFace[], const  char *wSuit[])
{
    void swap(unsigned int * element1Ptr, unsigned int * element2Ptr);//функция обменивающая карты в ячейках, на которые показывают указатели

    for( size_t i = 0; i < 4; ++i)
    {
        for( size_t j = 0; j < 4; ++j)
        {
            if(wPlayer[j][1] < wPlayer[j+1][1])
            {
                swap(&wPlayer[j][1], &wPlayer[j+1][1]);//обмен элементов    
                swap(&wPlayer[j][0], &wPlayer[j+1][0]);        
            }                
        }
    }
    
    for( size_t i = 0; i < 5; ++i)
    {    
        printf("%5s of %-8s\n ", wFace[ wPlayer[i][1]],  wSuit[ wPlayer[i][0]] );
    }
}
//функция обменивающая карты в ячейках, на которые показывают указатели
void swap(unsigned int * element1Ptr, unsigned int * element2Ptr)
{
    unsigned int temp = * element1Ptr;
    * element1Ptr = * element2Ptr;
    * element2Ptr = temp;
}


int fPriority(unsigned int wPlayer[][2], const char *wFace[],  const char *wSuit[], unsigned  int *nominal)
{
    int oneOfPair(unsigned int wPlayer[][2], const char *wFace[],  const char *wSuit[], unsigned int *nominal);
    int twoOfPair(unsigned int wPlayer[][2],  const char *wFace[],  const char *wSuit[], unsigned int *nominal);
    int treeOfCard(unsigned int wPlayer[][2],  const char *wFace[],  const char *wSuit[], unsigned int *nominal);
    int fourOfCard(unsigned int wPlayer[][2],  const char *wFace[],  const char *wSuit[], unsigned int *nominal);
    int flashOfCard(unsigned int wPlayer[][2],  const char *wFace[], const char *wSuit[], unsigned int *nominal);
    int straighOfCard(unsigned int wPlayer[][2], const char *wFace[],  const char *wSuit[], unsigned int *nominal);

    int (*ptr_f[6])(unsigned int [][2], const char* [], const char* [], unsigned int *) = {oneOfPair, twoOfPair, treeOfCard, straighOfCard, flashOfCard, fourOfCard};

    unsigned int priority;
    
    for(int i = 0; i < 6; ++i)
    {
        priority =(*ptr_f[i])(wPlayer, wFace, wSuit, nominal);
        if(priority > 0)
        {
            return priority;
        }
    }
    return 0;
}


    
int printRating(unsigned  int* ptr1, unsigned  int* ptr2)
{
    if(*ptr1 > *ptr2)
    {
        printf("\nHand1 is the better hand\n");
        return 1;
    }
     else if(*ptr1 < *ptr2)
    {
        printf("\nHand2 is the better hand\n");
        return 1;
    }
    return 0;
}

void shuffle(unsigned int wDeck[][FACES])
{
    for (size_t card = 1; card <= CARDS; ++card)
    {
        size_t row;
        size_t column;

        do
        {
            row = rand() % SUITS;
            column = rand() % FACES;
        } while(wDeck[row][column] != 0);

        wDeck[row][column] = card;
    }
}

void deal(unsigned int wDeck[][FACES], unsigned int wPlayer[][2], const char *wFace[], const char *wSuit[], unsigned int start,  unsigned int finish)
{
     unsigned int r = 0;
     
     for (size_t card = start; card <= finish; ++card)
     {
         for (size_t row = 0; row < SUITS; ++row)
         {
             for (size_t column = 0; column < FACES; ++column)
             {
                 if (wDeck[row][column] == card)
                 {
                     wPlayer[r][0] = row;
                     wPlayer[r][1] = column;
                     printf("%5s of %-8s\t \n", wFace[column], wSuit[row]);
                     ++r;
                 }
             }
         }
     }
}

int oneOfPair(unsigned int wPlayer[][2], const char *wFace[],  const char *wSuit[], unsigned int *nominal)
{
     unsigned int counter[FACES]={0};
     
     int  i;
     size_t n = 0;//количество одинаковых карт на руках у игрока
     
     for( i = 0; i < 5; ++i)
     {
         ++counter[wPlayer[i][1]];
     }
     
     for( i = 0; i < FACES; ++i)
     {
         if(counter[i] == 2 )
         {
             ++n;
             if(n == 1)
                *nominal = i;
         }
     }
     if(n == 1)
     {
        printf("\nThe hand contains a pair %s\n", wFace[*nominal] );
        return 1;
     }
     return 0;
}

int twoOfPair(unsigned int wPlayer[][2], const char *wFace[],  const char *wSuit[], unsigned int *nominal)
{
    unsigned int counter[FACES]={0};
    *nominal = 0;
    
    size_t i;
    size_t n = 0;//количество одинаковых карт на руках у игрока
      
    for( i = 0; i < 5; ++i)
    {
        ++counter[wPlayer[i][1]];
    }
     
    for( i = 0; i < FACES; ++i)
    {
        if(counter[i] == 2 )
        {  
           ++n;
           *nominal += i;
           printf("\nThe hand contains a 2 %s \n", wFace[i]);
        }             
    }
    if(n == 2)
    {
        return 2;
    }
    return 0;
}

int treeOfCard(unsigned int wPlayer[][2], const char *wFace[],  const char *wSuit[], unsigned int *nominal)
{
    unsigned int counter[FACES]={0};
     
    size_t i;
     
    for( i = 0; i < 5; ++i)
    {
        ++counter[wPlayer[i][1]];
    }
     
    for( i = 0; i < FACES; ++i)
    {
        if(counter[i] == 3 )
        {
            *nominal = i;
            printf("\nThe hand contains a 3 card %s\n", wFace[i] );
            return 3;
        }
    }
    return 0;    
}

int fourOfCard(unsigned int wPlayer[][2], const char *wFace[],  const char *wSuit[],  unsigned int *nominal)
{
    unsigned int counter[FACES]={0};
     
    size_t i;
     
    for( i = 0; i < 5; ++i)
    {
        ++counter[wPlayer[i][1]];
    }
     
    for( i = 0; i < FACES; ++i)
    {
        if(counter[i] == 4 )
        {
            *nominal = i;
            printf("\nThe hand contains a 4 card %s\n", wFace[i] );
            return 6;
        }
    }
    return 0;    
}

int flashOfCard(unsigned int wPlayer[][2], const char *wFace[],  const char *wSuit[], unsigned int *nominal)
{
    unsigned int counter[SUITS]={0};
    size_t i;
     
    for( i = 0; i < 5; ++i)
    {
        ++counter[wPlayer[i][0]];
        *nominal += wPlayer[i][1];//вычисляем сумму номиналов карт одной масти
    }
    for( i = 0; i < FACES; ++i)
    {
        if(counter[i] == 5 )
        {
            printf("\nThe hand contains a FLASH card %s\n", wSuit[i] );
            return 5;
        }
    }
    return 0;    
}

int straighOfCard(unsigned int wPlayer[][2], const char *wFace[],  const char *wSuit[], unsigned int *nominal)
{
    size_t i;
     
    for( i = 0; i < 5; ++i)
    {
        *nominal += wPlayer[i][1];
    }
     
    if(wPlayer[0][1] - 1 == wPlayer[1][1] && wPlayer[1][1] - 1 == wPlayer[2][1] && wPlayer[2][1] - 1 == wPlayer[3][1] && wPlayer[3][1] - 1 == wPlayer[4][1])
    {
        printf("\nThe hand contains a STRAIGHT from %s to %s\n", wFace[wPlayer[4][1]], wFace[wPlayer[0][1]]);
        return 4;
    }    
    return 0;    
}

Категория: C (задачи) | Просмотров: 11 | Добавил: alex | Рейтинг: 0.0/0
Всего комментариев: 0