回答編集履歴

6

コード最適化

2020/03/20 16:12

投稿

jimbe
jimbe

スコア12670

test CHANGED
@@ -338,33 +338,21 @@
338
338
 
339
339
  //ディーラーが手札を17以上にするまでカードを引くフェーズ
340
340
 
341
- while (true) {
342
-
343
- //手札が17以上の場合ブレーク
344
-
345
- if (dealer.sumPoint() >= 17) {
341
+ while (dealer.sumPoint() < 17) {
346
-
347
- break;
342
+
348
-
349
- } else {
350
-
351
- //手札に山札から1枚加える
343
+ //手札に山札から1枚加える
352
-
344
+
353
- int index = dealer.add(deck.pop());
345
+ int index = dealer.add(deck.pop());
354
-
346
+
355
- System.out.println("ディーラーの" + (index+1) + "枚目のカードは" + dealer.get(index));
347
+ System.out.println("ディーラーの" + (index+1) + "枚目のカードは" + dealer.get(index));
356
-
348
+
357
- //ディーラーのバーストチェック
349
+ //ディーラーのバーストチェック
358
-
350
+
359
- if (dealer.isBusted()) {
351
+ if (dealer.isBusted()) {
360
-
352
+
361
- System.out.println("ディーラーがバーストしました。あなたの勝ちです!");
353
+ System.out.println("ディーラーがバーストしました。あなたの勝ちです!");
362
-
354
+
363
- return;
355
+ return;
364
-
365
-
366
-
367
- }
368
356
 
369
357
  }
370
358
 

5

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

2020/03/20 16:12

投稿

jimbe
jimbe

スコア12670

test CHANGED
@@ -200,10 +200,26 @@
200
200
 
201
201
  for(Card card : cardList) sum += card.getPoint();
202
202
 
203
+ if(hasAce() && sum+10 <= 21) sum += 10;
204
+
203
205
  return sum;
204
206
 
205
207
  }
206
208
 
209
+ /** A を持っているか */
210
+
211
+ private boolean hasAce() {
212
+
213
+ for(Card card : cardList) {
214
+
215
+ if(card.getPoint() == 1) return true;
216
+
217
+ }
218
+
219
+ return false;
220
+
221
+ }
222
+
207
223
  /**
208
224
 
209
225
  * 手札がバーストしているか
@@ -388,32 +404,26 @@
388
404
 
389
405
  ブラックジャックへようこそ!
390
406
 
391
- 貴方の1枚目のカードはダイヤ3
407
+ 貴方の1枚目のカードはスペードJ
392
-
408
+
393
- ディーラーの1枚目のカードはスペJ
409
+ ディーラーの1枚目のカードはA
394
-
410
+
395
- 貴方の2枚目のカードはダイヤ6
411
+ 貴方の2枚目のカードはハートK
396
412
 
397
413
  ディーラーの2枚めのカードは秘密だよ
398
414
 
399
- あなたの現在のポイントは9です
415
+ あなたの現在のポイントは20です
400
416
 
401
417
  カードを引きますか? Yes:y or No:n
402
418
 
403
- y
404
-
405
- あなたの3枚目のカードはダイヤのJ
406
-
407
- 現在の合計は19
408
-
409
- カードを引きますか? Yes:y or No:n
410
-
411
419
  n
412
420
 
413
- ディーラーの2枚目のカードはハートの4
414
-
415
- ディーラーの3枚目のカードはクラブの8
421
+ ディーラーの2枚目のカードはクラブのJ
422
+
416
-
423
+ あなたのポイントは20
424
+
417
- ディーラーがバースしました。あなたの勝ちです!
425
+ ディーラーのポインは21
426
+
427
+ 負けました・・・
418
428
 
419
429
  ```

4

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

2020/03/15 10:25

投稿

jimbe
jimbe

スコア12670

test CHANGED
@@ -100,7 +100,7 @@
100
100
 
101
101
  public String toString() {
102
102
 
103
- return RANKS[getRankIndex()] + "の" + SUITS[getSuitIndex()];
103
+ return SUITS[getSuitIndex()] + "の" + RANKS[getRankIndex()];
104
104
 
105
105
  }
106
106
 
@@ -388,34 +388,32 @@
388
388
 
389
389
  ブラックジャックへようこそ!
390
390
 
391
- 貴方の1枚目のカードは6のダイヤ
391
+ 貴方の1枚目のカードはダイヤの3
392
-
392
+
393
- ディーラーの1枚目のカードはJのハート
393
+ ディーラーの1枚目のカードはスペードのJ
394
-
394
+
395
- 貴方の2枚目のカードはQクラブ
395
+ 貴方の2枚目のカードはダイヤ6
396
396
 
397
397
  ディーラーの2枚めのカードは秘密だよ
398
398
 
399
- あなたの現在のポイントは16です
399
+ あなたの現在のポイントは9です
400
400
 
401
401
  カードを引きますか? Yes:y or No:n
402
402
 
403
403
  y
404
404
 
405
- あなたの3枚目のカードは4のダイヤ
405
+ あなたの3枚目のカードはダイヤのJ
406
-
406
+
407
- 現在の合計は20
407
+ 現在の合計は19
408
408
 
409
409
  カードを引きますか? Yes:y or No:n
410
410
 
411
411
  n
412
412
 
413
- ディーラーの2枚目のカードは7ダイヤ
413
+ ディーラーの2枚目のカードはハート4
414
-
415
- あなたのポイントは20
414
+
416
-
417
- ディーラーのポイント17
415
+ ディーラーの3枚目のカードクラブの8
418
-
416
+
419
- 勝ちました!
417
+ ディーラーがバーストしました。あなたの勝ちです
420
418
 
421
419
  ```

3

未使用メソッド削除

2020/03/15 08:46

投稿

jimbe
jimbe

スコア12670

test CHANGED
@@ -172,12 +172,6 @@
172
172
 
173
173
  }
174
174
 
175
- int size() {
176
-
177
- return cardList.size();
178
-
179
- }
180
-
181
175
  /**
182
176
 
183
177
  * カード読出

2

実行結果追加

2020/03/15 08:43

投稿

jimbe
jimbe

スコア12670

test CHANGED
@@ -389,3 +389,39 @@
389
389
  }
390
390
 
391
391
  ```
392
+
393
+ ```plain text
394
+
395
+ ブラックジャックへようこそ!
396
+
397
+ 貴方の1枚目のカードは6のダイヤ
398
+
399
+ ディーラーの1枚目のカードはJのハート
400
+
401
+ 貴方の2枚目のカードはQのクラブ
402
+
403
+ ディーラーの2枚めのカードは秘密だよ
404
+
405
+ あなたの現在のポイントは16です
406
+
407
+ カードを引きますか? Yes:y or No:n
408
+
409
+ y
410
+
411
+ あなたの3枚目のカードは4のダイヤ
412
+
413
+ 現在の合計は20
414
+
415
+ カードを引きますか? Yes:y or No:n
416
+
417
+ n
418
+
419
+ ディーラーの2枚目のカードは7のダイヤ
420
+
421
+ あなたのポイントは20
422
+
423
+ ディーラーのポイントは17
424
+
425
+ 勝ちました!
426
+
427
+ ```

1

コード追加

2020/03/15 08:37

投稿

jimbe
jimbe

スコア12670

test CHANGED
@@ -19,3 +19,373 @@
19
19
  ```
20
20
 
21
21
  で良いのではないでしょうか.
22
+
23
+
24
+
25
+ #追加
26
+
27
+ クラスがクラスとして使われていませんので, Card クラスを追加し Deck に有ったカード関係メソッドを移動 / Player,Deck 両クラスに手札の ArrayList を移動, Deck に有ったポイント計算等のメソッドを移動する等再編してみました.
28
+
29
+
30
+
31
+ 手札の番号表示に関しましては, Player.add メソッドがカードを追加した際にその追加位置を index として返すようにし, それを利用しています.
32
+
33
+ ```java
34
+
35
+ import java.util.*;
36
+
37
+
38
+
39
+ class Card {
40
+
41
+ private static final String[] RANKS = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
42
+
43
+ private static final String[] SUITS = {"クラブ","ダイヤ","ハート","スペード"};
44
+
45
+
46
+
47
+ private int cardNumber; //1-52
48
+
49
+ /**
50
+
51
+ * @param cardNumber 1-52
52
+
53
+ */
54
+
55
+ Card(int cardNumber) {
56
+
57
+ this.cardNumber = cardNumber;
58
+
59
+ }
60
+
61
+ /**
62
+
63
+ * 得点計算用
64
+
65
+ * @return 1-10
66
+
67
+ */
68
+
69
+ int getPoint() {
70
+
71
+ return Math.min(getRankIndex() + 1, 10);
72
+
73
+ }
74
+
75
+ /**
76
+
77
+ * @return 0-12
78
+
79
+ */
80
+
81
+ private int getRankIndex() {
82
+
83
+ return (cardNumber - 1) % 13;
84
+
85
+ }
86
+
87
+ /**
88
+
89
+ * @return 0-3
90
+
91
+ */
92
+
93
+ private int getSuitIndex() {
94
+
95
+ return (cardNumber - 1) / 13;
96
+
97
+ }
98
+
99
+
100
+
101
+ public String toString() {
102
+
103
+ return RANKS[getRankIndex()] + "の" + SUITS[getSuitIndex()];
104
+
105
+ }
106
+
107
+ }
108
+
109
+ class Deck {
110
+
111
+ private List<Card> cardList = new ArrayList<>(52); //山札
112
+
113
+
114
+
115
+ Deck() {
116
+
117
+ for(int i=1; i<=52; i++) cardList.add(new Card(i));
118
+
119
+ Collections.shuffle(cardList);
120
+
121
+ }
122
+
123
+ /**
124
+
125
+ * 最初の一枚を取り出し, リストから削除
126
+
127
+ * @return カード
128
+
129
+ */
130
+
131
+ Card pop() {
132
+
133
+ return cardList.remove(0);
134
+
135
+ }
136
+
137
+
138
+
139
+ // シャッフルしたカードを表示
140
+
141
+ void printAll() {
142
+
143
+ for(Card i : cardList) {
144
+
145
+ System.out.println(i);
146
+
147
+ }
148
+
149
+ }
150
+
151
+ }
152
+
153
+ class Player {
154
+
155
+ private List<Card> cardList = new ArrayList<>(); //手札
156
+
157
+ /**
158
+
159
+ * カード追加
160
+
161
+ * @param card
162
+
163
+ * @return 最後に追加したindex (0-)
164
+
165
+ */
166
+
167
+ int add(Card card) {
168
+
169
+ cardList.add(card);
170
+
171
+ return cardList.size() - 1;
172
+
173
+ }
174
+
175
+ int size() {
176
+
177
+ return cardList.size();
178
+
179
+ }
180
+
181
+ /**
182
+
183
+ * カード読出
184
+
185
+ * @param index (0-)
186
+
187
+ * @return
188
+
189
+ */
190
+
191
+ Card get(int index) {
192
+
193
+ return cardList.get(index);
194
+
195
+ }
196
+
197
+ /**
198
+
199
+ * 現在の合計ポイント
200
+
201
+ */
202
+
203
+ int sumPoint() {
204
+
205
+ int sum = 0;
206
+
207
+ for(Card card : cardList) sum += card.getPoint();
208
+
209
+ return sum;
210
+
211
+ }
212
+
213
+ /**
214
+
215
+ * 手札がバーストしているか
216
+
217
+ */
218
+
219
+ boolean isBusted() {
220
+
221
+ return sumPoint() > 21;
222
+
223
+ }
224
+
225
+ }
226
+
227
+ public class MainGame {
228
+
229
+ public static void main(String[] args) {
230
+
231
+ System.out.println("ブラックジャックへようこそ!");
232
+
233
+
234
+
235
+ Deck deck = new Deck();
236
+
237
+ //deck.printAll(); //デバック用
238
+
239
+
240
+
241
+ Player player = new Player(); //プレイヤーを作成
242
+
243
+ Player dealer = new Player(); //ディーラーを作成
244
+
245
+
246
+
247
+ //プレイヤー・ディーラーがカードを2枚引く
248
+
249
+ player.add(deck.pop());
250
+
251
+ dealer.add(deck.pop());
252
+
253
+ player.add(deck.pop());
254
+
255
+ dealer.add(deck.pop());
256
+
257
+
258
+
259
+ //プレイヤー・ディーラーの手札を表示
260
+
261
+ System.out.println("貴方の1枚目のカードは" + player.get(0));
262
+
263
+ System.out.println("ディーラーの1枚目のカードは" + dealer.get(0));
264
+
265
+ System.out.println("貴方の2枚目のカードは" + player.get(1));
266
+
267
+ System.out.println("ディーラーの2枚めのカードは秘密だよ");
268
+
269
+
270
+
271
+ System.out.println("あなたの現在のポイントは" + player.sumPoint() + "です");
272
+
273
+
274
+
275
+ //プレイヤーがカードを引くフェーズ
276
+
277
+ try (Scanner scan = new Scanner(System.in);) {
278
+
279
+ while (true) {
280
+
281
+ System.out.println("カードを引きますか? Yes:y or No:n");
282
+
283
+ //キーボードの入力を受け付けて、変数strに代入する
284
+
285
+ String str = scan.next();
286
+
287
+
288
+
289
+ if ("n".equals(str)) {
290
+
291
+ break;
292
+
293
+ } else if ("y".equals(str)) {
294
+
295
+ //手札に山札から1枚加える
296
+
297
+ int index = player.add(deck.pop());
298
+
299
+ System.out.println("あなたの" + (index+1) + "枚目のカードは" + player.get(index));
300
+
301
+ System.out.println("現在の合計は" + player.sumPoint());
302
+
303
+ //プレイヤーのバーストチェック
304
+
305
+ if (player.isBusted()) {
306
+
307
+ System.out.println("残念、バーストしてしまいました。ディーラーの勝ちです。");
308
+
309
+ return;
310
+
311
+ }
312
+
313
+ } else {
314
+
315
+ System.out.println("あなたの入力は"
316
+
317
+ + str + "です。y か n を入力してください。");
318
+
319
+ }
320
+
321
+ }
322
+
323
+ }
324
+
325
+
326
+
327
+ System.out.println("ディーラーの2枚目のカードは" + dealer.get(1));
328
+
329
+ //ディーラーが手札を17以上にするまでカードを引くフェーズ
330
+
331
+ while (true) {
332
+
333
+ //手札が17以上の場合ブレーク
334
+
335
+ if (dealer.sumPoint() >= 17) {
336
+
337
+ break;
338
+
339
+ } else {
340
+
341
+ //手札に山札から1枚加える
342
+
343
+ int index = dealer.add(deck.pop());
344
+
345
+ System.out.println("ディーラーの" + (index+1) + "枚目のカードは" + dealer.get(index));
346
+
347
+ //ディーラーのバーストチェック
348
+
349
+ if (dealer.isBusted()) {
350
+
351
+ System.out.println("ディーラーがバーストしました。あなたの勝ちです!");
352
+
353
+ return;
354
+
355
+
356
+
357
+ }
358
+
359
+ }
360
+
361
+ }
362
+
363
+
364
+
365
+ //ポイントを比較する
366
+
367
+ System.out.println("あなたのポイントは" + player.sumPoint());
368
+
369
+ System.out.println("ディーラーのポイントは" + dealer.sumPoint());
370
+
371
+
372
+
373
+ if ( player.sumPoint() == dealer.sumPoint()) {
374
+
375
+ System.out.println("引き分けです。");
376
+
377
+ } else if ( player.sumPoint() > dealer.sumPoint()) {
378
+
379
+ System.out.println("勝ちました!");
380
+
381
+ } else {
382
+
383
+ System.out.println("負けました・・・");
384
+
385
+ }
386
+
387
+ }
388
+
389
+ }
390
+
391
+ ```