回答編集履歴

2

mdミス

2022/09/18 16:37

投稿

TN8001
TN8001

スコア9855

test CHANGED
@@ -1,511 +1,256 @@
1
1
  今のコードを最大限尊重すると、こんな感じでしょうか。
2
2
 
3
-
4
-
5
3
  * 中途半端な命名見直し
6
-
7
4
  すいませんguとか使って^^;
8
-
9
5
  * `Main.nameInfo`への依存解消
10
-
11
6
  結局`BattleSystem`でしか使っていないうえ、長くて冗長。
12
-
13
7
  * 変わらない変数は`final`
14
-
15
8
  意図せず変更されないように。
16
-
17
9
  * 表示順をあなた敵に固定
18
-
19
- おそらくわざとやっているのでしょうが、共通化しにくいのと入れ替わると意外と見にくい。
10
+ おそらくわざとやっているのでしょうが、共通化しにくいのと入れ替わると意外と見にくい。
20
-
21
-
22
11
 
23
12
  ```Java
24
-
25
13
  import java.util.Random;
26
-
27
14
  import java.util.Scanner;
28
15
 
29
-
30
-
31
16
  public class Main {
32
-
33
17
  public static void main(String[] args) {
34
-
35
18
  final Scanner scanner = new Scanner(System.in);
36
-
37
19
  final Random rand = new Random();
38
20
 
39
-
40
-
41
21
  // NamedはBattleSystemでしか使ってないのであげちゃう ついでにRandomも
42
-
43
22
  final BattleSystem status = new BattleSystem(new Named(scanner), rand);
44
23
 
45
-
46
-
47
24
  // 数字だとわかりにくいので
48
-
49
25
  final int gu = 0;
50
-
51
26
  final int tyoki = 1;
52
-
53
27
  final int pa = 2;
54
28
 
55
-
56
-
57
29
  while (0 < status.playerHp && 0 < status.enemyHp) {
58
-
59
30
  System.out.println("-----------------------------------------");
60
-
61
31
  System.out.println("コマンド? 0:グー 1:チョキ 2:パー");
62
-
63
32
  int hand = scanner.nextInt();
64
33
 
65
-
66
-
67
34
  if (hand == 9) {
68
-
69
35
  System.out.println("コマンド9検出:強制終了しました");
70
-
71
36
  return; // 勝ち負け判定に入らないように抜ける
72
-
73
- }
37
+ }
74
-
75
-
76
38
 
77
39
  int com = rand.nextInt(3);
78
40
 
79
-
80
-
81
41
  if (hand == com) {
82
-
83
42
  System.out.println("引き分け");
84
-
85
- }
43
+ }
86
-
87
44
  // かっこや改行があれば長い条件も結構わかりやすくないですか
88
-
89
45
  else if ((com == gu && hand == pa) ||
90
-
91
46
  (com == tyoki && hand == gu) ||
92
-
93
47
  (com == pa && hand == tyoki)) {
94
-
95
48
  status.attack();
96
-
97
49
  } else {
98
-
99
50
  status.damage();
100
-
101
- }
51
+ }
102
-
103
- }
52
+ }
104
-
105
-
106
53
 
107
54
  System.out.println("-----------------------------------------");
108
-
109
55
  if (status.enemyHp <= 0) {
110
-
111
56
  System.out.println("☆YOU WIN☆");
112
-
113
57
  } else {
114
-
115
58
  System.out.println("✖YOU LOSE✖");
116
-
117
- }
59
+ }
118
-
119
- }
60
+ }
120
-
121
- }
61
+ }
122
-
123
-
124
62
 
125
63
  class Named {
126
-
127
64
  final String playerName;
128
-
129
65
  final String enemyName;
130
66
 
131
-
132
-
133
67
  // どうせinput_youname するならコンストラクタでいいでしょう メンバ変数もfinalにできる
134
-
135
68
  Named(Scanner scanner) {
136
-
137
69
  System.out.print("あなたの名前を入力してください ▼ ");
138
-
139
70
  playerName = scanner.nextLine();
140
-
141
71
  System.out.println(playerName + "が入力されました");
142
72
 
143
-
144
-
145
73
  System.out.print("敵の名前を入力してください ▼ ");
146
-
147
74
  enemyName = scanner.nextLine();
148
-
149
75
  System.out.println(enemyName + "が入力されました");
150
76
 
151
-
152
-
153
77
  System.out.println();
154
-
155
78
  System.out.println("あなたの名前は" + playerName + "です");
156
-
157
79
  System.out.println("敵の名前は" + enemyName + "です");
158
-
159
- }
80
+ }
160
-
161
- }
81
+ }
162
-
163
-
164
82
 
165
83
  class BattleSystem {
166
-
167
84
  private final Named nameInfo;
168
-
169
85
  private final Random rand;
170
86
 
171
-
172
-
173
87
  int playerHp = 20;
174
-
175
88
  int enemyHp = 20;
176
89
 
177
-
178
-
179
90
  BattleSystem(Named named, Random random) {
180
-
181
91
  nameInfo = named;
182
-
183
92
  rand = random;
184
-
185
- }
93
+ }
186
-
187
-
188
94
 
189
95
  void attack() {
190
-
191
96
  int damag = getDamagePoint();
192
-
193
97
  enemyHp -= damag; // enemiHp = enemiHp - damag; 同じ意味
194
-
195
98
  print(nameInfo.playerName, nameInfo.enemyName, damag);
196
-
197
- }
99
+ }
198
-
199
-
200
100
 
201
101
  void damage() {
202
-
203
102
  int damag = getDamagePoint();
204
-
205
103
  playerHp -= damag;
206
-
207
104
  print(nameInfo.enemyName, nameInfo.playerName, damag);
208
-
209
- }
105
+ }
210
-
211
-
212
106
 
213
107
  private int getDamagePoint() {
214
-
215
108
  int damag = rand.nextInt(3) + 1;
216
-
217
109
  if (rand.nextInt(10) == 9) { // クリティカル時 5倍
218
-
219
110
  damag *= 5; // damag = damag * 5; 同じ意味
220
-
221
- }
111
+ }
222
-
223
112
  return damag;
224
-
225
- }
113
+ }
226
-
227
-
228
114
 
229
115
  private void print(String winner, String loser, int damage) {
230
-
231
116
  System.out.println(winner + "の勝ち");
232
-
233
117
  System.out.println(loser + "は" + damage + "のダメージを受けた");
234
118
 
235
-
236
-
237
119
  System.out.println();
238
-
239
120
  System.out.println(nameInfo.playerName + " HP:" + playerHp + "/20");
240
-
241
121
  System.out.println(nameInfo.enemyName + " HP:" + enemyHp + "/20");
242
-
243
- }
122
+ }
244
-
245
- }
123
+ }
246
-
247
124
  ```
