回答編集履歴

4

追加

2018/06/24 17:38

投稿

swordone
swordone

スコア20649

test CHANGED
@@ -171,3 +171,79 @@
171
171
  }
172
172
 
173
173
  ```
174
+
175
+
176
+
177
+ ### Hit,Blowの判定の改善
178
+
179
+ ```java
180
+
181
+ private boolean checkHitAndBlow(String[] cpuNumArray, String[] playerNumArray){
182
+
183
+
184
+
185
+ int hitCount = 0;
186
+
187
+ int blowCount = 0;
188
+
189
+
190
+
191
+ // 面倒なんで重複チェックはSetに任せた
192
+
193
+ boolean unique = new HashSet<String>(Arrays.asList(playerNumArray)).size() == MAX_LENGTH;
194
+
195
+
196
+
197
+ //数字のチェック
198
+
199
+ if (unique) {
200
+
201
+ for(int i = 0; i < MAX_LENGTH; i++){
202
+
203
+ for(int j = 0; j < MAX_LENGTH; j++){
204
+
205
+ if(playerNumArray[i].equals(cpuNumArray[j])){
206
+
207
+ if (i == j) hitCount++;
208
+
209
+ else blowCount++
210
+
211
+ break;
212
+
213
+ }
214
+
215
+
216
+
217
+ }
218
+
219
+ }
220
+
221
+ } else {
222
+
223
+ for (int i = 0; i < MAX_LENGTH; i++) {
224
+
225
+ if (playerNumArray[i].equals(cpuNumArray[j])
226
+
227
+ hitCount++;
228
+
229
+ }
230
+
231
+ }
232
+
233
+
234
+
235
+ System.out.println(hitCount + " Hit " + blowCount + "Blow");
236
+
237
+
238
+
239
+ if(hitCount == MAX_LENGTH){
240
+
241
+ return true;
242
+
243
+ }
244
+
245
+ return false;
246
+
247
+ }
248
+
249
+ ```

3

追加

2018/06/24 17:38

投稿

swordone
swordone

スコア20649

test CHANGED
@@ -18,7 +18,9 @@
18
18
 
19
19
  ### 追記に対して
20
20
 
21
+ ####cpuNumArrayメソッドについて
22
+
21
- まず、cpuNumArrayメソッドについて。(メソッド名は小文字始まりが慣例なので修正。ガタガタインデントも修正。)
23
+ メソッド名は小文字始まりが慣例なので修正。ガタガタインデントも修正。
22
24
 
23
25
 
24
26
 
@@ -88,12 +90,84 @@
88
90
 
89
91
  ムダなループがあったりする以外はOKかと。
90
92
 
93
+ ####hitカウント、blowカウントについて
91
94
 
92
-
93
- つぎに、blowカウントについてはコメントの間違いでした。
95
+ 回答の間違いでした。
94
96
 
95
97
  「重複=0blow」ならば、きちんと重複をチェックする必要があります。
96
98
 
97
99
 
98
100
 
99
- 3Hitの理由は、1桁目をcpuの配列の0番目ではなく1番目に入れているから。
101
+ 3Hitの理由は上記コメントの通り、1桁目をcpuの配列の0番目ではなく1番目に入れているから。
102
+
103
+ 例えばコメントのように5697と表示されたときは、実は次のような流れになっています。
104
+
105
+ 0. 最初の3が配列の1番目に格納。CpuNumの中身は{null, "5", null, null}
106
+
107
+ 0. 次の6が配列の1番目に格納。CpuNumの中身は{null, "6", null, null}
108
+
109
+ 0. その後、9と7がそれぞれ2番目、3番目に格納され、CpuNumの中身は{null, "6", "9", "7"}
110
+
111
+ 0. 入力された5697に対しては、**blow判定が1ループでbreakしてしまうため、最初の5としか比較できない。**(ここは本当はifの中でbreakしてというつもりだった)
112
+
113
+ 5はCpuNumに入っていないため、blowは0になる。
114
+
115
+ 0. 最初の5にhit判定ができず(nullとの比較のため)、3hit止まり。blowは3回引かれ、‐3blowとなる。
116
+
117
+
118
+
119
+ ### LinkedList不要
120
+
121
+ フィッシャー・イェーツ法という、効率的なシャッフルアルゴリズムを利用すれば、LinkedListを作らなくても桁重複なしの乱数が作れます。
122
+
123
+ ```java
124
+
125
+ private String[] cpuNumArray() {
126
+
127
+ String[] cpuNum = new String[MAX_LENGTH];
128
+
129
+ int index = (int)(Math.random() * NUM_ARRAY.length);
130
+
131
+ switchElem(NUM_ARRAY, index, NUM_ARRAY.length - 1);
132
+
133
+ if (NUM_ARRAY[NUM_ARRAY.length - 1].equals("0")){
134
+
135
+ index = (int)(Math.random() * (NUM_ARRAY.length - 1));
136
+
137
+ switchElem(NUM_ARRAY, index, NUM_ARRAY.length - 1);
138
+
139
+ }
140
+
141
+ cpuNum[0] = NUM_ARRAY[NUM_ARRAY.length - 1];
142
+
143
+
144
+
145
+ for (int i = 1; i < MAX_LENGTH; i++) {
146
+
147
+ index = (int)(Math.random() * (NUM_ARRAY.length - i));
148
+
149
+ cpuNum[i] = NUM_ARRAY[index];
150
+
151
+ switchElem(NUM_ARRAY, index, NUM_ARRAY.length - 1 - i);
152
+
153
+ }
154
+
155
+ return cpuNum;
156
+
157
+ }
158
+
159
+
160
+
161
+ private void switchElem(String[] a, int i, int j) {
162
+
163
+ if (i == j) return;
164
+
165
+ String temp = a[i];
166
+
167
+ a[i] = a[j];
168
+
169
+ a[j] = temp;
170
+
171
+ }
172
+
173
+ ```

2

追加

2018/06/24 03:20

投稿

swordone
swordone

スコア20649

test CHANGED
@@ -10,7 +10,9 @@
10
10
 
11
11
 
12
12
 
13
- これも簡単。blowCountが増えた時点でbreakしてしまえばいい。
13
+ ~~これも簡単。blowCountが増えた時点でbreakしてしまえばいい。~~
14
+
15
+ 間違いでした。詳細は後述
14
16
 
15
17
 
16
18
 
@@ -46,9 +48,19 @@
46
48
 
47
49
  int num = (int)(Math.random() * 9) + 1;
48
50
 
51
+
52
+
53
+ //ここのインデックスは0。
54
+
55
+ //元のコードではループカウンタのiを使っており、
56
+
57
+ //1で初期化されていたため、0番目に何も入らなかった
58
+
59
+ //これが3hitの理由
60
+
49
61
  CpuNum[0] = tempList.remove(num);
50
62
 
51
- System.out.println(CpuNum[i]);
63
+ System.out.println(CpuNum[0]);
52
64
 
53
65
 
54
66
 
@@ -81,3 +93,7 @@
81
93
  つぎに、blowカウントについてはコメントの間違いでした。
82
94
 
83
95
  「重複=0blow」ならば、きちんと重複をチェックする必要があります。
96
+
97
+
98
+
99
+ 3Hitの理由は、1桁目をcpuの配列の0番目ではなく1番目に入れているから。

1

追記

2018/06/20 17:19

投稿

swordone
swordone

スコア20649

test CHANGED
@@ -11,3 +11,73 @@
11
11
 
12
12
 
13
13
  これも簡単。blowCountが増えた時点でbreakしてしまえばいい。
14
+
15
+
16
+
17
+ ### 追記に対して
18
+
19
+ まず、cpuNumArrayメソッドについて。(メソッド名は小文字始まりが慣例なので修正。ガタガタインデントも修正。)
20
+
21
+
22
+
23
+ ```java
24
+
25
+ private String[] cpuNumArray(){
26
+
27
+
28
+
29
+ List<String> tempList = new
30
+
31
+ LinkedList<String>(Arrays.asList(NUM_ARRAY));
32
+
33
+
34
+
35
+ String[] CpuNum = new String[4];
36
+
37
+
38
+
39
+ //1回しかしないならループ不要。
40
+
41
+ //for(int i = 1; i < 2; i++){
42
+
43
+
44
+
45
+ //最初は1から9の乱数 floorも不要
46
+
47
+ int num = (int)(Math.random() * 9) + 1;
48
+
49
+ CpuNum[0] = tempList.remove(num);
50
+
51
+ System.out.println(CpuNum[i]);
52
+
53
+
54
+
55
+ for(int j = 1; j < 4; j++){
56
+
57
+ int num2 = (int)(Math.random() * (10-j));
58
+
59
+ CpuNum[j] = tempList.remove(num2);
60
+
61
+ System.out.println(CpuNum[j]);
62
+
63
+ }
64
+
65
+ //}
66
+
67
+
68
+
69
+ return CpuNum;
70
+
71
+
72
+
73
+ }
74
+
75
+ ```
76
+
77
+ ムダなループがあったりする以外はOKかと。
78
+
79
+
80
+
81
+ つぎに、blowカウントについてはコメントの間違いでした。
82
+
83
+ 「重複=0blow」ならば、きちんと重複をチェックする必要があります。