raku

My Raku Scripts Collection
git clone https://fab.ddns.me.uk/stagit/raku
Log | Files | Refs | README

oichokabu.raku (2944B)


      1 #!/usr/bin/env raku
      2 
      3 # 1. 札の準備
      4 my @base = 1..10;
      5 my @deck = (@base, @base, @base, @base).flat.pick(*);
      6 
      7 # 2. 点数計算
      8 sub get-kabustats(@hand) {
      9     if check-arashi(@hand) { return 100 } 
     10     return @hand.sum % 10;
     11 }
     12 
     13 # 3. 特殊役判定(ここを修正!)
     14 sub check-special(@hand, $is-dealer) {
     15     return "None" if @hand.elems != 2;
     16     my @sorted = @hand.sort;
     17     
     18     # 親(Dealer)はクッピン(1,9)のみ
     19     if $is-dealer && @sorted[0] == 1 && @sorted[1] == 9 {
     20         return "Kuppin";
     21     }
     22     
     23     # 子(Player)はシッピン(1,4)のみ
     24     if !$is-dealer && @sorted[0] == 1 && @sorted[1] == 4 {
     25         return "Shippin";
     26     }
     27     
     28     return "None";
     29 }
     30 
     31 sub check-arashi(@hand) {
     32     return @hand.elems == 3 && @hand[0] == @hand[1] == @hand[2];
     33 }
     34 
     35 # --- ゲーム開始 ---
     36 say "🇬🇧 Welcome to Oicho-Kabu on OpenBSD!";
     37 say "-" x 40;
     38 
     39 my @player = @deck.pop, @deck.pop;
     40 my @dealer = @deck.pop, @deck.pop;
     41 
     42 # 親のクッピンチェック
     43 if check-special(@dealer, True) eq "Kuppin" {
     44     say "Dealer's hand: {@dealer.join('-')}";
     45     say "🇬🇧 Dreadful! Dealer got Kuppin! You lose instantly.";
     46     exit;
     47 }
     48 
     49 # 4. プレイヤーの番
     50 loop {
     51     # 子のシッピンチェック(最初の2枚の時だけ)
     52     if @player.elems == 2 && check-special(@player, False) eq "Shippin" {
     53         say "Your hand: {@player.join('-')} (🇬🇧 Shippin! Lucky!)";
     54         last; 
     55     }
     56     
     57     if check-arashi(@player) {
     58         say "Your hand: {@player.join('-')} (🇬🇧 Arashi!)";
     59         last;
     60     }
     61 
     62     my $score = get-kabustats(@player);
     63     say "Your hand: {@player.join('-')} (Score: $score)";
     64     
     65     if @player.elems < 3 {
     66         my $choice = prompt "Do you want to draw a 3rd card? (y/n): ";
     67         if $choice.lc.starts-with('y') {
     68             @player.push: @deck.pop;
     69             next;
     70         }
     71     }
     72     last;
     73 }
     74 
     75 # 5. 親(CPU)の番(あらし狙いロジック込み)
     76 while @dealer.elems < 3 {
     77     my $current_score = get-kabustats(@dealer);
     78     my $is_pair = @dealer.elems == 2 && @dealer[0] == @dealer[1];
     79     
     80     if $is_pair || $current_score < 5 {
     81         @dealer.push: @deck.pop;
     82         next;
     83     }
     84     last;
     85 }
     86 
     87 # 6. 最終判定
     88 # (ここでは簡略化のため、シッピンを持っていれば問答無用でプレイヤー勝ちとしています)
     89 my $p-special = check-special(@player, False);
     90 my $p-final = get-kabustats(@player);
     91 my $d-final = get-kabustats(@dealer);
     92 
     93 say "-" x 40;
     94 say "Your final: {@player.join('-')} (Score: {$p-special eq 'Shippin' ?? 'Shippin' !! $p-final})";
     95 say "Dealer final: {@dealer.join('-')} (Score: {$d-final == 100 ?? 'Arashi' !! $d-final})";
     96 
     97 if $p-special eq "Shippin" {
     98     say "🇬🇧 Brilliant! Shippin beats all!";
     99 }
    100 elsif $p-final > $d-final {
    101     say "🇬🇧 Brilliant! You win!";
    102 }
    103 elsif $p-final < $d-final {
    104     say "🇬🇧 Dreadful! Dealer wins.";
    105 }
    106 else {
    107     say "🇬🇧 Honours even! (It's a push).";
    108 }