回答編集履歴

10

コード修正

2020/07/17 15:01

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -28,9 +28,53 @@
28
28
 
29
29
  ---
30
30
 
31
- 今回`A`は`1`決め打ちということなので、以下の3行を修正とコメントの`total()`修正で一応動きます。
31
+ 今回`A`は`1`決め打ちということなので、以下の4行を修正とコメントの`total()`修正で一応動きます。
32
32
 
33
33
  ```diff
34
+
35
+ int draw(void)
36
+
37
+ {
38
+
39
+ static int card[53];
40
+
41
+ static int count = 0; // 引いた枚数
42
+
43
+
44
+
45
+ srand(time(NULL)); // 乱数のタネ
46
+
47
+ int r;
48
+
49
+
50
+
51
+ do {
52
+
53
+ r = rand() % 52 + 1; //1~52の乱数
54
+
55
+ card[r]++; //2回目以上なら2以上
56
+
57
+ } while (card[r] > 1 && count < 52);
58
+
59
+
60
+
61
+ - if (count > 52) {
62
+
63
+ + if (count >= 52) {
64
+
65
+ r = 0;
66
+
67
+ }
68
+
69
+
70
+
71
+ count++;
72
+
73
+
74
+
75
+ return r;
76
+
77
+ }
34
78
 
35
79
  -void change(int n)
36
80
 

9

文言修正

2020/07/17 15:01

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -28,7 +28,7 @@
28
28
 
29
29
  ---
30
30
 
31
- 今回`A`は`1`決め打ちということなので、以下の4行を修正とコメントの`total()`修正で一応動きます。
31
+ 今回`A`は`1`決め打ちということなので、以下の3行を修正とコメントの`total()`修正で一応動きます。
32
32
 
33
33
  ```diff
34
34
 

8

コード修正(Aについて勘違いしていたのを修正)

2020/07/17 14:36

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -29,8 +29,6 @@
29
29
  ---
30
30
 
31
31
  今回`A`は`1`決め打ちということなので、以下の4行を修正とコメントの`total()`修正で一応動きます。
32
-
33
- よく見たら、`1`を`A`と表示しているだけで、`A`は`10`として足していたので修正
34
32
 
35
33
  ```diff
36
34
 
@@ -68,9 +66,7 @@
68
66
 
69
67
  switch (number) {
70
68
 
71
- - case 1: cout << "A"; break;
69
+ case 1: cout << "A"; break;
72
-
73
- + case 10: cout << "A"; number = 1; break; // `1`を`A`と表示しているだけで、`A`は`10`として足していたので修正
74
70
 
75
71
  case 11: cout << "J"; break;
76
72
 

7

`1`を`A`と表示しているだけで、`A`は`10`として足していたので修正

2020/07/17 14:35

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -28,7 +28,9 @@
28
28
 
29
29
  ---
30
30
 
31
- 今回`A`は`1`決め打ちということなので、以下の3行を修正とコメントの`total()`修正で一応動きます。
31
+ 今回`A`は`1`決め打ちということなので、以下の4行を修正とコメントの`total()`修正で一応動きます。
32
+
33
+ よく見たら、`1`を`A`と表示しているだけで、`A`は`10`として足していたので修正
32
34
 
33
35
  ```diff
34
36
 
@@ -66,7 +68,9 @@
66
68
 
