2015-05-14 36 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一段代码输入它们? –

相关问题