乱反射の光跡 in hatenablog

なみへいのブログです。hatenablogヴァージョン。

BlackJack制作ノート その1

その1 「作戦の起草」(笑)


 さて、これからXcodeと戦闘開始(?)です(笑)。
 と言っても別にパソコンと殴り合いをするわけではなく(わざわざ壊してどうする)、武器を取ってパソコンに襲撃をしかけるとか、弾道ミサイルを発射するわけではなく(当たり前)、こちとらパソコンのキーボードに置いた十本の指を駆使して、Xcodeの開発環境との戦闘を行なうわけですが。
 ……いや、何となく、素人プログラミングで起こる「あっちでもこっちでもバグ、バグ!」という状況から、理由もなく戦闘の真っ只中みたいだ、とちょっと思っただけで(笑)。


 という訳で、BlackJack
 まずはルールの確認をしておきましょう。参考書はもちろん、『マルドゥック・スクランブル』の3冊(笑)。小説の中のブラックジャックの再現ですから、他には要りません(笑)。


 そんなわけで、パソコンに向かってソースコードを打ち込む前に、いろいろやらなければなりません。ソースコードを入力しながら徐々に最終形態に作り上げていく、という作業は、インタープリタ言語ならまだ容易いでしょうが、C言語、ましてやIDEXcodeになると、そうはいきません(笑)。
 Xcodeの場合、最初に作るのがWindowやPanelといった「最終的な外観になるもの」だったりするので、アプリケーションの最終的な形態をあらかじめイメージしておかないと、あとで困ったりします(笑)。いや、その辺は経験済み(笑)。
 そうは言っても、別にあとからいろいろ付け足していって、ソースコードも付け足して、とやっていくことは当然ですが可能なので、自分なりに試行錯誤することもかえっていい勉強にはなるはずです。逆に僕のようなプログラミングの学び方をしていると、ろくなプログラマにならないかもしれませんし(笑)。まあ、「反面教師」ぐらいにはなれるかもしれませんが(笑)。

***** ルールの確認 *****


 閑話休題
 ブラックジャックのゲーム自体については、有名ですので説明する必要などないと思いますが。単純に言えば「カードの点数を21点を超えないで、ディーラーより高い点数になれば勝ち」というシンプルなゲームです。
 つまり、それだけプログラミングが簡単、なのかも。……と思ったのが、手を付けようと思った動機のひとつでもあるのですが(笑)。
 基本的にはプレイヤーとディーラーの間の勝負になります。これはプレイヤーが複数でも同じ。
 ゲームはまず、プレイヤーが賭け金を場に出し(ベット)、ディーラーがプレイヤーと自身に2枚ずつカードを配ります。カードはオープンで、ディーラーの2枚目のカードだけが伏せられます。
 プレイヤーは自分の2枚のカードの合計点数を見て、1枚加えるか、そのままで勝負するか、また別の手(後述)にするかを選択します。


 点数は、2〜10の数札は数字通りの点数。ジャック、クィーン、キングの絵札は全て10点。エースは11点か1点か、プレイヤーが選べます。最初に配られた2枚のカードでは、最高点が21点、最低点は(2が2枚の)4点になります。


 その結果が21点を超えてしまったら、自動的に負け(バースト)です。
 全てのプレイヤーのカードが確定すれば、最後にディーラーの伏せたカードをオープンにします。ここでディーラーの点数が判ります。ディーラーは、それが16点以下の場合は17点以上になるまでカードを引き、17点以上になるとそこで点数が確定します。
 これでプレイヤーとディーラーの点数が出揃い、プレイヤー各々の点数とディーラーの点数の比較で「勝ち」「引き分け(ドロー)」「負け」が決まり、買ったプレイヤーは出したベットと同額を受け取り、負けたプレイヤーはベットした賭け金を失います。


 あと、ベットに関するルールとして、プレイヤーの点数が21点の時、賭け金は1.5倍になります。この場合プレイヤーに「負け」はありませんから、これは「プレイヤーが21点で勝った時」、賭け金の1.5倍のチップをもらえることになります。ボーナスのようなもので。


 そして、『マルドゥック・スクランブル』特有のルール(かも知れない)として、「プレイヤーの手札がスペードのエースとスペードのジャック、つまり『ブラックジャック』で勝った時、受け取るチップは賭け金の11倍になる」というルールがあります。作中で「このカジノ特有のルール」としてドクターが語ってます。


 あとはこれの繰り返し。
 カードがなくなればこれまでに使ったカードをもう一度集めてシャッフルし、賭け金を出して、勝負を再開します。


 もう少し詳しく、ゲームのルールを確認しておくことにします。


 簡単に、プレイヤーの人数はひとり、ということにします。
 ディーラーはシャッフルしたカードの山から、プレイヤーと自分に交互に2枚のカードを配ります。自分の2枚目のカードは伏せたままにしておきます。
 そこでプレイヤーは、自分の手札とディーラーの表になったカード(フェイスカード)を頼りに、次の手を選びます。


1.ステイ
 現在のカードのままでよい、という選択。
 現在の手札の点数が、自分の点数になります。あとはディーラーのカードの点数を確定させ、勝負を判定します。


2.ヒット
 カードを1枚要求します。
 新たなカードの点数を手札に加え、それがプレイヤーの点数になります。
 これは何度でも繰り返すことができます。
 点数が21点を超えてしまえば、その時点でバースト(負け)です。


3.サレンダー
 ゲームを降りる、という宣言。
 賭け金の半分を支払って、その回のゲームを降ります。勝負に出て賭け金の全額を失うよりは、という手ですな。


 基本はこの3つ、と考えていいでしょう。他に、ヒットの応用ですが、「ダブルダウン」というのがあります。


4.ダブルダウン
 賭け金を倍額にし、1枚だけヒットする手です。
 要するに、「大勝負」の手ですな。


 さらに、手札の状況によって、次の手が選択できます。


5.スプリット
 手札の2枚が同じ数字のカードの場合、その手札を2組の手札に分け、それぞれを一組の手札として勝負を行ないます。賭け金も、最初の賭け金と同額を2組目の手札に賭けることになります。
 それぞれの手札の組には1枚ずつしかカードがありませんから、それぞれの組にもう1枚ずつカードが配られることになります。プレイヤーは「ひとり2役」ということになるわけです。
 同じ数字のカードが続けば、何度でも繰り返してスプリットできます。ひとりで何役でも可ということですな。
 その分、賭け金も莫大に(笑)。


6.イーヴンマネー
 手札の点数が21点の時、1.5倍の「ボーナス」をなしにする代わりに、ディーラーの手札が何であろうが「勝ち」にする、という手です。
 無条件にプレイヤーの「勝ち」になるのですが、賭け金は自分が賭けた金額と同額のみ、という手。ディーラーの手が21点で「ドロー」になるのを避ける意味もあります。


 基本はこの6種類の「手」になります。これらを駆使して、ディーラーのカードより高い点数を得る、または「勝ち」を拾う、というのが1回のゲームになります。
 最初に配られるカードは自動。ディーラーの手札もルール通り自動で点数が決まります。


 このように、ルールはシンプル、付帯条件も少なく、プログラミング初心者にはやりやすいのではないか。……と、思ったのですが(笑)。
 こうやってルールその他の条件を書き出してみると、結構ありますなあ。これをひとつひとつプログラミングするのかあ。
 本当に、僕にできるのだろうか?(笑)