# 04 ブラックジャック

  run.bat            これを実行します
  src\BLACKJK.cob    Standard 版。主プログラム。約430行
  src\CARDVAL.cob    副プログラム。手札の点数を計算する

52枚のトランプで遊びます。21 を超えない範囲で、
ディーラーより大きい点を目指します。

# 遊びかた

  H    ヒット(カードを引く)
  S    スタンド(引かずに止める)

  ・絵札 J, Q, K は 10点
  ・A は 1 か 11 の、有利なほうで数えます
  ・合計が 21 を超えるとバースト(負け)
  ・ディーラーは合計 17 以上になるまで引き続けます

スートは絵文字で表示されます(♠ ♥ ♦ ♣)。
SIT COBOL は PIC X(1) に絵文字を入れられるので、そのまま持てます。

# 読みどころ: CALL によるプログラム分割

手札の点数計算だけを副プログラムに切り出しています。

  CALL "CARDVAL" USING 手札ランク群 手札枚数 計算結果

  ・受け取る側は LINKAGE SECTION で宣言し、
    PROCEDURE DIVISION USING ... で受けます
  ・戻るときは EXIT PROGRAM です。SIT COBOL は GOBACK に対応していません
  ・プレイヤーとディーラーの両方で、同じ副プログラムを使い回しています

A を 1 と 11 のどちらで数えるかという込み入った判断を1か所に閉じ込め、
呼ぶ側からは「点数をください」と頼むだけにする、という分け方の例です。

# ★ SIT COBOL の CALL の決まり

CALL に書いた文字列は、一般的な COBOL のように PROGRAM-ID で解決するのでは
なく、同じフォルダにある「そのファイル名.cob」として探されます。

  CALL "CARDVAL"    →  同じフォルダの CARDVAL.cob を呼ぶ

  ・CALL に書く文字列は、呼びたいファイル名(拡張子なし)にしておきます
  ・sitcobol.ini への登録は要りません
  ・呼ぶ側と呼ばれる側は、同じフォルダに置いたままにしてください
  ・CARDVAL.cob だけを単体で実行すると、受け取るパラメータが無いため
    失敗します。run.bat から動かしてください

# もう1つの読みどころ: シャッフル

52枚の並びを乱数で入れ替えてから配ります。
使った札に印を付けて選び直す 01_bulls-and-cows の書き方と見比べると、
乱数の使い分けが分かります。

# 出力について

乱数を使うので、実行するたびに結果が変わります。
そのため OK / NG の判定はありません。

# 関連

CALL文 そのものの確認は、次のサンプルにあります。

  第6章_手続き部\6_5_4_CALL文\
