LevelX: ゲーム班->ブラックジャック


1. ブラックジャック

カジノの定番とも言えるカードゲーム「ブラックジャック」。
今回は親(ディーラー)と子の一対一のゲームを設計する。

2. アプリケーションの概要

作成環境
ソース一覧

3. プログラムの説明

3.1 トランプクラス

public Card(int baban);
コンストラクタでカードの山に追加するジョーカーの数を設定する。

public void reset();
カードの状態を二次元配列で表す。
(例) card_stat[2][2]=1のとき、ダイヤの3が使用済みである(カードの山に無い)。

int get_card();
乱数によりカードを一枚選び、カードを表すint型の値を返す。
このとき、そのカードの状態を「使用済み」にする。

3.2 プレイヤークラス

プレイヤークラスでは、親子共通の動作である以下のメソッドを実装している。

Player(Card st);
所持カードを表すVector型変数cardsを初期化
同時にカードの情報を表すCardクラスのインスタンスstを設定。

void pullCard();
「カードの山からトランプを一枚抜く」という動作を行う。

void backCard();
「所持カードをすべて山に戻す(所持カードの初期化)」という動作を行う。

int totalScore();
所持カードの点数の合計を、ブラックジャックのルールに沿って求める
(11以上のカードは全て10とみなす。1は11にもなるが、自動で最適値をとる。)

3.3 親クラス

void setClass(Child c, Blackjack bj);
親に、子とメインプログラムの情報(インスタンス)を教える。

void setView(GameView view);
親に、所持カードを表示するメイン画面の場所を教える。

void turn1();
親の最初の行動。開始時に配られたカードのうち、一枚を裏、一枚を表にして表示する。
その後、子に操作を譲り、以後子がバースト(またはオリ)するまで親は何にもしない。

void turn2();
子の処理が全て終了したら呼ばれる。
自分の所持カードの点数の合計が17以上になるまではカードを引き続ける。
それを終了すると自分の所持カードを全て表でメイン画面に出力してゲームの終了処理に入る。

3.4 子クラス

void setButton(NSbutton s, NSbutton h);
Blackjackから送られてきたボタンの情報をセットする。
これにより、そのボタンを押すとこのクラス内の指定したメソッド(stand , hit)を呼び出せる。
通常、この処理はInterface Builderで行うものだが、
ChildクラスはInterface Builderでは使用しなかったので、ここでその処理を行った。

void turn();
子の最初の処理。"hit"及び"stand"ボタンを使用可能にする。
今後、子の処理は設定したボタンを押すことによって行われる。

void hit(Object sender);
"hit"ボタンが押されたら呼ばれる。カードの山からカードを一枚とる。
この時点で所持カードの点数の合計が21を越えたら、即時終了となる。

void stand(Object sender);
"stand"ボタンが押されたら呼ばれる。カードを引かず、勝負に出る。

3.5 メイン画面クラス

public GameView(NSRect rect)
二次元配列NSImageにカードの画像の情報を格納する。

void plot(int m);
画像を描写する。ここで、mは描写のモードを表している。
[m=0] 所持カードを全て表にして表示
[m=1] 所持カードのうち、最初を裏、次を表にして出力する(ディーラー専用)

void setPlayer(Player c);
親、もしくは子のインスタンスをセットする。
以下はInterface Builderでのメイン画面である。

作業中

上のGameViewが親、下が子の領域である。
親と子で表示する領域が違うため、この処理を行っている。

public void drawRect(NSRect rect);
描写が必要になったとき、もしくは display(); を呼んだときに処理を開始する。

3.6 メインプログラム

アプリケーション起動時に、Parent、Child、Cardクラスのインスタンスを生成。
ゲーム処理を開始する。

void gameInit();
ボタンの設定や各クラスへのインスタンスの受け渡しなどを行う。

public void start(Object sender);
"start"ボタンが押されたら開始する。
親と子にそれぞれ二枚ずつカードを配り、親のターンに入る。

void gameResult();
親と子の処理が全て終了したら呼ばれる。
所持カードの点数の合計から、勝敗を決める。
今回のルールは

4. 実行結果

実行結果を以下に示す。

実行結果

戻る