質問するログイン新規登録

回答編集履歴

6

コード最適化

2020/03/20 16:12

投稿

jimbe
jimbe

スコア13394

answer CHANGED
@@ -168,20 +168,14 @@
168
168
 
169
169
  System.out.println("ディーラーの2枚目のカードは" + dealer.get(1));
170
170
  //ディーラーが手札を17以上にするまでカードを引くフェーズ
171
- while (true) {
172
- //手札が17以上の場合ブレーク
173
- if (dealer.sumPoint() >= 17) {
171
+ while (dealer.sumPoint() < 17) {
174
- break;
175
- } else {
176
- //手札に山札から1枚加える
172
+ //手札に山札から1枚加える
177
- int index = dealer.add(deck.pop());
173
+ int index = dealer.add(deck.pop());
178
- System.out.println("ディーラーの" + (index+1) + "枚目のカードは" + dealer.get(index));
174
+ System.out.println("ディーラーの" + (index+1) + "枚目のカードは" + dealer.get(index));
179
- //ディーラーのバーストチェック
175
+ //ディーラーのバーストチェック
180
- if (dealer.isBusted()) {
176
+ if (dealer.isBusted()) {
181
- System.out.println("ディーラーがバーストしました。あなたの勝ちです!");
177
+ System.out.println("ディーラーがバーストしました。あなたの勝ちです!");
182
- return;
178
+ return;
183
-
184
- }
185
179
  }
186
180
  }
187
181
 

5

A を 11 ポイントとしても扱うように修正

2020/03/20 16:12

投稿

jimbe
jimbe

スコア13394

answer CHANGED
@@ -99,8 +99,16 @@
99
99
  int sumPoint() {
100
100
  int sum = 0;
101
101
  for(Card card : cardList) sum += card.getPoint();
102
+ if(hasAce() && sum+10 <= 21) sum += 10;
102
103
  return sum;
103
104
  }
105
+ /** A を持っているか */
106
+ private boolean hasAce() {
107
+ for(Card card : cardList) {
108
+ if(card.getPoint() == 1) return true;
109
+ }
110
+ return false;
111
+ }
104
112
  /**
105
113
  * 手札がバーストしているか
106
114
  */
@@ -193,18 +201,15 @@
193
201
  ```
194
202
  ```plain text
195
203
  ブラックジャックへようこそ!
196
- 貴方の1枚目のカードはダイヤ3
204
+ 貴方の1枚目のカードはスペードJ
197
- ディーラーの1枚目のカードはスペJ
205
+ ディーラーの1枚目のカードはA
198
- 貴方の2枚目のカードはダイヤ6
206
+ 貴方の2枚目のカードはハートK
199
207
  ディーラーの2枚めのカードは秘密だよ
200
- あなたの現在のポイントは9です
208
+ あなたの現在のポイントは20です
201
209
  カードを引きますか? Yes:y or No:n
202
- y
203
- あなたの3枚目のカードはダイヤのJ
204
- 現在の合計は19
205
- カードを引きますか? Yes:y or No:n
206
210
  n
207
- ディーラーの2枚目のカードはハートの4
208
- ディーラーの3枚目のカードはクラブの8
211
+ ディーラーの2枚目のカードはクラブのJ
212
+ あなたのポイントは20
209
- ディーラーがバーストしました。あなた勝ちです!
213
+ ディーラーのポイントは21
214
+ 負けました・・・
210
215
  ```

4

カードのSUITとRANKの表示順が逆でした

2020/03/15 10:25

投稿

jimbe
jimbe

スコア13394

answer CHANGED
@@ -49,7 +49,7 @@
49
49
  }
50
50
 
51
51
  public String toString() {
52
- return RANKS[getRankIndex()] + "の" + SUITS[getSuitIndex()];
52
+ return SUITS[getSuitIndex()] + "の" + RANKS[getRankIndex()];
53
53
  }
54
54
  }
55
55
  class Deck {
@@ -193,19 +193,18 @@
193
193
  ```
194
194
  ```plain text
195
195
  ブラックジャックへようこそ!
196
- 貴方の1枚目のカードは6のダイヤ
196
+ 貴方の1枚目のカードはダイヤの3
197
- ディーラーの1枚目のカードはJのハ
197
+ ディーラーの1枚目のカードはスペドのJ
198
- 貴方の2枚目のカードはQクラブ
198
+ 貴方の2枚目のカードはダイヤ6
199
199
  ディーラーの2枚めのカードは秘密だよ
200
- あなたの現在のポイントは16です
200
+ あなたの現在のポイントは9です
201
201
  カードを引きますか? Yes:y or No:n
202
202
  y
203
- あなたの3枚目のカードは4のダイヤ
203
+ あなたの3枚目のカードはダイヤのJ
204
- 現在の合計は20
204
+ 現在の合計は19
205
205
  カードを引きますか? Yes:y or No:n
206
206
  n
207
- ディーラーの2枚目のカードは7ダイヤ
207
+ ディーラーの2枚目のカードはハート4
208
- あなたのポイントは20
209
- ディーラーのポイント17
208
+ ディーラーの3枚目のカードクラブの8
210
- 勝ちました!
209
+ ディーラーがバーストしました。あなたの勝ちです
211
210
  ```

3

未使用メソッド削除

2020/03/15 08:46

投稿

jimbe
jimbe

スコア13394

answer CHANGED
@@ -85,9 +85,6 @@
85
85
  cardList.add(card);
86
86
  return cardList.size() - 1;
87
87
  }
88
- int size() {
89
- return cardList.size();
90
- }
91
88
  /**
92
89
  * カード読出
93
90
  * @param index (0-)

2

実行結果追加

2020/03/15 08:43

投稿

jimbe
jimbe

スコア13394

answer CHANGED
@@ -193,4 +193,22 @@
193
193
  }
194
194
  }
195
195
  }
196
+ ```
197
+ ```plain text
198
+ ブラックジャックへようこそ!
199
+ 貴方の1枚目のカードは6のダイヤ
200
+ ディーラーの1枚目のカードはJのハート
201
+ 貴方の2枚目のカードはQのクラブ
202
+ ディーラーの2枚めのカードは秘密だよ
203
+ あなたの現在のポイントは16です
204
+ カードを引きますか? Yes:y or No:n
205
+ y
206
+ あなたの3枚目のカードは4のダイヤ
207
+ 現在の合計は20
208
+ カードを引きますか? Yes:y or No:n
209
+ n
210
+ ディーラーの2枚目のカードは7のダイヤ
211
+ あなたのポイントは20
212
+ ディーラーのポイントは17
213
+ 勝ちました!
196
214
  ```

1

コード追加

2020/03/15 08:37

投稿

jimbe
jimbe

スコア13394

answer CHANGED
@@ -8,4 +8,189 @@
8
8
  System.out.println("貴方の1枚目のカードは"
9
9
  + Deck.toDescription(player.get(0)));
10
10
  ```
11
- で良いのではないでしょうか.
11
+ で良いのではないでしょうか.
12
+
13
+ #追加
14
+ クラスがクラスとして使われていませんので, Card クラスを追加し Deck に有ったカード関係メソッドを移動 / Player,Deck 両クラスに手札の ArrayList を移動, Deck に有ったポイント計算等のメソッドを移動する等再編してみました.
15
+
16
+ 手札の番号表示に関しましては, Player.add メソッドがカードを追加した際にその追加位置を index として返すようにし, それを利用しています.
17
+ ```java
18
+ import java.util.*;
19
+
20
+ class Card {
21
+ private static final String[] RANKS = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
22
+ private static final String[] SUITS = {"クラブ","ダイヤ","ハート","スペード"};
23
+
24
+ private int cardNumber; //1-52
25
+ /**
26
+ * @param cardNumber 1-52
27
+ */
28
+ Card(int cardNumber) {
29
+ this.cardNumber = cardNumber;
30
+ }
31
+ /**
32
+ * 得点計算用
33
+ * @return 1-10
34
+ */
35
+ int getPoint() {
36
+ return Math.min(getRankIndex() + 1, 10);
37
+ }
38
+ /**
39
+ * @return 0-12
40
+ */
41
+ private int getRankIndex() {
42
+ return (cardNumber - 1) % 13;
43
+ }
44
+ /**
45
+ * @return 0-3
46
+ */
47
+ private int getSuitIndex() {
48
+ return (cardNumber - 1) / 13;
49
+ }
50
+
51
+ public String toString() {
52
+ return RANKS[getRankIndex()] + "の" + SUITS[getSuitIndex()];
53
+ }
54
+ }
55
+ class Deck {
56
+ private List<Card> cardList = new ArrayList<>(52); //山札
57
+
58
+ Deck() {
59
+ for(int i=1; i<=52; i++) cardList.add(new Card(i));
60
+ Collections.shuffle(cardList);
61
+ }
62
+ /**
63
+ * 最初の一枚を取り出し, リストから削除
64
+ * @return カード
65
+ */
66
+ Card pop() {
67
+ return cardList.remove(0);
68
+ }
69
+
70
+ // シャッフルしたカードを表示
71
+ void printAll() {
72
+ for(Card i : cardList) {
73
+ System.out.println(i);
74
+ }
75
+ }
76
+ }
77
+ class Player {
78
+ private List<Card> cardList = new ArrayList<>(); //手札
79
+ /**
80
+ * カード追加
81
+ * @param card
82
+ * @return 最後に追加したindex (0-)
83
+ */
84
+ int add(Card card) {
85
+ cardList.add(card);
86
+ return cardList.size() - 1;
87
+ }
88
+ int size() {
89
+ return cardList.size();
90
+ }
91
+ /**
92
+ * カード読出
93
+ * @param index (0-)
94
+ * @return
95
+ */
96
+ Card get(int index) {
97
+ return cardList.get(index);
98
+ }
99
+ /**
100
+ * 現在の合計ポイント
101
+ */
102
+ int sumPoint() {
103
+ int sum = 0;
104
+ for(Card card : cardList) sum += card.getPoint();
105
+ return sum;
106
+ }
107
+ /**
108
+ * 手札がバーストしているか
109
+ */
110
+ boolean isBusted() {
111
+ return sumPoint() > 21;
112
+ }
113
+ }
114
+ public class MainGame {
115
+ public static void main(String[] args) {
116
+ System.out.println("ブラックジャックへようこそ!");
117
+
118
+ Deck deck = new Deck();
119
+ //deck.printAll(); //デバック用
120
+
121
+ Player player = new Player(); //プレイヤーを作成
122
+ Player dealer = new Player(); //ディーラーを作成
123
+
124
+ //プレイヤー・ディーラーがカードを2枚引く
125
+ player.add(deck.pop());
126
+ dealer.add(deck.pop());
127
+ player.add(deck.pop());
128
+ dealer.add(deck.pop());
129
+
130
+ //プレイヤー・ディーラーの手札を表示
131
+ System.out.println("貴方の1枚目のカードは" + player.get(0));
132
+ System.out.println("ディーラーの1枚目のカードは" + dealer.get(0));
133
+ System.out.println("貴方の2枚目のカードは" + player.get(1));
134
+ System.out.println("ディーラーの2枚めのカードは秘密だよ");
135
+
136
+ System.out.println("あなたの現在のポイントは" + player.sumPoint() + "です");
137
+
138
+ //プレイヤーがカードを引くフェーズ
139
+ try (Scanner scan = new Scanner(System.in);) {
140
+ while (true) {
141
+ System.out.println("カードを引きますか? Yes:y or No:n");
142
+ //キーボードの入力を受け付けて、変数strに代入する
143
+ String str = scan.next();
144
+
145
+ if ("n".equals(str)) {
146
+ break;
147
+ } else if ("y".equals(str)) {
148
+ //手札に山札から1枚加える
149
+ int index = player.add(deck.pop());
150
+ System.out.println("あなたの" + (index+1) + "枚目のカードは" + player.get(index));
151
+ System.out.println("現在の合計は" + player.sumPoint());
152
+ //プレイヤーのバーストチェック
153
+ if (player.isBusted()) {
154
+ System.out.println("残念、バーストしてしまいました。ディーラーの勝ちです。");
155
+ return;
156
+ }
157
+ } else {
158
+ System.out.println("あなたの入力は"
159
+ + str + "です。y か n を入力してください。");
160
+ }
161
+ }
162
+ }
163
+
164
+ System.out.println("ディーラーの2枚目のカードは" + dealer.get(1));
165
+ //ディーラーが手札を17以上にするまでカードを引くフェーズ
166
+ while (true) {
167
+ //手札が17以上の場合ブレーク
168
+ if (dealer.sumPoint() >= 17) {
169
+ break;
170
+ } else {
171
+ //手札に山札から1枚加える
172
+ int index = dealer.add(deck.pop());
173
+ System.out.println("ディーラーの" + (index+1) + "枚目のカードは" + dealer.get(index));
174
+ //ディーラーのバーストチェック
175
+ if (dealer.isBusted()) {
176
+ System.out.println("ディーラーがバーストしました。あなたの勝ちです!");
177
+ return;
178
+
179
+ }
180
+ }
181
+ }
182
+
183
+ //ポイントを比較する
184
+ System.out.println("あなたのポイントは" + player.sumPoint());
185
+ System.out.println("ディーラーのポイントは" + dealer.sumPoint());
186
+
187
+ if ( player.sumPoint() == dealer.sumPoint()) {
188
+ System.out.println("引き分けです。");
189
+ } else if ( player.sumPoint() > dealer.sumPoint()) {
190
+ System.out.println("勝ちました!");
191
+ } else {
192
+ System.out.println("負けました・・・");
193
+ }
194
+ }
195
+ }
196
+ ```