以下のように入力しブラックジャックを開始します。スコアの合計が21になるまでカードを引き続けることができます。途中で終了することもできます。 21ちょうどに終わらすことが目標です。そして、21を越えた時点でゲームオーバです。
$./quiz3.sh ;ブラックジャックのシェルスクリプトを実行 +*****************************+ + Black Jack ver 1.0 + author : Yuta Kawai +*****************************+ Do you take a card?[Y/n] Y ;カードを引く場合はY、カード引かない(途中終了する)場合はそれ以外を入力してください (以下、実行結果参照) |
実行結果の例を以下に示します。
$./quiz3.sh +*****************************+ + Black Jack ver 1.0 + author : Yuta Kawai +*****************************+target="_blank" Do you take a card?[Y/n] Y --------------------------- Your card is 1. Now, your score is 1. . . (途中略) . Do you take a card?[Y/n] Y --------------------------- Your card is 6. Now, your score is 24. So, your score is over 21. Game over!! ;ゲームオーバーを示す表示が出力される +*****************************+ + total : 24 + exit Black Jack Game!! +*****************************+ |
成功した時の例(出力ファイル(quiz3_output_success.txt)へのリンク)
+*****************************+ + Black Jack ver 1.0 + author : Yuta Kawai +*****************************+ Do you take a card?[Y/n] Y --------------------------- Your card is 6. Now, your score is 6. . . (途中略) . Do you take a card?[Y/n] Y --------------------------- Your card is 9. Now, your score is 21. Congratulation!! ;成功を示す表示がなされる +*****************************+ + total : 21 + exit Black Jack Game!! +*****************************+ |
+*****************************+ + Black Jack ver 1.0 + author : Yuta Kawai +*****************************+ Do you take a card?[Y/n] Y --------------------------- Your card is 8. Now, your score is 8. Do you take a card?[Y/n] Y --------------------------- Your card is 3. Now, your score is 11. Do you take a card?[Y/n] n ;途中終了するためにnを入力 Now, your score is 11 and finish! ;途中終了した場合もそれまでに獲得した得点が表示される。 +*****************************+ + total : 11 + exit Black Jack Game!! +*****************************+ |
ゲーム開始時と終了時にゲームらしい出力を加えてみた。また、カードを引くたびに横棒を挿入してユーザーが見やすく、現時点で何点
持っているかが分かりやすいように表示レイアウトにも力をいれた。実装面としては、問1と同様にoutputFunc, readFuncという関数を
作成し、外部ファイルにリダイレクトもしつつコンソールにも出力させるための工夫を行った。ただしreadFuncに関しては問1にはない工夫をしている。
シェルスクリプトで定義した関数は、文字列を返すことができない仕様となっている。そこで、読み込んだ値をloopFlagStrに格納し関数外から参照する
という方法を用いた。(シェルスクリプトの場合、特に指定しなければ変数のスコープの概念がない。)
個人でブラックジャックゲームをしていてもやはり面白味に欠けるように思われる。ゲームとしてのアルゴリズムは単純であるので、対戦型のゲームに拡張するのが次の目標であろう。 オブジェクト指向型のプログラム言語を使えば、Gamerクラス(このクラスを継承してPlayer,Dealerクラスを作る。また、人数に応じてこれらのクラスをインスタンス化する。)・Controlクラス(シングルトンなクラスでゲームを統制する)としてコードを 書いていけば見通しのよい保守しやすいコードがかけるはずである。例えば、JavaならばGUIを実現するのにSwing、またゲームを時間的に統制するのに必要なスレッドも用意されている。また、Javaアプレット として実装すればネットから遊ぶこともできる(実際は、クラスファイルを個人のPCまでダウンロードしてPC上にインストールされているJVMにて実行される。ネット対戦ゲームのように、どこかのサーバー上でプログラムが動いていてクライアントとやりとりしているというわけではない。後者もJavaのサーバーサイドの技術(ネットワークプログラミング)で実現できる。) 拡張すべきところがたくさんあり、また実現しやすいところなので時間を見つけて拡張してみたいところである。
感想だけで終わらすのも無責任かと思いブラックジャックJavaアプリケーションを作成してみました。最初に2枚を引きその後のゲーム展開は標準的なルールにしたがい、ディーラとプレイヤー(ゲームユーザ)の間で対戦できます。そのため、ディーラの1枚目のカードを見ることはできません。また、一応ベットをして得点換算もしています。ボタンが4つありますが、Hitはカードを引く、Standはもうカードを引かない、Next Gameで次のラウンドに進みます。実行方式はJava Appletですがトリッキーにウインドウ(JFrame)を開いてみました。以下のページからアクセスしてください。Web上から実行できます。(ソースコードの改変・バイナリの再配布については、原則自由とします。)
Black Jackゲーム(Java Applet)を開始する
ランタイムがインストールされていなかったりバージョンが古い場合は、次のページより最新版jreをダウンロードできます。(http://www.java.com/ja/download/)。インストール自体は、Windowsならばインストーラにまかせれば簡単にインストールできます。
なお、jreの有無やバスが通っているかは、
java
のコマンドが使えるかを、Windowsならばコマンドプロント、Linux系OSならば端末で確認してください。通らない場合はjreがインストールされていない、もしくはインストールディレクトリのbinフォルダまでのパスが通ってない可能性があります。
jreのバージョン情報については
java -version
にて確認してください。jreのバージョンが1.6未満の時は、最新のjreをダウンロードする必要があります。(Java SE6でコンパイルすると、クラスファイルは1.6未満のjreが認識するバイナリとはならない上に、jreのバージョンの1.5と1.6の間に下位互換性がないことによります。)
上記のようにGamerクラスを派生して、Player,Dealerクラスを作成した。また、ゲームボードに途中経過を表示するためにThread(どっちかというとタイマー)を用いた。ソースコードを見ていただければ分かるのだが、GUIクラス(BGControlPanel.java, BGPanel.java)とゲームの進行を操作するクラス(BGControler.java)との結合がやや強いのが気になる(一般にクラスとクラスの結合を緩めたほうが、保守性の高いコードといえる)。時間の制約上、リファクタリングにあまり時間を費やせなかったので十分にキレイなコードが書けなかったのがやや心残りである。しかしながら、期限までに動くプログラムができて良かった。
ソースコードは以下のリンクよりダウンロードできます。
Black Jackゲームの全ソースコード