Skip to content

Instantly share code, notes, and snippets.

@perforb
Created February 29, 2012 17:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save perforb/1942717 to your computer and use it in GitHub Desktop.
Save perforb/1942717 to your computer and use it in GitHub Desktop.
Console game
#!/usr/bin/env perl
use 5.12.0;
use warnings;
use List::Util qw/shuffle/;
use constant {
P => 'Player',
D => 'Dealer',
};
_main();
sub _main {
my @cards = shuffle( _stack() );
my @player = _deal( \@cards );
my @dealer = _deal( \@cards );
my ( $p_sum, $d_sum ) = ( _calc(@player), _calc(@dealer) );
my $display = sub {
my ( $who, $hands, $sum ) = @_;
print "$who: ";
map { print "$_ " } @{$hands};
say "$sum";
};
$display->( P, \@player, $p_sum );
print "Dealer: $dealer[0] **";
say '';
while (1) {
print "Hit(h) or Stand(s) : ";
chomp( my $command = <STDIN> );
if ( $command eq 'h' ) {
push( @player, shift(@cards) );
$p_sum = _calc(@player);
last if ( $p_sum > 21 );
$display->( P, \@player, $p_sum );
}
elsif ( $command eq 's' ) {
say 'Stand!';
last;
}
else {
redo;
}
}
until ( $d_sum >= 17 ) {
push( @dealer, shift(@cards) );
$d_sum = _calc(@dealer);
last if $d_sum == 0;
}
if ( $p_sum > 21 ) {
$display->( P, \@player, $p_sum );
say "Player Busted!";
}
elsif ( $d_sum > 21 ) {
$display->( P, \@player, $p_sum );
$display->( D, \@dealer, $d_sum );
say "Dealer Busted!";
}
elsif ( $p_sum > $d_sum ) {
$display->( P, \@player, $p_sum );
$display->( D, \@dealer, $d_sum );
say "You win!";
}
elsif ( $p_sum < $d_sum ) {
$display->( P, \@player, $p_sum );
$display->( D, \@dealer, $d_sum );
say "You lose...";
}
elsif ( $p_sum == $d_sum ) {
$display->( P, \@player, $p_sum );
$display->( D, \@dealer, $d_sum );
say "Push!";
}
}
sub _stack {
my @cards = ();
foreach my $suit (qw(S H D C)) {
push @cards, "${suit}0${_}" for ( 1 .. 9 );
push @cards, "${suit}${_}" for ( 10 .. 13 );
}
return @cards;
}
sub _deal {
my $cards = shift;
my @hands;
push @hands, shift @{$cards} for ( 0 .. 1 );
return @hands;
}
sub _calc {
my @hands = @_;
my @numbers = ();
my ( $ace, $sum ) = (0) x 2;
foreach my $hand (@hands) {
my ($num) = $hand =~ m/^[SHDC][0]?(\d{1,2})$/;
$ace++ if $num == 1;
push @numbers, $num;
}
foreach my $number (@numbers) {
if ( $number <= 10 ) {
$sum += $number;
}
else {
$sum += 10;
}
}
if ( $sum <= 11 ) {
$sum += 10 if $ace;
}
return $sum;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment