teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

3

制作途中のソースコードの改善追記

2018/06/20 16:13

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -144,6 +144,146 @@
144
144
 
145
145
  ```
146
146
 
147
+ ### 作成途中のソースコード(追記 2018.6.21)
148
+
149
+ ```Java
150
+
151
+ import java.io.IOException;
152
+ import java.util.Arrays;
153
+ import java.util.LinkedList;
154
+ import java.util.List;
155
+ import java.util.Scanner;
156
+
157
+ public class Tokubetsu5 {
158
+
159
+ public static final String[] NUM_ARRAY = {"0","1", "2", "3", "4", "5", "6", "7", "8", "9"};
160
+
161
+ public static final int MAX_LENGTH = 4;
162
+
163
+ public static void main(String[] args) throws IOException{
164
+ Tokubetsu5 hb = new Tokubetsu5();
165
+ hb.execute();
166
+ }
167
+
168
+ private void execute() throws IOException{
169
+
170
+ String[] cpuNumArray = CpuNumArray();
171
+
172
+ boolean clear = false;
173
+ try(Scanner sc = new Scanner(System.in)){
174
+
175
+ //攻略できるまでループ
176
+ while(!clear){
177
+
178
+ String[] playerNumArray = PlayerNum(sc);
179
+
180
+ clear = checkHitAndBlow(cpuNumArray, playerNumArray);
181
+
182
+ }
183
+ }
184
+ System.out.println("正解です");
185
+ System.out.println("終了します");
186
+
187
+ }
188
+
189
+
190
+ private String[] CpuNumArray(){
191
+ //数字の列を作成
192
+ List<String> tempList = new LinkedList<String>(Arrays.asList(NUM_ARRAY));
193
+
194
+ String[] CpuNum = new String[4];
195
+
196
+ //1回繰り返し、数字をランダムで取得
197
+ for(int i = 1; i < 2; i++){
198
+ int num = (int)(Math.floor(Math.random() * (10-i)));
199
+ //一度使用した数字はリストから削除
200
+
201
+ CpuNum[i] = tempList.remove(num);
202
+
203
+ //解答確認用
204
+ System.out.println(CpuNum[i]);
205
+
206
+ //3回繰り返し、数字をランダムで取得
207
+ for(int j = 1; j < 4; j++){
208
+ int num2 = (int)(Math.floor(Math.random() * (10-j)));
209
+ //一度使用した数字はリストから削除
210
+
211
+ CpuNum[j] = tempList.remove(num2);
212
+
213
+ //解答確認用
214
+ System.out.println(CpuNum[j]);
215
+ }
216
+ }
217
+
218
+ return CpuNum;
219
+
220
+ }
221
+
222
+ private String[] PlayerNum(Scanner sc) throws IOException{
223
+
224
+ boolean Check = false;
225
+ String line = null;
226
+
227
+ //入力OKになるまで繰り返し
228
+ check:
229
+ while(!Check){
230
+
231
+ System.out.println("4桁の数字を入力してください。");
232
+ line = sc.nextLine();
233
+
234
+ //文字数チェック
235
+ if(line.length() > MAX_LENGTH){
236
+ System.out.println("入力した桁数が多いです");
237
+ continue;
238
+ }else if(line.length() < MAX_LENGTH){
239
+ System.out.println("入力した桁数が少ないです");
240
+ continue;
241
+ }
242
+
243
+ Check = true;
244
+
245
+ }
246
+
247
+ return line.split("");
248
+ }
249
+
250
+ private boolean checkHitAndBlow(String[] cpuNumArray, String[] playerNumArray){
251
+
252
+ int hitCount = 0;
253
+ int blowCount = 0;
254
+
255
+ //数字のチェック
256
+ for(int i = 0; i < MAX_LENGTH; i++){
257
+ for(int j = 0; j < MAX_LENGTH; j++){
258
+ if(playerNumArray[i].equals(cpuNumArray[j])){
259
+ blowCount++;
260
+
261
+ }
262
+
263
+ }
264
+ break;
265
+ }
266
+
267
+ for(int i = 0; i < MAX_LENGTH; i++){
268
+ if(playerNumArray[i].equals(cpuNumArray[i])){
269
+ blowCount--;
270
+ hitCount++;
271
+
272
+ }
273
+ }
274
+
275
+ System.out.println(hitCount + " Hit " + blowCount + "Blow");
276
+
277
+ if(hitCount == MAX_LENGTH){
278
+ return true;
279
+ }
280
+ return false;
281
+ }
282
+ }
283
+
284
+
285
+ ```
286
+
147
287
  ### やりたいこと
148
288
  現状のコードでHit&Blowはプレイすることが可能ではありますが、
149
289
  入力した4桁の数値が重複した場合、

2

修正

2018/06/20 16:13

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -17,7 +17,7 @@
17
17
  4桁の数字が正解するまで再入力させること。
18
18
  答えの数は乱数を用いること。
19
19
  4桁の数字の先頭を0から始めてはならない。
20
- 3466など、入力値は重複させないようにすること。( 0blowと表示させること )
20
+ 3366など、入力値は重複させないようにすること。( 0blowと表示させること )
21
21
 
22
22
 
23
23
 
@@ -101,17 +101,8 @@
101
101
  System.out.println("入力した桁数が少ないです");
102
102
  continue;
103
103
  }
104
- /*
105
- //入力値が重複していないかチェック
106
- for(int i = 0; i < MAX_LENGTH - 1; i++){
107
- String lineSub = line.substring(i+1);
108
- if(lineSub.indexOf(line.substring(i, i+1)) != -1){
109
- System.out.println("入力した数値が重複しています");
110
- continue check;
111
- }
112
- }
113
- */
114
104
 
105
+
115
106
  Check = true;
116
107
 
117
108
  }
@@ -119,6 +110,7 @@
119
110
  return line.split("");
120
111
  }
121
112
 
113
+
122
114
  private boolean checkHitAndBlow(String[] cpuNumArray, String[] playerNumArray){
123
115
 
124
116
  int hitCount = 0;
@@ -166,7 +158,7 @@
166
158
  3333
167
159
  1Hit 0Blow
168
160
 
169
- という表示をさせたいのですが、自力では閃かず、お力をお借りしたく存じます。
161
+ という表示をさせたいのですが、自力では閃かず、お力をお借りしたく思います。
170
162
  また、現状では先頭0始まり( 例: 0123 )の表示も通ってしまうため、
171
163
  0始まりにならない方法もご教授願いたく思います。
172
164
  お手数おかけしますが、何卒よろしくお願いいたします。

1

問題文の追加

2018/06/17 17:07

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -3,13 +3,24 @@
3
3
  課題にてHit&Blowをjavaを用いて作成しております。
4
4
  あともう一歩で完成という段階まできたのですが、問題の条件の一部である、
5
5
  「4桁の数字の先頭を0から始めてはならない」
6
- 「入力値重複した場合、重複した数値は出さないようにすること。(0blowと表示)」
6
+ 「入力値重複さないようにすること。(0blowと表示)」
7
7
  という部分がどうしてもできず、困っております。
8
8
  どなたかご教授願えませんでしょうか。
9
9
  よろしくお願いいたします。
10
10
 
11
+ ### 問題文
11
12
 
13
+ javaを用いてHit&Blowを作成しなさい。また、以下の条件を踏まえることとする。
12
14
 
15
+ 条件:
16
+ 4桁の数字を探すゲームであること。
17
+ 4桁の数字が正解するまで再入力させること。
18
+ 答えの数は乱数を用いること。
19
+ 4桁の数字の先頭を0から始めてはならない。
20
+ 3466など、入力値は重複させないようにすること。( 0blowと表示させること )
21
+
22
+
23
+
13
24
  ### 作成途中のソースコード
14
25
 
15
26
  ```Java