388 lines
19 KiB
Plaintext
388 lines
19 KiB
Plaintext
○システム名
|
||
ブラックジャック
|
||
|
||
○システム説明
|
||
通常のブラックジャックです。
|
||
|
||
○納品物
|
||
作成したプログラム
|
||
|
||
1段階目(Cardクラスの作成)
|
||
以下のクラスを作成する。
|
||
実行できないのでコンパイルエラーがなくなれば1段階目は完成とする。
|
||
・クラス名:Card
|
||
・フィールドはそれぞれint型のsuitとrankを定義。
|
||
suit:マークのこと。0:スペード、1:ハート、2:ダイヤ、3:クラブとする。
|
||
rank:数字のこと。1:A、11:J、12:Q、13:Kとする。
|
||
・Cardクラスはカプセル化し、フィールドはprivateとし、セッターメソッドを作成せず、
|
||
publicなゲッターメソッドのみ作成する。
|
||
・セッターメソッドを作成しない代わりにsuitとrankを引数に持つコンストラクタを作成し、
|
||
コンストラクタの中でフィールドにセットする。
|
||
|
||
2段階目(カード内容の表示)
|
||
Cardクラスに以下のpublicメソッドを追加実装する。
|
||
・メソッド名:toString
|
||
・引数 :なし
|
||
・戻り値 :カードのマークと数字を以下の形式の文字列でリターンする
|
||
ハート 3
|
||
ダイヤ A
|
||
クラブ 10
|
||
スペード Q
|
||
Test1クラスを作成し、mainメソッドの中で以下を実行する。
|
||
・Cardクラスのインスタンスを以下のように4個作成し、c1~c4に格納する。
|
||
c1:ハート 3
|
||
c2:ダイヤ A
|
||
c3:クラブ 10
|
||
c4:スペード Q
|
||
・System.out.println()メソッドの引数にc1~c4を指定し、以下のように表示する。
|
||
<実行例>
|
||
ハート 3
|
||
ダイヤ A
|
||
クラブ 10
|
||
スペード Q
|
||
|
||
3段階目(Deckクラスの作成)
|
||
以下のクラスを作成する。
|
||
実行できないのでコンパイルエラーがなくなれば3段階目は完成とする。
|
||
・クラス名:Deck ←ひと組のカード、という意味
|
||
・フィールドはArrayList<Card>型のcardListを定義。
|
||
・引数なしのコンストラクタを作成し、以下の処理を行う。
|
||
〇cardListにArrayList<Card>のインスタンスを作成する
|
||
〇二重のfor文を使用して52枚のCardクラスのインスタンスをcardListに追加する
|
||
・Deckクラスのフィールドはprivateとするが、ゲッター・セッターメソッドは作成しないこととする。
|
||
|
||
4段階目(shuffleメソッド、drawCardメソッドの実装)
|
||
Deckクラスに以下のpublicメソッドを追加実装する。
|
||
実行できないのでコンパイルエラーがなくなれば3段階目は完成とする。
|
||
・shuffleメソッド
|
||
〇引数 :なし
|
||
〇戻り値:なし
|
||
〇機能 :cardListの中の52枚のカードをランダムに並び替える
|
||
・drawCardメソッド
|
||
〇引数 :なし
|
||
〇戻り値:cardListにカードが残っていれば先頭のカード(cardList[0])をリターン
|
||
cardListにカードが残っていなければnullをリターン
|
||
〇機能 :リターンした先頭のカードはcardListから削除し、2枚目以降を前につめる(ArrayListの機能を利用すること)
|
||
|
||
5段階目(シャッフルしたカードを表示)
|
||
Test2クラスを作成し、mainメソッドの中で以下の処理を行う。
|
||
・Deckクラスのインスタンスを作成する
|
||
・作成したDeckインスタンスをシャッフルする
|
||
・シャッフルしたDeckインスタンスをカードがなくなるまで以下を繰り返す
|
||
〇先頭のカードを引く
|
||
〇引いたカードを画面に表示する
|
||
<実行例>
|
||
ハート 3
|
||
ダイヤ A
|
||
:
|
||
クラブ 10
|
||
スペード Q ←全部で52行表示される
|
||
|
||
6段階目(Handクラスの作成)
|
||
以下のクラスを作成する。
|
||
実行できないのでコンパイルエラーがなくなれば6段階目は完成とする。
|
||
・クラス名:Hand ←トランプの参加者、という意味
|
||
・以下のフィールドを定義する
|
||
〇hands :ArrayList<Card>型、protected ←このhandsは手札の意味
|
||
〇name :String型、protected
|
||
・以下の内容のpublicなコンストラクタを定義する。
|
||
〇引数 :名前
|
||
〇機能 :handsにArrayList<Card>のインスタンスを作成し、nameに引数の名前をセットする
|
||
・以下の内容のpublicなdrawCardメソッドを定義する。
|
||
〇引数 :Deckクラスのインスタンス
|
||
〇戻り値:なし
|
||
〇機能 :Deckインスタンスから1枚カードを引き、handsに追加する
|
||
・以下の内容のpublicなshowHandメソッドを定義する。
|
||
〇引数 :なし
|
||
〇戻り値:なし
|
||
〇機能 :handsの中の全てのカードを以下の形式で画面に表示する
|
||
<nameの値>の手札
|
||
⇒ ハート 3
|
||
⇒ ダイヤ A
|
||
・handsはゲッター、セッターは不要、nameはゲッターメソッドのみ作成する
|
||
|
||
7段階目(Playerクラスの作成)
|
||
以下のクラスを作成する。
|
||
実行できないのでコンパイルエラーがなくなれば7段階目は完成とする。
|
||
・クラス名:Player ←Handクラスを継承する
|
||
・以下の内容のpublicなコンストラクタを定義する。
|
||
〇引数 :名前
|
||
〇機能 :引数の名前を使って親クラスのコンストラクタを呼び出す
|
||
・以下の内容のpublicなselectメソッドを定義する。 ←HitかStandかの選択をする意味
|
||
〇引数 :Deckクラスのインスタンス
|
||
〇戻り値:boolean型。Hitを選択した場合false、Standを選択した場合true。
|
||
〇機能 :「どうしますか?」「1:Hit - もう一枚カードを引く」「2:Stand - この手札で勝負」の3行を表示する。
|
||
キーボードから入力させ、1か2以外であれば「ちゃんとやって」を表示し、再入力する。
|
||
1を入力した場合はデッキから1枚カードを引き、手札に追加する。
|
||
|
||
8段階目(Standするまで繰り返し)
|
||
BlackJackクラスを作成し、mainメソッドで以下の処理を行う。
|
||
・Playerインスタンスを名前を「あなた」で作成する
|
||
・Deckクラスのインスタンスを作成する
|
||
・作成したDeckインスタンスをシャッフルする
|
||
・Playerが2枚カードを引く
|
||
・以下の処理をbreakが実行されるまで繰り返す。
|
||
〇Playerの手札を表示する
|
||
〇区切りの「**********」を表示する
|
||
〇Playerインスタンスのselectメソッドを呼び出し、Standを選択したらループを抜ける
|
||
・Standが選択されたら区切りの「@@@@」を表示する
|
||
<実行例>
|
||
あなたの手札
|
||
⇒ ハート A
|
||
⇒ スペード 5
|
||
**********
|
||
どうしますか?
|
||
1:Hit - もう一枚カードを引く
|
||
2:Stand - この手札で勝負
|
||
3 ←正しくない入力の場合
|
||
ちゃんとやって
|
||
1 ←Hitを入力の場合
|
||
あなたの手札
|
||
⇒ ハート A
|
||
⇒ スペード 5
|
||
⇒ スペード J
|
||
**********
|
||
どうしますか?
|
||
1:Hit - もう一枚カードを引く
|
||
2:Stand - この手札で勝負
|
||
2 ←Standを入力の場合
|
||
@@@@
|
||
|
||
9段階目(合計値表示)
|
||
Handクラスにprotectedのフィールドtotalを追加する。
|
||
totalはセッターは作成せず、ゲッターメソッドのみ作成する。
|
||
Handクラスに以下のメソッドを追加する。
|
||
・calculateTotalメソッド private。
|
||
〇引数 :なし
|
||
〇戻り値:なし
|
||
〇機能 :handsの中のカードのrankをすべて足し合わせる。
|
||
ただし、Aは11、J~Kは10と計算する。
|
||
合計が21を超えた場合、最大でhandsの中のAの数だけ10を減算する。
|
||
・isNaturalBlackJackメソッド public。
|
||
〇引数 :なし
|
||
〇戻り値:ナチュラルブラックジャックならtrue、違う場合はfalse
|
||
〇機能 :totalが21で手札の枚数が2のときナチュラルブラックジャックと判定する。
|
||
HandクラスのdrawCardメソッドの最後でcalculateTotalメソッドを呼び出す処理を追加する。
|
||
BlackJackクラスのmainメソッドで、Playerの手札を表示した後、以下の処理を追加する。
|
||
・PlayerインスタンスのgetTotalメソッドを使って合計値を表示する
|
||
「**********」を表示した後、以下の処理を追加する。
|
||
・ナチュラルブラックジャックか判定し、trueなら「ナチュラルブラックジャック!」を表示し、ループを抜ける
|
||
・合計値が21を超えていたら「Busted!」を表示し、ループを抜ける
|
||
<実行例>
|
||
あなたの手札
|
||
⇒ ハート 3
|
||
⇒ ダイヤ 7
|
||
合計値:10
|
||
**********
|
||
どうしますか?
|
||
1:Hit - もう一枚カードを引く
|
||
2:Stand - この手札で勝負
|
||
1
|
||
あなたの手札
|
||
⇒ ハート 3
|
||
⇒ ダイヤ 7
|
||
⇒ ハート 9
|
||
合計値:19
|
||
**********
|
||
どうしますか?
|
||
1:Hit - もう一枚カードを引く
|
||
2:Stand - この手札で勝負
|
||
1
|
||
あなたの手札
|
||
⇒ ハート 3
|
||
⇒ ダイヤ 7
|
||
⇒ ハート 9
|
||
⇒ スペード 3
|
||
合計値:22
|
||
**********
|
||
Busted!
|
||
@@@@
|
||
|
||
10段階目(Dealerクラスの作成)
|
||
以下のクラスを作成する。
|
||
実行できないのでコンパイルエラーがなくなれば10段階目は完成とする。
|
||
・クラス名:Dealer ←Handクラスを継承する
|
||
・以下の内容のpublicなコンストラクタを定義する。
|
||
〇引数 :なし
|
||
〇機能 :名前を「ディーラー」として親クラスのコンストラクタを呼び出す
|
||
|
||
11段階目(ディーラーの手札表示)
|
||
Cardクラスにboolean型のflgUpフィールドを追加し、初期値はtrueとする。
|
||
追加したflgUpはprivateとし、publicなゲッター、セッターメソッドを作成する。
|
||
CardクラスのtoStringメソッドで、カードが裏になっている場合は「???????」を
|
||
リターンするように修正する。
|
||
Handクラスに以下のメソッドを追加する。
|
||
〇メソッド名:getCard public
|
||
〇引数 :index(先頭0)
|
||
〇戻り値 :手札のindex枚目のカード
|
||
|
||
〇メソッド名:showHand public
|
||
〇引数 :boolean型の公開フラグとlong型のミリ秒
|
||
〇戻り値 :なし
|
||
〇機能 :handsの中の全てのカードを以下の形式で画面に表示するが、
|
||
1行表示するたびに引数のミリ秒だけsleepする。
|
||
また、1行の表示内容は公開フラグがtrueの場合は以下のようにする。
|
||
<nameの値>の手札を公開します。
|
||
HandクラスのもともとあったHandクラスの引数なしのshowHandメソッドは上記で追加したメソッドを
|
||
falseと0Lの引数で呼び出すのみとする。
|
||
BlackJackクラスのmainメソッドで、以下のよう変更する。
|
||
・Prayerクラスのインスタンス作成をやめ、、Hand型の長さ2の配列hands(参加者の意味)を作成し、
|
||
[0]にDealerクラスの、[1]にPlayerクラスのインスタンスを作成するように変更する。
|
||
・参加者全員にdrawCardメソッドを使って2枚ずつカードを配る。
|
||
・ディーラーの手札の2枚目は裏にするため、CardクラスのsetFlgUpメソッドを使い、false(裏)にする。
|
||
・ディーラーの手札をshowHandメソッドで表示し、区切りの「**********」を表示する。
|
||
・ディーラーの手札の表示が終わったら2枚目を表に戻しておく。
|
||
・プレイヤーがStandかBustしたあと、
|
||
公開フラグをtrue、ミリ秒を1000にしてディーラーの手札を表示する。
|
||
<実行例>
|
||
ディーラーの手札
|
||
⇒ ダイヤ A
|
||
⇒ ???????
|
||
**********
|
||
あなたの手札
|
||
⇒ ハート K
|
||
⇒ スペード 2
|
||
合計値:12
|
||
**********
|
||
どうしますか?
|
||
1:Hit - もう一枚カードを引く
|
||
2:Stand - この手札で勝負
|
||
1
|
||
あなたの手札
|
||
⇒ ハート K
|
||
⇒ スペード 2
|
||
⇒ ハート 3
|
||
合計値:15
|
||
**********
|
||
どうしますか?
|
||
1:Hit - もう一枚カードを引く
|
||
2:Stand - この手札で勝負
|
||
2
|
||
@@@@
|
||
ディーラーの手札を公開します。
|
||
⇒ ダイヤ A
|
||
⇒ クラブ 3
|
||
|
||
12段階目(ディーラーの合計表示)
|
||
Dealerクラスに以下のpublicなメソッドを追加する。
|
||
〇メソッド名:drawAdditionalCard
|
||
〇引数 :Deckインスタンス
|
||
〇戻り値 :なし
|
||
〇機能 :totalが17未満である間、カードを1枚引く
|
||
BlackJackクラスのmainメソッドで以下を修正する。
|
||
・プレイヤーがカードを引き終えた後、
|
||
プレイヤーがBustしていなければDealerクラスのdrawAdditionalCardを呼び出す。
|
||
・ディーラーの手札を表示後、ディーラーの合計値を表示する。
|
||
<実行例>
|
||
ディーラーの手札
|
||
⇒ ダイヤ A
|
||
⇒ ???????
|
||
**********
|
||
あなたの手札
|
||
⇒ ハート K
|
||
⇒ スペード 2
|
||
合計値:12
|
||
**********
|
||
どうしますか?
|
||
1:Hit - もう一枚カードを引く
|
||
2:Stand - この手札で勝負
|
||
1
|
||
あなたの手札
|
||
⇒ ハート K
|
||
⇒ スペード 2
|
||
⇒ ハート 3
|
||
合計値:15
|
||
**********
|
||
どうしますか?
|
||
1:Hit - もう一枚カードを引く
|
||
2:Stand - この手札で勝負
|
||
2
|
||
@@@@
|
||
ディーラーの手札を公開します。
|
||
⇒ ダイヤ A
|
||
⇒ クラブ 3
|
||
⇒ ハート 2
|
||
⇒ ダイヤ 3
|
||
合計:19
|
||
|
||
13段階目(勝敗表示)
|
||
Dealerクラスに以下のpublicなメソッドを追加する。
|
||
〇メソッド名:compareTo
|
||
〇引数 :Playerインスタンス
|
||
〇戻り値 :ディーラーが勝ちなら0より大きい整数、
|
||
プレイヤーが勝ちなら0より小さい整数、
|
||
引き分けなら0
|
||
〇機能 :プレイヤーがBustなら無条件にディーラーの勝ち
|
||
プレイヤーがBustでなく、ディーラーがBustならプレイヤーの勝ち
|
||
どちらか一方がナチュラルブラックジャックならその人が勝ち
|
||
上記以外は合計値が高い方が勝ち
|
||
BlackJackクラスのmainメソッドで、ディーラーの合計値を表示後、以下の処理を追加する。
|
||
・compareToメソッドの戻り値に応じ、以下のいずれかを表示する。
|
||
<プレイヤーの名前>は勝ちです。
|
||
<プレイヤーの名前>は負けです。
|
||
<プレイヤーの名前>は引き分けです。
|
||
|
||
14段階目(掛け金計算)
|
||
Handクラスに以下のpublicなメソッドを追加する。
|
||
〇メソッド名:clearHands()
|
||
〇引数 :なし
|
||
〇戻り値 :なし
|
||
〇機能 :手札を全部削除する
|
||
Playerクラスにint型のmoneyフィールドとbetMoneyフィールドを追加する。
|
||
どちらもprivateとし、セッターは作らず、ゲッターメソッドのみpublicのみで作成する。
|
||
Playerクラスのコンストラクタの引数にmoneyを追加し、引数のmoneyをそのままフィールドにセットする
|
||
Playerクラスに以下のpublicなメソッドを追加する。
|
||
〇メソッド名:addMoney
|
||
〇引数 :加算金額
|
||
〇戻り値 :なし
|
||
〇機能 :moneyフィールドに引数の加算金額を加える。
|
||
|
||
〇メソッド名:bet
|
||
〇引数 :なし
|
||
〇戻り値 :なし
|
||
〇機能 :キーボードから掛け金を入力させ、以下のエラーの場合は対応するエラーメッセージを
|
||
表示して再入力させる。エラー出なければbetMoneyに設定する。
|
||
●int型に変換できない
|
||
→数値を入力してください
|
||
●0円以下
|
||
→1以上にしてね!
|
||
●持ち金(money)を超えている
|
||
→そんなにお金持ってないでしょ!
|
||
BlackJackクラスのmainメソッドに以下の処理を追加する。
|
||
・最初に以下を表示する
|
||
全5回ゲームを行います。
|
||
※ただし持ち金が無くなった時点でゲーム終了です。
|
||
・Playerのインスタンス作成時、初期の持ち金10000円とする。
|
||
・以下の処理を5回繰り返す。
|
||
〇ゲームの最初に以下を表示する
|
||
(一行空行をあける)
|
||
<回数>回目のゲームを開始します。
|
||
BET金額を入力してください。(持ち金:<プレイヤーの持ち金>円)
|
||
〇Playerクラスのbetメソッドで掛け金を入力する。
|
||
〇区切り線「==========================================================」を表示する
|
||
〇12段階目の処理を行う。ただし、各参加者にカードを2枚ずつ配る前に全員の手札を削除する。
|
||
〇勝敗表示は以下とする。
|
||
<プレイヤーの名前>は勝ちです。配当金をお渡しします。
|
||
<プレイヤーの名前>は負けです。掛け金は没収します。
|
||
<プレイヤーの名前>は引き分けです。掛け金を払い戻します。
|
||
〇負けの場合は持ち金から掛け金を減算、引き分けの場合は±0、
|
||
勝ちの場合は持ち金に掛け金を加算する。
|
||
ただし、プレイヤーがナチュラルブラックジャックで勝った場合は掛け金を1.5倍して加算。
|
||
〇清算した結果、持ち金が0になったら以下を表示してプログラムを終了する。
|
||
お金がありません。。。もう終わりです。
|
||
〇5回ゲームしたら最後に以下の表示をしてプログラムを終了する。
|
||
あなたのスコアは<持ち金>円でした
|
||
|
||
<以下、時間が余った人向け>
|
||
15段階目(例外判定)
|
||
例外処理を入れないといけないところを考えて適切に処理する
|
||
例)デッキからカードを引こうとしたらもうデッキにカードがない場合 etc
|
||
|
||
16段階目(複数のプレイヤー)
|
||
実際のカジノでは1人のディーラーが複数のプレイヤーと同時にゲームするのが普通。
|
||
プレイヤーが複数でもゲームできるようにする。
|
||
|
||
17段階目(特別ルール)
|
||
スプリットやインシュランスなどの特別ルールを実装する。
|
||
ルールはネット等で調べること。どのルールを実装するかは開発者に任せる。
|