代码之家  ›  专栏  ›  技术社区  ›  Norhther

更优雅的写法?(一副牌)

c
  •  -1
  • Norhther  · 技术社区  · 7 年前

    我现在正在写一个21点模拟器,我正在生成n副牌来玩:

    int i;
    int value = 1;
    for (i = 0; i < deck->n_cards; i++) {
        deck->cards[i] = value;
        value++;
        if (value == 14) value = 1;
    }
    

    (卡组->n_卡%52==0)

    我试过用模运算来写同样的方法,但是我不能用超过一个的方法来完成。我觉得用那个if真的很难看。有更优雅的解决方案吗?

    3 回复  |  直到 7 年前
        1
  •  1
  •   Eliyahu Machluf    7 年前

    我不熟悉21点游戏,但是我从你的代码中了解到,值的范围是1到13。 请尝试以下代码:

    int i;
    for (i = 0; i < deck->n_cards; i++) {
        deck->cards[i] = (i % 13) + 1;
    }
    

    i%13的范围是0到12,再加上一个,使这个范围为1到13

        2
  •  0
  •   CIsForCookies    7 年前

    如果您想要的是,给定一个指向52 int数组的指针,用4组1-13填充它,一个更简单的方法是,IMO:

    #include <stdio.h>
    
    typedef struct deck{
        int n_cards;
        int cards[52];
    }deck_t;
    
     int main(void) {
    
        deck_t *deck = malloc(sizeof(deck_t));
        deck->n_cards = 52;
    
        int value = 1, suit_size = 13, num_of_suits = 4;
    
        /* 1st option*/
        for(int i = 0; i < deck->n_cards / num_of_suits; i++){
            for(int j = 0; j < deck->n_cards; j += suit_size){
                deck->cards[i+j] = value;
            }
            value++;
        }
    
        for(int i = 0; i < deck->n_cards; i++){
            printf("%d ", deck->cards[i]);
        }
    
        /* 2nd option*/
        value = 0;
        for(int i = 0; i < deck->n_cards; i++){
            deck->cards[i] = 1 + value++ % 13;
        }
    
        for(int i = 0; i < deck->n_cards; i++){
            printf("%d ", deck->cards[i]);
        }
        return 0;
    }
    
        3
  •  0
  •   cleblanc    7 年前

    #define CARDS_IN_DECK 52
    #define CARDS_IN_SUIT 13
    #define DECKS_IN_BOOT 8
    #define SUITS_IN_DECK 4
    
    #define HEARTS 0
    #define SPADES 1
    #define CLUBS  2
    #define DIAMONDS 3
    #define CARD_SUIT(c)  suits[((c)/CARDS_IN_SUIT)]
    #define CARD_FACE(c)  cards[((c)%CARDS_IN_SUIT)]
    #define CARD_VALUE(c) cardValue[((c)%CARDS_IN_SUIT)]
    
    int deck[DECKS_IN_BOOT][CARDS_IN_DECK];
    int boot, card;
    int needsShuffle = 1;
    const char *suits[] = {"Hearts", "Spades", "Clubs", "Diamonds"};
    const char *cards[] = {"Ace", "Two", "Three", "Four", "Five", "Six",
                      "Seven", "Eight", "Nine", "Ten", "Jack", "Queen", "King"};
    const int cardValue[] = {11, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10};
    
    void shuffle()
    {
        int num_shuffles = 1000;
        int i, j, k, m, n, temp;
    
        printf("\n\t Shuffling ... \n");
        /* Create the boot */
        for (i=0;i<DECKS_IN_BOOT;i++)
            for (j=0;j<CARDS_IN_DECK;j++)
                deck[i][j] = j;
    
        for ( ;num_shuffles--; )
        {
            m = rand() % DECKS_IN_BOOT;
            n = rand() % DECKS_IN_BOOT;
    
            j = rand() % CARDS_IN_DECK;
            k = rand() % CARDS_IN_DECK;
    
            temp = deck[n][j];
            deck[n][j] = deck[m][k];
            deck[m][k] = temp;
        }
        needsShuffle = boot = card = 0;
    }
    
    void testPrintDeck()
    {
        int i, j;
    
        /* Create the boot */
        for (i=0;i<DECKS_IN_BOOT;i++)
            for (j=0;j<CARDS_IN_DECK;j++)
                printf("%d %s %s\n",
                       deck[i][j],
                       CARD_FACE(deck[i][j]),
                       CARD_SUIT(deck[i][j]));
    }
    
    main(int c, char *v[])
    {
        srand(time(0));
        shuffle();
        testPrintDeck();
    }