Blackjack

AUTHOR

David Whipp

Play Blackjack (a.k.a. 21) just like in a casino.

USAGE

perl6 blackjack.p6
#!/usr/bin/env perl6

use v6;



my $player_is_human = 1;

my @values = (
    ace => 1|11,
    two => 2,
    three => 3,
    four => 4,
    five => 5,
    six => 6,
    seven => 7,
    eight => 8,
    nine => 9,
    ten => 10,
    jack => 10,
    queen => 10,
    king => 10,
);

my @suites = < spades clubs diamonds hearts >;

my @deck = flat( @values X @suites ).map: { my ($name, $value) = $^a.kv; $name ~= " of $^b"; $name => $value };

my @cards = @deck.pick( @deck.elems );

my @dealer;
my @player;

@dealer.push( @cards.shift );
@player.push( @cards.shift );
@dealer.push( @cards.shift );

say "DEALER:";
say @dealer[0].key;
say "";

say "PLAYER:";
.key.say for @player;

my $player_value = [+] @player.map: { .value };

loop {
    my $card = @cards.shift;

    @player.push( $card );
    say $card.key;

    $player_value += $card.value;

    say "current value is { $player_value.perl }";

    if $player_value == 21 {
        say "congradulations, you win!";
        exit 0;
    }
    elsif $player_value < 21 {
        say "hit (h) or stay (s)";
        my $choice;
        if ($player_is_human) {
            loop {
                $choice = lc $*IN.get;
                last if $choice eq "h" | "s";
                #last if $choice ~~ /h|s/;
                say "invalid entry: 'h' or 's'";
            }
        }
        else {
            $choice = "stay" unless $player_value < 16;
        }
        say $choice;
        last if $choice ~~ /s/;
    }
    else {
        say "Sorry, you bust!";
        exit 0;
    }
}

say "";

$player_value = [max] (4 .. 21).grep: { $_ == $player_value };

say "DEALER:";
.key.say for @dealer;

my $dealer_value = [+] @dealer.map: { .value };

loop {
    say "dealer value: {$dealer_value.perl}";

    if $dealer_value == any( $player_value ^.. 21) {
        say "you loose!";
        exit 0;
    }
    elsif $dealer_value < 21 {
        my $card = @cards.shift;
        @dealer.push( $card );
        say $card.key;
        $dealer_value += $card.value;
    }
    else {
        say "dealer bust: you win!";
        exit 0;
    }
}

# vim: expandtab shiftwidth=4 ft=perl6

See Also

connect4.p6

Connect4

flashcard.p6

Flashcard

hangman.p6

Hangman

tictactoe.p6

Tic Tac Toe

yahtzee.p6

Yahtzee

The Camelia image is copyright 2009 by Larry Wall. "Raku" is trademark of the Yet Another Society. All rights reserved.