Friday, April 10, 2020

HP Prime: Drawing Cards and Video Poker

HP Prime:  Drawing Cards and Video Poker

The Function drawcardfx

The function drawcardfx draws a set number of cards from a deck of 52 standard playing cards.

To achieve this effect, I made four lists:

List 1:  A list of all integers 0 to 51.

List 2:  The suits.  I took each of the elements of List 1 MOD 4, giving the answers of 0, 1, 2, 3, respectively.  Each of the modulo are assigned to a suit:

0:  Clubs.  This is character 9827 for the HP Prime.  ♣
1:  Diamonds.  This is character 9826.  (9827 - 1)  ♢
2:  Hearts.  This is character 9825.  (9827 - 2)  ♡
3:  Spades.  This is character 9824.  (9827 - 3) ♠

List 3:  The ranks.  I divided each element of List 1 by 4, take the integer part, then add 1.  For example:  for card number 17:  IP(17/4) + 1 = IP(4.25) + 1 = 4 + 1 = 5.   This is why I let List 1 range for 0 to 51 instead of 1 to 52, since IP(52/4) + 1 = 14 while IP(0/4) + 1 = 1, and I want four 1s, four 2s, four 3s, up to four 13s.  There are 13 ranks in a standard deck of cards.

List 4:  This list starts empty and will hold all the cards drawn in the hand.  Empty lists are allowed in the HP Prime.

I then turned List 2 and List 3 into appropriate strings.  For List 3, I turned each 1 into an Ace (A), 11 into a Jack (J), 12 into a Queen (Q), and 13 into a King (K).

The While loop allows me to pull to generate a sample with no repeats.  If there is an easier way for me to do this on the HP Prime, please let us in the comments.

The function returns a list of strings in the format "(rank) (suit)".

Example:  drawcardfx(5) might return
{"K ♠", "9 ♡", "A ♠", "4 ♢", "K ♣"}
(not bad, pair of Kings)

HP Prime Program: drawcardfx

EXPORT drawcardfx(n)
BEGIN
// 2020-04-01 EWS
// Draws n cards
// single draw
// no print out

LOCAL x,k,t,s;
LOCAL L1,L2,L3,L4;

RANDSEED();

// list of cards
L1:=MAKELIST(x,x,0,51);

L2:=9827-(L1 MOD 4);
L3:=IP(L1/4)+1;

FOR k FROM 1 TO 52 DO
L2(k):=CHAR(L2(k));
L3(k):=STRING(L3(k));
IF L3(k)=="1" THEN L3(k):="A"; END;
IF L3(k)=="11" THEN L3(k):="J"; END;
IF L3(k)=="12" THEN L3(k):="Q"; END;
IF L3(k)=="13" THEN L3(k):="K"; END;
END;

L4:={};

k:=1;

WHILE k≤n DO
t:=RANDINT(1,52);
// if statement
IF L1(t)≠0 THEN
s:=L3(t)+" "+L2(t);
L1(t):=0;
L4:=CONCAT(L4,{s});
k:=k+1;
END;
END;

// end the program
RETURN L4;
END;

A Simple Video Poker Program

The program VIDEOPOKER is simple video poker program.  You are dealt a hand of 5 cards from a standard 52 card deck.  You are then asked to hold every card that you want to keep.  Once you decide which cards to keep, that card is held.  Executing the DRAW option redraws the cards and you are shown your final hand.

This is a very simple program because there is no better or ranking of hands.  This just has the play of the cards.

The game is achieved by having the game draw 10 cards in advance, separating them into groups of 5.

This program will require the function drawcardfx above.

Example Game:
Run VIDEOPOKER - no arguments needed.

Your first hand:
6 ♢
5 ♢
10 ♠
Q ♠
6 ♡

A choose box appears after I press [ Enter ].  Let's say I want to hold the pair of sixes.  So I highlight each of the sixes and press [ Enter ].  After doing this the choose box now reads:

HOLD?
HELD
5 ♢
10 ♠
Q ♠
HELD
DRAW

I now choose draw and I get:
------------------
Final hand:
6 ♢
A ♠
4 ♢
6 ♣
6 ♡

I improved my hand to a set of sixes (three sixes).

HP Prime Program VIDEOPOKER

EXPORT VIDEOPOKER()
BEGIN
// just for fun
// 2020-04-01 EWS
// drawcardfx required
LOCAL c,k,s,t;
LOCAL cardz,L01,L02,Lhand,Lrep,L03;

cardz:=drawcardfx(10);
L01:=SUB(cardz,1,5);
L02:=SUB(cardz,6,10);
Lhand:=L01;
Lrep:={1,2,3,4,5,6};

PRINT();
PRINT("Your first hand:");

FOR k FROM 1 TO 5 DO
PRINT(Lhand(k));
END;
WAIT(0);

L03:=CONCAT(Lhand,{"DRAW"});

WHILE c≠6 DO
CHOOSE(c,"HOLD?",L03);
Lrep(c):=0;
L03(c):="HELD";
END;

FOR k FROM 1 TO 5 DO
IF Lrep(k)≠0 THEN
Lhand(k):=L02(k);
END;
END;


PRINT("-----------");
PRINT("Final hand:");
FOR k FROM 1 TO 5 DO
PRINT(Lhand(k));
END;

END;

Have fun!  If you do modify the program above to involve gambling, please virtual gamble responsibly.

Eddie

All original content copyright, © 2011-2020.  Edward Shore.   Unauthorized use and/or unauthorized distribution for commercial purposes without express and written permission from the author is strictly prohibited.  This blog entry may be distributed for noncommercial purposes, provided that full credit is given to the author.