card-counting program for blackjack

L

luser- -droog

Sir, is that a keyboard in your sleeve?


692(1)03:51 PM:~ 0> cat bj.c && echo --------- && make bj && bj
#include <ctype.h>
#include <stdio.h>
#include <string.h>

enum { cards = 13, suits = 4, decks = 4 };
int count[cards];
int total;
char symbols[] = "234567890jqka";

void reset() {
int i;
total = 0;
for (i=0; i < cards; i++)
total += count = suits * decks;
}

void sub(char c) {
if(c=='s')
reset();
else {
char *p = strchr(symbols, tolower(c));
if (p == NULL) return;
--count[ p - symbols ];
--total;
}
}

void show() {
int i;
for (i=0; i < cards; i++) printf(" %c ", toupper(symbols));
puts("");
for (i=0; i < cards; i++) printf("%3d ", count);
printf(" 10s:%d ", count[8]+count[9]+count[10]+count[11]);
printf(" Total:%d", total);
puts("");
for (i=0; i < cards; i++) printf("%3d ", (count*100)/total);
printf(" 10s:%d ", ((count[8]+count[9]+count[10]+count[11])*100)/
total);
puts("");
}

char buf[99];

void readline() {
fgets(buf,99,stdin);
}

void doline() {
int i = 0;
while(buf){
if (!isspace(buf))
sub(buf);
++i;
}
}

int main() {
reset();
while(1) {
show();
readline();
doline();
}
return 0;
}

---------
cc -g -Wall bj.c -o bj
2 3 4 5 6 7 8 9 0 J Q K A
16 16 16 16 16 16 16 16 16 16 16 16 16 10s:64 Total:
208
7 7 7 7 7 7 7 7 7 7 7 7 7 10s:30
460ak
2 3 4 5 6 7 8 9 0 J Q K A
16 16 15 16 15 16 16 16 15 16 16 15 15 10s:62 Total:
203
7 7 7 7 7 7 7 7 7 7 7 7 7 10s:30
3 9 q kaj
2 3 4 5 6 7 8 9 0 J Q K A
16 15 15 16 15 16 16 15 15 15 15 14 14 10s:59 Total:
197
8 7 7 8 7 8 8 7 7 7 7 7 7 10s:29
2 4q 48a
2 3 4 5 6 7 8 9 0 J Q K A
15 15 13 16 15 16 15 15 15 15 14 14 13 10s:58 Total:
191
7 7 6 8 7 8 7 7 7 7 7 7 6 10s:30
2 4 4 8 0 a q
2 3 4 5 6 7 8 9 0 J Q K A
14 15 11 16 15 16 14 15 14 15 13 14 12 10s:56 Total:
184
7 8 5 8 8 8 7 8 7 8 7 7 6 10s:30
4 4 8 ak
2 3 4 5 6 7 8 9 0 J Q K A
14 15 9 16 15 16 13 15 14 15 13 13 11 10s:55 Total:
179
7 8 5 8 8 8 7 8 7 8 7 7 6 10s:30
^C
693(1)03:52 PM:~ 130>
 
L

luser- -droog

pete said:
luser- -droog wrote:
Sir, is that a keyboard in your sleeve?
692(1)03:51 PM:~ 0> cat bj.c && echo --------- && make bj && bj
#include <ctype.h>
#include <stdio.h>
#include <string.h>
enum { cards = 13, suits = 4, decks = 4 };
int count[cards];
int total;
char symbols[] = "234567890jqka";
void reset() {
    int i;
    total = 0;
    for (i=0; i < cards; i++)
        total += count = suits * decks;
}
void sub(char c) {
    if(c=='s')
        reset();
    else {
        char *p = strchr(symbols, tolower(c));
        if (p == NULL) return;
        --count[ p - symbols ];
        --total;
    }
}
void show() {
    int i;
    for (i=0; i < cards; i++) printf("  %c ", toupper(symbols));
    puts("");
    for (i=0; i < cards; i++) printf("%3d ", count);
    printf(" 10s:%d ", count[8]+count[9]+count[10]+count[11]);
    printf("  Total:%d", total);
    puts("");
    for (i=0; i < cards; i++) printf("%3d ", (count*100)/total);
    printf(" 10s:%d ", ((count[8]+count[9]+count[10]+count[11])*100)/
total);
    puts("");
}
char buf[99];
void readline() {
    fgets(buf,99,stdin);
}
void doline() {
    int i = 0;
    while(buf){
        if (!isspace(buf))
            sub(buf);
        ++i;
    }
}
int main() {
    reset();
    while(1) {
        show();
        readline();
        doline();
    }
    return 0;
}
---------
cc -g -Wall    bj.c   -o bj
  2   3   4   5   6   7   8   9   0   J   Q  K   A
 16  16  16  16  16  16  16  16  16  16  16  16  16  10s:64   Total:
208
  7   7   7   7   7   7   7   7   7   7   7  7   7  10s:30

This point is where the output stops on my machine.
Either that,
or this is the point where the program runs too slowly
for me to continue waiting for more output.

I think I'm supposed to input something at this point
but I haven't figured out what yet.


Point taken. I guess /some/ commentary really is necessary.

I've been hooked on the Kindle Blackjack game. So I wrote
this program to help me improve my guesses.

The program (initially and after each 's'huffle) maintains
the number of each rank of card contained in 4 standard
playing card decks. '0' means "10" on input and output.
The 'prompt' is a table showing the number of each card,
the number of "tens", the total number of cards left in
the shoe, and the integer percentages for each card and
for "tens".

So when any cards are played, type them in and hit enter.
This will show what's left in the deck after every hand.

Exit by Interrupt.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,055
Latest member
SlimSparkKetoACVReview

Latest Threads

Top