Tags: 5-deck, blackjack, cant, cardsmy, figure, gameso, matlab, program, programming, simulate, simulation, withzrandperm

BLACKJACK SIMULATION

On Programmer » Matlab

6,514 words with 3 Comments; publish: Sat, 26 Apr 2008 21:36:00 GMT; (200108.89, « »)

i want to simulate a 5-deck blackjack game

so i've started with

Z=randperm(260); FOR 260 CARDS

MY PROBLEM IS I CANT FIGURE OUT A PROGRAM THAT WILL RANDOMLY SELECT A

NUMBER OF Z AS A CARD FOR EITHER THE DEALER OR PLAYER, AND THEN ERASE

THAT ENTRY FROM Z.

WHEN Z IS DOWN TO 40 NUMBERS LEFT, I WANT THE PROGRAM TO END, SIMILAR

TO "RE-SHUFFLING"

PLEASE HELP

All Comments

Leave a comment...

  • 3 Comments
    • In article <ef5509f.-1.matlab.questionfor.info.webcrossing.raydaftYaTP>,

      Seth Thomas <jay_bird_thomas.matlab.questionfor.info.hotmail.com> wrote:

      >i want to simulate a 5-deck blackjack game

      >so i've started with

      >Z=randperm(260); FOR 260 CARDS

      You probably don't need to keep track of which deck each card

      came from, so I would suggest

      Z = 1 + (randperm(260) - 1) % 52;

      >MY PROBLEM IS I CANT FIGURE OUT A PROGRAM THAT WILL RANDOMLY SELECT A

      >NUMBER OF Z AS A CARD FOR EITHER THE DEALER OR PLAYER, AND THEN ERASE

      >THAT ENTRY FROM Z.

      You've already shuffled the cards by doing the randperm, so you do

      not want to randomly select from Z: you just want to take the next

      entry of Z.

      >WHEN Z IS DOWN TO 40 NUMBERS LEFT, I WANT THE PROGRAM TO END, SIMILAR

      >TO "RE-SHUFFLING"

      What if you are in the middle of a deal when length(Z) reaches 40?

      --

      If you lie to the compiler, it will get its revenge. -- Henry Spencer

      #1; Sat, 26 Apr 2008 21:37:00 GMT
    • THANK YOU FOR YOUR QUICK REPLY. HOWEVER IM STILL STUCK IN THE SAME

      SPOT. I'VE ASSIGNED VALUES 1-20 TO ACE, 21-40 KK, ECT.

      HOWEVER, I STILL DON'T GET HOW YOU SET UP A LOOP OR SOMETHING TO PICK

      THE FIRST VALUE, THEN SECOND, THEN THIRD.

      I NEED TO GET AWAY FROM THE 1x260 MATRIX AND PICK INDIVIDUALS VALUES,

      AND I DO SEE THE PROBLEM WITH RE-SHUFFLING.

      >

      > You probably don't need to keep track of which deck each card

      > came from, so I would suggest

      > Z = 1 + (randperm(260) - 1) % 52;

      >

      > SELECT A

      > ERASE

      > You've already shuffled the cards by doing the randperm, so you do

      > not want to randomly select from Z: you just want to take the next

      > entry of Z.

      >

      > SIMILAR

      > What if you are in the middle of a deal when length(Z) reaches 40?

      > --

      > If you lie to the compiler, it will get its revenge. -- Henry

      > Spencer

      >

      #2; Sat, 26 Apr 2008 21:38:00 GMT
    • In article <ef5509f.1.matlab.questionfor.info.webcrossing.raydaftYaTP>,

      Seth Thomas <jay_bird_thomas.matlab.questionfor.info.hotmail.com> wrote:

      >THANK YOU FOR YOUR QUICK REPLY. HOWEVER IM STILL STUCK IN THE SAME

      >SPOT. I'VE ASSIGNED VALUES 1-20 TO ACE, 21-40 KK, ECT.

      >HOWEVER, I STILL DON'T GET HOW YOU SET UP A LOOP OR SOMETHING TO PICK

      >THE FIRST VALUE, THEN SECOND, THEN THIRD.

      >I NEED TO GET AWAY FROM THE 1x260 MATRIX AND PICK INDIVIDUALS VALUES,

      >AND I DO SEE THE PROBLEM WITH RE-SHUFFLING.

      As indicated earlier, your randperm has already shuffled the deck.

      You don't need to extract individual values from the permutation:

      just keep track of how far you got.

      You will need to adjust the following to take into account the

      dual behaviour of aces. You can detect an ace in the below by

      checking that cardscores(cardnumber) = 11

      numdecks = 5;

      cardfaces = repmat({'A', '2', '3', '4', '5', '6', '7', '8', '9', ...

      '10', 'J', 'Q', 'K'}, 1, numdecks);

      cardscores = repmat([11, 2:10, 10, 10, 10], 1, 4*numdecks);

      cardsuits = repmat([repmat('H', 1, 13), repmat('D', 1, 13), ...

      repmat('C', 1, 13), repmat('S', 1, 13)], 1, numdecks);

      cardnames = [char(cardfaces),cardsuits'];

      %adjust the player strategy according to your simulation needs

      pdealsagain = [repmat(true,1,17),false(1,3)];

      %blackjack rules: dealer has fixed strategy, must keep going at 16 or less

      ddealsagain = [repmat(true,1,16),false(1,4)];

      shuffleddeck = randperm(52 * numdecks);

      usedcards = 0;

      while usedcards < 52 * numdecks - 40

      %player dealt, then dealer, then player, then dealer

      pcards = suffleddeck(usedcards+[1,3]);

      dcards = suffleddeck(usedcards+[2,4]);

      usedcards = usedcards + 4;

      pscore = sum(cardscores(pcards)); % fix this for dual ace handling

      dscore = sum(cardscores(dcards)); % fix this for dual ace handling

      %player then plays continuously until holding or busting

      while pscore < 21 && length(pcards) < 5 && pdealsagain(pscore)

      usedcards = usedcards + 1;

      pcards = [pcards, suffleddeck(usedcards)];

      pscore = sum(cardscores(pcards)); % fix this for dual ace handling

      end

      %if the player did not bust, the dealer plays continuously until

      %holding or busting

      while pscore <= 21 && dscore < 21 && ddealsagain(dscore)

      usedcards = usedcards + 1;

      dcards = [dcards, suffleddeck(usedcards)];

      dscore = sum(cardscores(dcards)); % fix this for dual ace handling

      end

      %there is a little bit of trickery to wrap the card names into

      %single strings. This is only the first half of the trick.

      pcn = cardnames(pcards)';

      dcn = cardnames(dcards)';

      %now decide who won

      if pscore <= 21 && pscore > dscore

      %player wins

      disp(['player wins. player: ', pcn(:)', ' dealer: ', dcn(:)']);

      elseif pscore <= 21 && pscore == dscore

      %tie

      disp(['tie. player: ', pcn(:)', ' dealer: ', dcn(:)']);

      else

      %player loses

      disp(['dealer wins. player: ', pcn(:)', ' dealer: ', dcn(:)']);

      end

      end

      Modifying this to take into account blackjack is left as an exercise.

      If the player has blackjack, then the dealer does not receive

      any more cards -- but if the dealer has blackjack too then it is

      still a tie.

      Modifying the code to reflect bets and payouts (blackjack pays higher

      than simply reaching 21) is left as an exercise.

      --

      Is there any thing whereof it may be said, See, this is new? It hath

      been already of old time, which was before us. -- Ecclesiastes

      #3; Sat, 26 Apr 2008 21:39:00 GMT