⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shuffle.c

📁 C.Game.Programming.For.Dummies.原码
💻 C
字号:
/*
 * Card shuffling program
 * By Dan Gookin
 * 1/31/97
 */

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

#define DECK 52         //Cards in a deck
#define HEARTS 0x03     //Heart character
#define DIAMONDS 0x04   //Diamond char.
#define CLUBS 0x05      //Clubs character
#define SPADES 0x06     //Spade char.

int draw_card(void);
void shuffle(void);
int rnd(int range);
void seedrnd(void);

/*
 * The cards array is stuck out here in no-man's land
 * to make it available to both the shuffle and
 * draw_card functions
 */

    int cards[DECK];    //Deck of Cards

void main()
{
    int x=DECK;
    int card;
    char c,s;

    puts("Card shuffling demonstration program");

    shuffle();

/*
 * Sift through the entire deck, decrementing
 * variable x from 52 down to zero.
 *
 * Start by drawing the card, one for each loop.
 *
 * The card%13 math converts the random number from
 * 1 to 52 into chunks of 0 to 12 -- like the cards
 * in a suit. The +1 makes the numbers 1 through 13
 *
 * The switch-case structure weeds out the Ace, Ten
 * Jack, Queen and King, setting their characters in the
 * c variable;
 * The (card%13)+'1' sets the remaining characters equal
 * to 2 through 9; adding them to the character '1' which,
 * according to the ASCII table from Volume I, works
 * out just fine
 */

    while(x--)
    {
        card = draw_card();
        switch((card % 13) + 1)
        {
            case(1):
                c = 'A';
                break;
            case(10):
                c = 'T';
                break;
            case(11):
                c = 'J';
                break;
            case(12):
                c = 'Q';
                break;
            case(13):
                c = 'K';
                break;
            default:
                c = (card%13)+'1';
        }

/*
 * A complex if-else structure handles the suits, dividing
 * the values up into four chunks. This sets the s
 * char varaible equal to the characters for Hearts,
 * Diamonds, etc.
 *
 * The final printf displays the values
 */

        if(card>=0 && card<=13)
            s = HEARTS;
        else if(card>=14 && card<=26)
            s = DIAMONDS;
        else if(card>=27 && card<=40)
            s = CLUBS;
        else
            s = SPADES;

        printf("%c%c\t",c,s);

/*
 * This little gem is for formatting only. You divide
 * x (the loop counter) by four -- X MOD 4. When the
 * result is zero, a new line is printed. The ! (not)
 * reverses the results of the MOD; otherwise the
 * newline would print three times in a row
 */

        if(!(x%4))
            putchar('\n');
    }
}

/*
 * The draw_card routine returns a random
 * number from 1 to 52 for each card in the deck
 * It never returns the same card twice as long
 * as you call the shuffle routine -- just
 * like real life!
 */

int draw_card(void)
{
    int card;

    do
    {
        card=rnd(DECK); //draw card
    }
    while(cards[card]); //is card drawn?

    cards[card]=1;      //mark it as drawn

    return(card+1);     //make it 1 to 52
}

/*
 * The shuffle routine does two things:
 * It initializes the randomizer and
 * It initializes the cards[] array
 */

void shuffle(void)
{
    int x;

    seedrnd();

    for(x=0;x<DECK;x++)
        cards[x] = 0;
}

/* Generate a random value */

int rnd(int range)
{
	int r;

	r=rand()%range;		//spit up random num.
	return(r);
}

/* Seed the randomizer */

void seedrnd(void)
{
	srand((unsigned)time(NULL));
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -