Files
java-challenge/CUI_BlackJack
2026-09-16 12:25:03 +09:00
..
2026-09-16 12:25:03 +09:00

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

○システム名
  ブラックジャック

○システム説明
  通常のブラックジャックです。

○納品物
  作成したプログラム

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段階目(特別ルール)
スプリットやインシュランスなどの特別ルールを実装する。
ルールはネット等で調べること。どのルールを実装するかは開発者に任せる。