954,148 Members — Technology Publication meets Social Media
Username:
Password:
Lost login information?
Have something to say? Contribute New Article Reply to this Article

cards

can anyone help me with this code i just cant understand !
its about filling a deck of cards
thx

for (i = 0; i < 52; i++) 
{  
  deck[i] = (i % 13)<<2;
  deck[i] += i / 13;
 if(i/13 < 2)
  deck[i] += 64;
rowly
Junior Poster in Training
65 posts since Sep 2006
Reputation Points: 10
Solved Threads: 3
 

Yes. As i understand it's something about card game, these calculations are likely used for generating some random numbers. The % operator gives the remainder, so i % 13 always gives a number from 0 to 12, if i is positive, no matter what value i has. The << operator increases the number by shifting it left by one binary place, which means that << 1 is the same as multiplying by 2, << 2 the same as multiplying by 4, but a left shift is much faster than multiplying. What this gives is a random number which changes by a certain bigger unit, say by 4, which is sometimes necessary for a certain random behaviour. And then, i += i / 13 is just the same as i = i + i / 13...

TkTkorrovi
Junior Poster
170 posts since Mar 2005
Reputation Points: 85
Solved Threads: 13
 

The OP's code is also missing a closing curly bracket (}) at the end of the for loop.

This code is equivalent, but simpler:

for (i = 0; i < 52; i++) 
{  
  deck[i] = i % 13;  /* i modulo 13 */
  deck[i] = i * 2;
  deck[i] = deck[i] + i / 13;
 if(i/13 < 2)
  deck[i] = deck[i] + 64;
}

The modulo operator is explained in detail here: http://en.wikipedia.org/wiki/Modulo_operation

dwks
Posting Whiz in Training
269 posts since Nov 2005
Reputation Points: 185
Solved Threads: 28
 

I see now that this code doesn't generate random numbers, but some kind of distribution, still the same applies.

TkTkorrovi
Junior Poster
170 posts since Mar 2005
Reputation Points: 85
Solved Threads: 13
 

wel this code fit inside a fuction which fill a deck of cards (52 cards)
knowing that ->

static char *s[] = {"Hearts","Diamonds","Clubs","Spades"};
static char *v[]  = {"Ace","Two","Three","Four","Five","Six",\
                        "Seven","Eight","Nine","Ten","Jack",\
                        "Queen","King"};
static char *c[]= {"Black","Red"};

actually i cant understand the logic behind this function
is it like creating a memory space for 52 cards so we can deal with it later or just creating cards...
because there is 2 other functions that show you the deck, shuffle the deck and print the deck again(shuffled).

for (i = 0; i < 52; i++) 
{  
  deck[i] = (i % 13)<<2;
  deck[i] += i / 13;
 if(i/13 < 2)
  deck[i] += 64;
 }
rowly
Junior Poster in Training
65 posts since Sep 2006
Reputation Points: 10
Solved Threads: 3
 

Actually, I don't understand it, either. The shifting and adding 64 makes no sense.

Since a deck has 52 cards, the loop is going through all the possible cards of the deck (0-51). Then (i / 13) gives you 0-4, representing the suit of the given card. (i % 13) gives the value or rank of the card (0-12). Therefore, ifi is 5 you get the 6 of Hearts.

If you want to shuffle the deck, you can then yse the random generator to move cards to different random positions.

WaltP
Posting Sage w/ dash of thyme
Moderator
10,492 posts since May 2006
Reputation Points: 3,348
Solved Threads: 943
 

This article has been dead for over three months

Post: Markdown Syntax: Formatting Help
You