我想更好地理解下面的程序是如何工作的。该程序旨在随机顺序洗牌一副扑克牌。什么是卡洗牌程序如何工作的一个很好的解释?
有人可以解释一些功能的细节以及代码的工作原理吗?据我所知,使用二维数组,但一些随机播放功能的混淆我的最后一个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