回答編集履歴
2
1,11
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/
|
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 card
|
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(card
|
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
|
-
card
|
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
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
|
|