248
125
 
249
-
250
-
251
126
  ---
252
127
 
253
-
254
-
255
128
  > ゲームの修正点1 継承・抽象メソッドを使用したゲームにする
256
-
257
129
  > 具体的にはCpuとHuman(人間)をそれぞれ別のクラスとして作り、共通の親クラスPlayerを継承するようにしたいです。
258
130
 
259
-
260
-
261
131
  もともとの内容にもついでに一例を出しておきます(あんまりイケてないですw
262
-
263
132
  ~~9割方できているので`class Human`・`class Cpu`を作ってみてください^^(`int getHand()`を実装するだけです)~~
264
133
 
265
-
266
-
267
134
  ```Java
268
-
269
135
  import java.util.Random;
270
-
271
136
  import java.util.Scanner;
272
137
 
273
-
274
-
275
138
  public class Main {
276
-
277
139
  public static void main(String[] args) {
278
-
279
140
  // 人間を表すHumanクラスからインスタンスを一つ生成します
280
-
281
141
  // ゲームに参加する人間は一人なので、new Humanするのはここでの1回限り
282
-
283
142
  // ほかでnew Humanしてしまうと別の人間が新たに参加することになってしまう!
284
-
285
143
  Player player = new Human("あなた", 20);
286
144
 
287
-
288
-
289
145
  // CPUを表すHumanクラスからインスタンスを一つ生成します
290
-
291
146
  // ゲームに参加するCPUは一個なので、...以下同文
292
-
293
147
  Player cpu = new Cpu("敵", 20);
294
148
 
295
-
296
-
297
149
  System.out.println();
298
-
299
150
  System.out.println("あなたの名前は" + player.getName() + "です");
300
-
301
151
  System.out.println("敵の名前は" + cpu.getName() + "です");
302
152
 
303
-
304
-
305
153
  final int gu = 0;
306
-
307
154
  final int tyoki = 1;
308
-
309
155
  final int pa = 2;
310
156
 
311
-
312
-
313
157
  // どちらとも生きている(0 < Hp)間はループ
314
-
315
158
  while (player.isAlive() && cpu.isAlive()) {
316
-
317
159
  int hand = player.getHand(); // playerの手を取得
318
-
319
160
  if (hand == 9) {
320
-
321
161
  System.out.println("コマンド9検出:強制終了しました");
322
-
323
162
  return; // 勝ち負け判定に入らないように抜ける
324
-
325
163
  } else if (2 < hand) {
326
-
327
164
  System.out.println("数値は0・1・2から選んで入力して下さい");
328
-
329
165
  continue; // ループ先頭に戻り手の再入力
330
-
331
- }
166
+ }
332
-
333
-
334
167
 
335
168
  int com = cpu.getHand(); // cpuの手を取得
336
169
 
337
-
338
-
339
170
  if (hand == com) {
340
-
341
171
  System.out.println("引き分け");
342
-
343
172
  continue;
344
-
345
173
  } else if ((com == gu && hand == pa) ||
346
-
347
174
  (com == tyoki && hand == gu) ||
348
-
349
175
  (com == pa && hand == tyoki)) {
350
-
351
176
  player.attack(cpu); // playerの勝ち playerがcpuに攻撃
352
-
353
177
  } else {
354
-
355
178
  cpu.attack(player); // cpuの勝ち cpuがplayerに攻撃
356
-
357
- }
179
+ }
358
-
359
-
360
180
 
361
181
  System.out.println();
362
-
363
182
  System.out.println(player); // toString()をオーバ-ライド 名前 HP:現在値/Max値
364
-
365
183
  System.out.println(cpu); // 同上
366
-
367
- }
184
+ }
368
-
369
-
370
185
 
371
186
  System.out.println("-----------------------------------------");
372
-
373
187
  if (player.isAlive()) {
374
-
375
188
  System.out.println("☆YOU WIN☆");
376
-
377
189
  } else {
378
-
379
190
  System.out.println("✖YOU LOSE✖");
380
-
381
- }
191
+ }
382
-
383
- }
192
+ }
384
-
385
- }
193
+ }
386
-
387
-
388
194
 
389
195
  abstract class Player {
390
-
391
196
  // あまりstaticは使いたくないが、まあprotected finalならいいでしょう^^;
392
-
393
197
  // Scannerに依存するのもどうなの?感ありw
394
-
395
198
  protected static final Scanner scanner = new Scanner(System.in);
396
-
397
199
  protected static final Random rand = new Random();
398
200
 
399
-
400
-
401
201
  private final String name;
402
-
403
202
  private final int maxHp;
404
203
 
405
-
406
-
407
204
  private int hp;
408
205
 
409
206
 
410
-
411
-
412
-
413
207
  Player(String tmpName, int hp) { // 呼びかけ用の仮名、初期hp
414
-
415
208
  this.hp = maxHp = hp;
416
209
 
417
-
418
-
419
210
  System.out.print(tmpName + "の名前を入力してください ▼ ");
420
-
421
211
  name = scanner.nextLine();
422
-
423
212
  System.out.println(name + "が入力されました");
424
-
425
- }
213
+ }
426
-
427
-
428
214
 
429
215
  String getName() { return name; } // 名前の取得
430
216
 
431
-
432
-
433
217
  boolean isAlive() { return 0 < hp; } // 生きているかどうか
434
218
 
435
-
436
-
437
219
  abstract int getHand(); // 手の番号取得 0:グー 1:チョキ 2:パー
438
220
 
439
-
440
-
441
221
  // 相手に攻撃
442
-
443
222
  // なぜ引数で相手を与えるかというと、両方のnameが欲しいから
444
-
445
223
  void attack(Player other) {
446
-
447
224
  int damage = rand.nextInt(3) + 1;
448
-
449
225
  if (rand.nextInt(10) == 9) {
450
-
451
226
  damage *= 5;
452
-
453
- }
227
+ }
454
-
455
228
  other.hp -= damage; // 相手のHpを減らす
456
229
 
457
-
458
-
459
230
  System.out.println(name + "の勝ち");
460
-
461
231
  System.out.println(other.name + "は" + damage + "のダメージを受けた");
462
-
463
- }
232
+ }
464
-
465
-
466
233
 
467
234
  @Override public String toString() { return name + " HP:" + hp + "/" + maxHp; }
468
-
469
- }
235
+ }
470
-
471
-
472
236
 
473
237
  class Human extends Player {
474
-
475
238
  Human(String tmpName, int hp) {
476
-
477
239
  super(tmpName, hp);
478
-
479
- }
240
+ }
480
-
481
-
482
241
 
483
242
  @Override int getHand() {
484
-
485
243
  System.out.println("-----------------------------------------");
486
-
487
244
  System.out.println("コマンド? 0:グー 1:チョキ 2:パー");
488
-
489
245
  return scanner.nextInt();
490
-
491
- }
246
+ }
492
-
493
- }
247
+ }
494
-
495
-
496
248
 
497
249
  class Cpu extends Player {
498
-
499
250
  Cpu(String tmpName, int hp) {
500
-
501
251
  super(tmpName, hp);
502
-
503
- }
252
+ }
504
-
505
-
506
253
 
507
254
  @Override int getHand() { return rand.nextInt(3); }
508
-
509
- }
255
+ }
510
-
511
256
  ```

1

コメント多め&答え付き

2021/01/25 11:10

投稿

TN8001
TN8001

スコア9855

test CHANGED
@@ -260,7 +260,7 @@
260
260
 
261
261
  もともとの内容にもついでに一例を出しておきます(あんまりイケてないですw
262
262
 
263
- 9割方できているので`class Human`・`class Cpu`を作ってみてください^^(`int getHand()`を実装するだけです)
263
+ ~~9割方できているので`class Human`・`class Cpu`を作ってみてください^^(`int getHand()`を実装するだけです)~~
264
264
 
265
265
 
266
266
 
@@ -276,8 +276,20 @@
276
276
 
277
277
  public static void main(String[] args) {
278
278
 
279
+ // 人間を表すHumanクラスからインスタンスを一つ生成します
280
+
281
+ // ゲームに参加する人間は一人なので、new Humanするのはここでの1回限り
282
+
283
+ // ほかでnew Humanしてしまうと別の人間が新たに参加することになってしまう!
284
+
279
285
  Player player = new Human("あなた", 20);
280
286
 
287
+
288
+
289
+ // CPUを表すHumanクラスからインスタンスを一つ生成します
290
+
291
+ // ゲームに参加するCPUは一個なので、...以下同文
292
+
281
293
  Player cpu = new Cpu("敵", 20);
282
294
 
283
295
 
@@ -298,21 +310,29 @@
298
310
 
299
311
 
300
312
 
313
+ // どちらとも生きている(0 < Hp)間はループ
314
+
301
315
  while (player.isAlive() && cpu.isAlive()) {
302
316
 
303
- int hand = player.getHand();
317
+ int hand = player.getHand(); // playerの手を取得
304
318
 
305
319
  if (hand == 9) {
306
320
 
307
321
  System.out.println("コマンド9検出:強制終了しました");
308
322
 
323
+ return; // 勝ち負け判定に入らないように抜ける
324
+
309
- return;
325
+ } else if (2 < hand) {
326
+
327
+ System.out.println("数値は0・1・2から選んで入力して下さい");
328
+
329
+ continue; // ループ先頭に戻り手の再入力
310
330
 
311
331
  }
312
332
 
313
333
 
314
334
 
315
- int com = cpu.getHand();
335
+ int com = cpu.getHand(); // cpuの手を取得
316
336
 
317
337
 
318
338
 
@@ -328,11 +348,11 @@
328
348
 
329
349
  (com == pa && hand == tyoki)) {
330
350
 
331
- player.attack(cpu);
351
+ player.attack(cpu); // playerの勝ち playerがcpuに攻撃
332
352
 
333
353
  } else {
334
354
 
335
- cpu.attack(player);
355
+ cpu.attack(player); // cpuの勝ち cpuがplayerに攻撃
336
356
 
337
357
  }
338
358
 
@@ -340,9 +360,9 @@
340
360
 
341
361
  System.out.println();
342
362
 
343
- System.out.println(player);
363
+ System.out.println(player); // toString()をオーバ-ライド 名前 HP:現在値/Max値
344
-
364
+
345
- System.out.println(cpu);
365
+ System.out.println(cpu); // 同上
346
366
 
347
367
  }
348
368
 
@@ -388,7 +408,9 @@
388
408
 
389
409
 
390
410
 
411
+
412
+
391
- Player(String tmpName, int hp) {
413
+ Player(String tmpName, int hp) { // 呼びかけ用の仮名、初期hp
392
414
 
393
415
  this.hp = maxHp = hp;
394
416
 
@@ -404,17 +426,21 @@
404
426
 
405
427
 
406
428
 
407
- String getName() { return name; }
429
+ String getName() { return name; } // 名前の取得
408
-
409
-
410
-
430
+
431
+
432
+
411
- boolean isAlive() { return 0 < hp; }
433
+ boolean isAlive() { return 0 < hp; } // 生きているかどうか
412
-
413
-
414
-
434
+
435
+
436
+
415
- abstract int getHand();
437
+ abstract int getHand(); // 手の番号取得 0:グー 1:チョキ 2:パー
438
+
439
+
440
+
416
-
441
+ // 相手に攻撃
442
+
417
-
443
+ // なぜ引数で相手を与えるかというと、両方のnameが欲しいから
418
444
 
419
445
  void attack(Player other) {
420
446
 
@@ -426,7 +452,7 @@
426
452
 
427
453
  }
428
454
 
429
- other.hp -= damage;
455
+ other.hp -= damage; // 相手のHpを減らす
430
456
 
431
457
 
432
458
 
@@ -442,4 +468,44 @@
442
468
 
443
469
  }
444
470
 
471
+
472
+
473
+ class Human extends Player {
474
+
475
+ Human(String tmpName, int hp) {
476
+
477
+ super(tmpName, hp);
478
+
479
+ }
480
+
481
+
482
+
483
+ @Override int getHand() {
484
+
485
+ System.out.println("-----------------------------------------");
486
+
487
+ System.out.println("コマンド? 0:グー 1:チョキ 2:パー");
488
+
489
+ return scanner.nextInt();
490
+
491
+ }
492
+
493
+ }
494
+
495
+
496
+
497
+ class Cpu extends Player {
498
+
499
+ Cpu(String tmpName, int hp) {
500
+
501
+ super(tmpName, hp);
502
+
503
+ }
504
+
505
+
506
+
507
+ @Override int getHand() { return rand.nextInt(3); }
508
+
509
+ }
510
+
445
511
  ```