fmemo

バカラ

最終更新:

fmemo

- view
管理者のみ編集可
このページはwikipediaのバカラの項目(日本語版と英語版)を参考にしている。

はじめに


バカラでは、仮想的なバンカーとプレイヤーの勝負がおこなわれる。賭けの参加者はバンカーの得点が多いか、プレイヤーの得点が多いか、あるいは引き分けになるかに対して賭けをおこなう。

得点の計算方法


Aは1点、2-9の札はその数字、10と絵札は0点となる。得点が10を上回ったときは下一桁の数字を得点とする。

ゲームの流れ


まずディーラーはバンカーサイドとプレイヤーサイドの両方に2枚づつカードを配る。この時点で、どちらかの得点が8点もしくは9点だった場合はそこで終了となる。両者の得点が6点もしくは7点のときもそこで終了となる。それ以外の場合は、以下の基準に従って、3枚目のカードを引く。そして、両者の点数を比べて勝負を決める。得点の多いほうが勝ちである。

プレイヤーの行動基準


もし、プレイヤーの点数が5点以下なら三枚目のカードを引く(Hit)。それ以外の場合は引かない(Stand)。

バンカーの行動基準


プレイヤーが3枚目のカードを引いていない場合

バンカーの点数が点以下ならHit。それ以外の場合はStand。

プレイヤーが3枚目のカードを引いている場合


  • プレイヤーの3枚目のカードが2または3のとき、バンカーの点数が4点以下ならHit。それ以外の場合はStand
  • プレイヤーの3枚目のカードが4または5のとき、バンカーの点数が5点以下ならHit。それ以外の場合はStand
  • プレイヤーの3枚目のカードが6または7のとき、バンカーの点数が6点以下ならHit。それ以外の場合はStand
  • プレイヤーの3枚目のカードが8のとき、バンカーの点数が2点以下ならHit。それ以外の場合はStand
  • プレイヤーの3枚目のカードがそれ以外のとき、バンカーの点数が3点以下ならHit。それ以外の場合はStand

配当


  • プレイヤーサイドに賭けていて、プレイヤーサイドが勝った場合、2倍の配当がもらえる。
  • バンカーサイドに賭けていて、バンカーサイドが勝った場合、1.95倍の配当がもらえる。
  • タイに賭けていて、タイになった場合、8倍の配当がもらえる。

ソースコード


use strict;
use warnings;

my $num_deck = 4;
my @deck = shuffle($num_deck);

my @banker_hand = splice(@deck,0,2);
my @player_hand = splice(@deck,0,2);

my $banker_score = score(@banker_hand);
my $player_score = score(@player_hand);
 
if($banker_score < 8 && $player_score < 8 ){ 
    push @player_hand, (shift @deck) if($player_score <=5);
    if (@player_hand == 2){
        push @banker_hand, (shift @deck) if($banker_score <=5);
    }else{
        if($player_hand[2]=~ /^.[23]$/){
            push @banker_hand, (shift @deck) if($banker_score <=4);
        }elsif($player_hand[2]=~/^.[45]$/){
            push @banker_hand, (shift @deck) if($banker_score <=5);
        }elsif($player_hand[2]=~/^.[67]$/){
            push @banker_hand, (shift @deck) if($banker_score <=6);
        }elsif($player_hand[2]=~/^.8$/){
            push @banker_hand, (shift @deck) if($banker_score <=2);
        }else{
            push @banker_hand, (shift @deck) if($banker_score <=3);
        }
    }
    $banker_score = score(@banker_hand);
    $player_score = score(@player_hand);
} 

if($banker_score > $player_score){
    print "banker won.\n";
}elsif($banker_score < $player_score){
    print "player won.\n";
}else{
    print "tie.\n";
}

print "banker hand: @banker_hand,$banker_score\n";
print "player hand: @player_hand,$player_score\n";

 
# カードをシャッフルする
sub shuffle {
    srand();
    my $num_deck = shift;
    my @stack =();
    for my $n (1..$num_deck){
        for my $s ("S","H",,"D","C"){
            for my $i (2,3,4,5,6,7,8,9,"T","K","Q","J","A"){
                push @deck, "$s$i";
            }
        }
    }
    while($#deck>=0){
        push @stack,splice(@deck,int(rand($#deck+1)),1);
    }
    return @stack;
}

# 点数を計算する
sub score {
    my @hand = @_;
    my $score = 0;
    for my $card(@hand){
       if( $card =~ /^.A$/ ){
           $score += 1;
       }elsif($card =~ /^.(\d)$/){
           $score += $1;
       }
    }
    if($score >=10){
        $score %= 10;
    }
    return $score;
}


記事メニュー
人気記事ランキング
目安箱バナー