回答編集履歴

2

1,11

2022/11/14 15:11

投稿

Cocode
Cocode

スコア2314

test CHANGED
@@ -2,7 +2,7 @@
2
2
  通常のブラックジャックとはちょっと違うルールなのでしょうか?
3
3
  一応以下のルールを前提にコードを書きました。
4
4
 
5
- - カードAは`1`固定とする
5
+ - カードAは`1`と`11`どちらにも対応するが、3枚目までで21以下かの判定の際は`1`として扱う
6
6
  - カード2〜10は数字の通りとする
7
7
  - カードJ, Q, Kは、`11`, `12`, `13` とする
8
8
 
@@ -17,7 +17,7 @@
17
17
  そうならないように、引いたカードは山札から削除する処理をしました。
18
18
 
19
19
  ### コード例
20
- - 動作確認用:https://jsfiddle.net/41pcotwn/
20
+ - 動作確認用:https://jsfiddle.net/rkudan86/
21
21
 
22
22
  ボタンをクリックしたら、敵・ユーザーそれぞれカードを1枚引くようにしました。
23
23
 
@@ -26,6 +26,15 @@
26
26
  ```
27
27
 
28
28
  ```javascript
29
+ console.clear();
30
+
31
+ // エースカードの数字
32
+ const ace = [1, 11];
33
+ // 山札を生成
34
+ const cardsInDeck = Array.from({length: 13}, (_, i) => Array(4).fill((i===0 ? 'A' : i+1))).flat();
35
+ // ['A', 'A', 'A', 'A', 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13]
36
+ console.log(cardsInDeck)
37
+
29
38
  // クラスを定義
30
39
  class Player {
31
40
  constructor() {
@@ -43,22 +52,23 @@
43
52
  }
44
53
 
45
54
  // 配列(手札)の合計値が、22未満か確認するメソッド
55
+ // エースの時は1として扱う
46
- isSmallerThan22(num) {
56
+ isSmallerThan22(numOrStr) {
47
- return this.cardsInHand.reduce((acc, cur) => acc + cur, 0) + num < 22;
57
+ return this.cardsInHand.reduce((acc, cur) => acc + (cur === 'A' ? ace[0] : cur), 0) + (numOrStr === 'A' ? ace[0] : numOrStr) < 22;
48
58
  }
49
59
 
50
60
  // 山札からカードを引いて、手札にいれるメソッド
51
61
  drawCard(allCardsArr) {
52
62
  let randIdx = this.getRandomIndex(allCardsArr);
53
- let cardNum = this.getRandomCard(allCardsArr, randIdx);
63
+ let card = this.getRandomCard(allCardsArr, randIdx);
54
64
 
55
65
  // 配列の長さが3未満(今持っている手札が2枚まで)の場合
56
66
  if (this.cardsInHand.length < 3) {
57
67
  while (true) {
58
68
  // 手札と新しくひいたカードの合計値が22未満か確認
59
- const flag = this.isSmallerThan22(cardNum);
69
+ const flag = this.isSmallerThan22(card);
60
70
 
61
- // 22未満なら、whileループを終了する(そのカードで決定)
71
+ // 22未満なら、whileループを終了する
62
72
  if (flag) {
63
73
  break;
64
74
 
@@ -66,7 +76,7 @@
66
76
  } else {
67
77
  console.log('手札が2枚以下、かつ、合計が21を超えるので、カードを引き直します。');
68
78
  randIdx = this.getRandomIndex(allCardsArr);
69
- cardNum = this.getRandomCard(allCardsArr, randIdx);
79
+ card = this.getRandomCard(allCardsArr, randIdx);
70
80
  }
71
81
  }
72
82
  }
@@ -81,10 +91,6 @@
81
91
 
82
92
  const user = new Player();
83
93
  const enemy = new Player();
84
-
85
- // 山札を生成
86
- const cardsInDeck = Array.from({length: 13}, (_, i) => Array(4).fill(i + 1)).flat();
87
- // [1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13]
88
94
 
89
95
  const btnDraw = document.querySelector('#btn-draw');
90
96
  btnDraw.addEventListener('click', drawCard);

1

sample

2022/11/14 13:43

投稿

Cocode
Cocode

スコア2314

test CHANGED
@@ -2,7 +2,7 @@
2
2
  通常のブラックジャックとはちょっと違うルールなのでしょうか?
3
3
  一応以下のルールを前提にコードを書きました。
4
4
 
5
- - カードAは`1`とする
5
+ - カードAは`1`固定とする
6
6
  - カード2〜10は数字の通りとする
7
7
  - カードJ, Q, Kは、`11`, `12`, `13` とする
8
8
 
@@ -17,6 +17,8 @@
17
17
  そうならないように、引いたカードは山札から削除する処理をしました。
18
18
 
19
19
  ### コード例
20
+ - 動作確認用:https://jsfiddle.net/41pcotwn/
21
+
20
22
  ボタンをクリックしたら、敵・ユーザーそれぞれカードを1枚引くようにしました。
21
23
 
22
24
  ```html
@@ -27,7 +29,7 @@
27
29
  // クラスを定義
28
30
  class Player {
29
31
  constructor() {
30
- this.cardsInHand = [];
32
+ this.cardsInHand = []; // 手札
31
33
  }
32
34
 
33
35
  // 配列の長さの範囲内(残りの山札数)で、ランダムな番号を生成するメソッド
@@ -80,6 +82,7 @@
80
82
  const user = new Player();
81
83
  const enemy = new Player();
82
84
 
85
+ // 山札を生成
83
86
  const cardsInDeck = Array.from({length: 13}, (_, i) => Array(4).fill(i + 1)).flat();
84
87
  // [1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13]
85
88