67
69
  switch (number) {
68
70
 
69
- case 1: cout << "A"; break;
71
+ - case 1: cout << "A"; break;
72
+
73
+ + case 10: cout << "A"; number = 1; break; // `1`を`A`と表示しているだけで、`A`は`10`として足していたので修正
70
74
 
71
75
  case 11: cout << "J"; break;
72
76
 

6

コード追記

2020/07/17 14:34

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -23,3 +23,113 @@
23
23
  カードを引く処理は別の場所でやっていて、結果を表示するだけならループはいりませんよね。
24
24
 
25
25
  それとも`21`を超えていた場合に`A`を`1`と`11`切り替えて計算しなおす処理を入れようとして、そのコードがないままループだけとなっていたのでしょうか。
26
+
27
+
28
+
29
+ ---
30
+
31
+ 今回`A`は`1`決め打ちということなので、以下の3行を修正とコメントの`total()`修正で一応動きます。
32
+
33
+ ```diff
34
+
35
+ -void change(int n)
36
+
37
+ +int change(int n)
38
+
39
+ {
40
+
41
+ int suit, number; //スートと数字
42
+
43
+
44
+
45
+ suit = (n - 1) / 13; //スートの計算
46
+
47
+
48
+
49
+ number = n - 13 * suit; //数字の計算
50
+
51
+
52
+
53
+ switch (suit) {
54
+
55
+ case 0: cout << "S"; break;
56
+
57
+ case 1: cout << "H"; break;
58
+
59
+ case 2: cout << "D"; break;
60
+
61
+ case 3: cout << "C"; break;
62
+
63
+ }
64
+
65
+
66
+
67
+ switch (number) {
68
+
69
+ case 1: cout << "A"; break;
70
+
71
+ case 11: cout << "J"; break;
72
+
73
+ case 12: cout << "Q"; break;
74
+
75
+ case 13: cout << "K"; break;
76
+
77
+ default: cout << number;
78
+
79
+ }
80
+
81
+ + return number;
82
+
83
+ }
84
+
85
+
86
+
87
+ int main()
88
+
89
+ {
90
+
91
+ char check; // YかN
92
+
93
+
94
+
95
+ int number; //draw関数で引いた数字
96
+
97
+
98
+
99
+ do {
100
+
101
+ cout << "カードを引きますか?(Y/N):";
102
+
103
+ cin >> check;
104
+
105
+ if (check == 'Y') {
106
+
107
+ number = draw();
108
+
109
+ if (number) { // 0でなかったらカードを表示
110
+
111
+ - change(number); // カードの数字とスートを返す
112
+
113
+ + number = change(number); // カードの数字とスートを返す
114
+
115
+ cout << endl;
116
+
117
+ }
118
+
119
+ else {
120
+
121
+ check = 'N';
122
+
123
+ cout << "カードがありません。" << endl;
124
+
125
+ }
126
+
127
+ total(number);
128
+
129
+ }
130
+
131
+ } while (check != 'N');
132
+
133
+ }
134
+
135
+ ```

5

ループについて追記

2020/07/17 14:28

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -10,7 +10,7 @@
10
10
 
11
11
  ---
12
12
 
13
- ブラックジャックでは`A`は、1と11のどちらか都合の良いほうとして扱えるのに、その処理がありません。
13
+ ブラックジャックでは`A`は、`1``11`のどちらか都合の良いほうとして扱えるのに、その処理がありません。
14
14
 
15
15
  引かれたカードを覚えておいて合計を求める際に足すか、`11`として足しておき合計が`21`を超える場合は最大で`A`を引いた枚数まで`10`を引いて`21`以下になるなら続行する処理がいります。
16
16
 
@@ -21,3 +21,5 @@
21
21
  貼られたコードだと`total()`は`goukei`が21未満だった場合、無限ループして`goukei`を表示し続けています。
22
22
 
23
23
  カードを引く処理は別の場所でやっていて、結果を表示するだけならループはいりませんよね。
24
+
25
+ それとも`21`を超えていた場合に`A`を`1`と`11`切り替えて計算しなおす処理を入れようとして、そのコードがないままループだけとなっていたのでしょうか。

4

文言修正、指摘転記

2020/07/17 14:22

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -1,5 +1,23 @@
1
- `draw()`で`1`~`52`を返し、その値をそのまま`total()`に渡しているためスペード以外のカードでは大きが足されています。
1
+ > 適当数字予め足されている状態ででます。
2
2
 
3
3
 
4
4
 
5
+ `goukei`の初期値は`0`で、足されていません。
6
+
7
+ `draw()`で`1`~`52`を返し、その値をそのまま`total()`に渡しているためスペード以外のカードでは大きな値が足されているだけです。
8
+
9
+
10
+
11
+ ---
12
+
5
- また、ブラックジャックでは`A`は、1と11のどちらか都合の良いほうとして扱えるのに、その処理がありません。
13
+ ブラックジャックでは`A`は、1と11のどちらか都合の良いほうとして扱えるのに、その処理がありません。
14
+
15
+ 引かれたカードを覚えておいて合計を求める際に足すか、`11`として足しておき合計が`21`を超える場合は最大で`A`を引いた枚数まで`10`を引いて`21`以下になるなら続行する処理がいります。
16
+
17
+
18
+
19
+ ---
20
+
21
+ 貼られたコードだと`total()`は`goukei`が21未満だった場合、無限ループして`goukei`を表示し続けています。
22
+
23
+ カードを引く処理は別の場所でやっていて、結果を表示するだけならループはいりませんよね。

3

指摘追加

2020/07/17 14:16

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -1 +1,5 @@
1
1
  `draw()`で`1`~`52`を返し、その値をそのまま`total()`に渡しているためスペード以外のカードでは大きな値が足されています。
2
+
3
+
4
+
5
+ また、ブラックジャックでは`A`は、1と11のどちらか都合の良いほうとして扱えるのに、その処理がありません。

2

文言修正

2020/07/17 14:06

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -1 +1 @@
1
- `draw`で`1`~`52`を返し、その値をそのまま`total()`に渡しているため大きな値が足されています。
1
+ `draw()`で`1`~`52`を返し、その値をそのまま`total()`に渡しているためスペード以外のカードでは大きな値が足されています。

1

間違い修正

2020/07/17 14:03

投稿

SHOMI
SHOMI

スコア4079

test CHANGED
@@ -1,3 +1 @@
1
- `main()`内の`number`に初期値を設定していないため不定値が入っています。
2
-
3
- また、引いたカードを`number`に格納せずにそのまま`total()`に渡しているため不定値が加算されています。
1
+ `draw`で`1`~`52`を返し、その値をそのまま`total()`に渡しているため大きな値がされています。