2015-05-14 35 views
0

我想更好地理解下面的程序是如何工作的。該程序旨在隨機順序洗牌一副撲克牌。什麼是卡洗牌程序如何工作的一個很好的解釋?

有人可以解釋一些功能的細節以及代碼的工作原理嗎?據我所知,使用二維數組,但一些隨機播放功能的混淆我的最後一個print語句一起:

printf("%5s of %-8s%c", wFace[ column ], wSuit[ row ],card % 2 == 0 ? '\n':'\t');

這裏是代碼:

#include <stdio.h> 
    #include <stdlib.h> 
    #include <time.h> 
    #define SUITS 4 
    #define FACES 13 
    #define CARDS 52 
    // prototypes 

void shuffle(unsigned int wDeck[][ FACES ]); // shuffling modifies wDeck 
void deal(unsigned int wDeck[][ FACES ], const char *wFace[], 
const char *wSuit[]); // dealing doesn't modify the arrays 

int main(void) 
{ 

const char *suit[ SUITS ] = 
{ "Hearts", "Diamonds", "Clubs", "Spades" }; 
// initialize face array 

const char *face[ FACES ] = 
{ "Ace", "Deuce", "Three", "Four", 
"Five", "Six", "Seven", "Eight", 
"Nine", "Ten", "Jack", "Queen", "King" }; 

unsigned int deck[ SUITS ][ FACES ] = { 0 }; 

srand(time(NULL)); // seed random-number generator 


shuffle(deck); // shuffle the deck 
deal(deck, face, suit); // deal the deck 
} 


/*SHUFFLE FUNCTION*/ 
void shuffle(unsigned int wDeck[][ FACES ]){ 

size_t row; 
size_t column; 
size_t card; 

for (card = 1; card <= CARDS; ++card) { 
    do { 
    row = rand() % SUITS; 
    column = rand() % FACES; 
    } while(wDeck[ row ][ column ] != 0); 

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

    void deal(unsigned int wDeck[][ FACES ], const char *wFace[], 
    const char *wSuit[]){ 

size_t card; 
size_t row; 
size_t column; 

    for (card = 1; card <= CARDS; ++card) { 

    for (row = 0; row < SUITS; ++row) { 

    for (column = 0; column < FACES; ++column) { 

    if (wDeck[ row ][ column ] == card) { 

    printf("%5s of %-8s%c", wFace[ column ], wSuit[ row ], 
    card % 2 == 0 ? '\n' : '\t'); // 2-column format 
     }}}}} 
+0

最後一個'printf'語句使用模塊創建兩列 - 如果卡片是奇數,它將輸出一個製表符('\ t'),如果卡片是偶數,則它會輸出換行符('\ n')。你沒有問過任何具體的問題,甚至沒有解釋你不瞭解的混洗功能的哪一部分;這段代碼沒有任何複雜的內容。如果您對特定代碼有疑問,請提出具體問題。我們不會逐行解釋它。 C教程講授語言基礎知識,這裏沒有比這更多的東西。 –

+4

這是不好的代碼,把它扔掉。谷歌「漁民隨機洗牌」尋找好的代碼。 –

+0

'for(card = 1; card <= CARDS; ++ card){'suspect ... – wildplasser

回答

0

洗牌的核心功能是

for (card = 1; card <= CARDS; ++card) { 
    do { 
    row = rand() % SUITS; 
    column = rand() % FACES; 
    } while(wDeck[ row ][ column ] != 0); 
    wDeck[ row ][ column ] = card;} 

它一直猜測一張臉和一套西裝,直到它找到一個不在甲板上的組合,然後它分配它到甲板上的下一張牌。

令人困惑的printf函數只打印兩列中的所有卡片,就像Ken解釋的那樣。

+0

const char * suit [SUITS] = 0代替將卡的名稱硬編碼到如下陣列中: const char * {「紅心」,「鑽石」,「俱樂部」,「黑桃」}; //初始化面陣 const char * face [FACES] = {「Ace」,「Deuce」,「Three」,「Four」, 「Five」,「Six」,「Seven」,「Eight」 , 「九」,「十」,「傑克」,「女王」,「國王」}; 如何通過scanf一段代碼輸入它們? –

相關問題