挑戦問題を格納しました
This commit is contained in:
387
CUI_BlackJack/README.txt
Normal file
387
CUI_BlackJack/README.txt
Normal file
@@ -0,0 +1,387 @@
|
||||
○システム名
|
||||
ブラックジャック
|
||||
|
||||
○システム説明
|
||||
通常のブラックジャックです。
|
||||
|
||||
○納品物
|
||||
作成したプログラム
|
||||
|
||||
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段階目(特別ルール)
|
||||
スプリットやインシュランスなどの特別ルールを実装する。
|
||||
ルールはネット等で調べること。どのルールを実装するかは開発者に任せる。
|
||||
Reference in New Issue
Block a user