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 }