我想更好地理解下面的程序是如何工作的。該程序旨在隨機順序洗牌一副撲克牌。什麼是卡洗牌程序如何工作的一個很好的解釋?
有人可以解釋一些功能的細節以及代碼的工作原理嗎?據我所知,使用二維數組,但一些隨機播放功能的混淆我的最後一個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
}}}}}
最後一個'printf'語句使用模塊創建兩列 - 如果卡片是奇數,它將輸出一個製表符('\ t'),如果卡片是偶數,則它會輸出換行符('\ n')。你沒有問過任何具體的問題,甚至沒有解釋你不瞭解的混洗功能的哪一部分;這段代碼沒有任何複雜的內容。如果您對特定代碼有疑問,請提出具體問題。我們不會逐行解釋它。 C教程講授語言基礎知識,這裏沒有比這更多的東西。 –
這是不好的代碼,把它扔掉。谷歌「漁民隨機洗牌」尋找好的代碼。 –
'for(card = 1; card <= CARDS; ++ card){'suspect ... – wildplasser