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.raku

Connect4

flashcard.raku

Flashcard

hangman.raku

Hangman

tictactoe.raku

Tic Tac Toe

yahtzee.raku

Yahtzee

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

Built with Podlite — the markup and publishing tools behind this site.