今のコードを最大限尊重すると、こんな感じでしょうか。
- 中途半端な命名見直し
すいませんguとか使って^^;
Main.nameInfo
への依存解消
結局BattleSystem
でしか使っていないうえ、長くて冗長。
- 変わらない変数は
final
意図せず変更されないように。
- 表示順をあなた敵に固定
おそらくわざとやっているのでしょうが、共通化しにくいのと入れ替わると意外と見にくい。
Java
1import java.util.Random;
2import java.util.Scanner;
3
4public class Main {
5 public static void main(String[] args) {
6 final Scanner scanner = new Scanner(System.in);
7 final Random rand = new Random();
8
9 // NamedはBattleSystemでしか使ってないのであげちゃう ついでにRandomも
10 final BattleSystem status = new BattleSystem(new Named(scanner), rand);
11
12 // 数字だとわかりにくいので
13 final int gu = 0;
14 final int tyoki = 1;
15 final int pa = 2;
16
17 while (0 < status.playerHp && 0 < status.enemyHp) {
18 System.out.println("-----------------------------------------");
19 System.out.println("コマンド? 0:グー 1:チョキ 2:パー");
20 int hand = scanner.nextInt();
21
22 if (hand == 9) {
23 System.out.println("コマンド9検出:強制終了しました");
24 return; // 勝ち負け判定に入らないように抜ける
25 }
26
27 int com = rand.nextInt(3);
28
29 if (hand == com) {
30 System.out.println("引き分け");
31 }
32 // かっこや改行があれば長い条件も結構わかりやすくないですか
33 else if ((com == gu && hand == pa) ||
34 (com == tyoki && hand == gu) ||
35 (com == pa && hand == tyoki)) {
36 status.attack();
37 } else {
38 status.damage();
39 }
40 }
41
42 System.out.println("-----------------------------------------");
43 if (status.enemyHp <= 0) {
44 System.out.println("☆YOU WIN☆");
45 } else {
46 System.out.println("✖YOU LOSE✖");
47 }
48 }
49}
50
51class Named {
52 final String playerName;
53 final String enemyName;
54
55 // どうせinput_youname するならコンストラクタでいいでしょう メンバ変数もfinalにできる
56 Named(Scanner scanner) {
57 System.out.print("あなたの名前を入力してください ▼ ");
58 playerName = scanner.nextLine();
59 System.out.println(playerName + "が入力されました");
60
61 System.out.print("敵の名前を入力してください ▼ ");
62 enemyName = scanner.nextLine();
63 System.out.println(enemyName + "が入力されました");
64
65 System.out.println();
66 System.out.println("あなたの名前は" + playerName + "です");
67 System.out.println("敵の名前は" + enemyName + "です");
68 }
69}
70
71class BattleSystem {
72 private final Named nameInfo;
73 private final Random rand;
74
75 int playerHp = 20;
76 int enemyHp = 20;
77
78 BattleSystem(Named named, Random random) {
79 nameInfo = named;
80 rand = random;
81 }
82
83 void attack() {
84 int damag = getDamagePoint();
85 enemyHp -= damag; // enemiHp = enemiHp - damag; 同じ意味
86 print(nameInfo.playerName, nameInfo.enemyName, damag);
87 }
88
89 void damage() {
90 int damag = getDamagePoint();
91 playerHp -= damag;
92 print(nameInfo.enemyName, nameInfo.playerName, damag);
93 }
94
95 private int getDamagePoint() {
96 int damag = rand.nextInt(3) + 1;
97 if (rand.nextInt(10) == 9) { // クリティカル時 5倍
98 damag *= 5; // damag = damag * 5; 同じ意味
99 }
100 return damag;
101 }
102
103 private void print(String winner, String loser, int damage) {
104 System.out.println(winner + "の勝ち");
105 System.out.println(loser + "は" + damage + "のダメージを受けた");
106
107 System.out.println();
108 System.out.println(nameInfo.playerName + " HP:" + playerHp + "/20");
109 System.out.println(nameInfo.enemyName + " HP:" + enemyHp + "/20");
110 }
111}
ゲームの修正点1 継承・抽象メソッドを使用したゲームにする
具体的にはCpuとHuman(人間)をそれぞれ別のクラスとして作り、共通の親クラスPlayerを継承するようにしたいです。
もともとの内容にもついでに一例を出しておきます(あんまりイケてないですw
9割方できているのでclass Human
・class Cpu
を作ってみてください^^(int getHand()
を実装するだけです)
Java
1import java.util.Random;
2import java.util.Scanner;
3
4public class Main {
5 public static void main(String[] args) {
6 // 人間を表すHumanクラスからインスタンスを一つ生成します
7 // ゲームに参加する人間は一人なので、new Humanするのはここでの1回限り
8 // ほかでnew Humanしてしまうと別の人間が新たに参加することになってしまう!
9 Player player = new Human("あなた", 20);
10
11 // CPUを表すHumanクラスからインスタンスを一つ生成します
12 // ゲームに参加するCPUは一個なので、...以下同文
13 Player cpu = new Cpu("敵", 20);
14
15 System.out.println();
16 System.out.println("あなたの名前は" + player.getName() + "です");
17 System.out.println("敵の名前は" + cpu.getName() + "です");
18
19 final int gu = 0;
20 final int tyoki = 1;
21 final int pa = 2;
22
23 // どちらとも生きている(0 < Hp)間はループ
24 while (player.isAlive() && cpu.isAlive()) {
25 int hand = player.getHand(); // playerの手を取得
26 if (hand == 9) {
27 System.out.println("コマンド9検出:強制終了しました");
28 return; // 勝ち負け判定に入らないように抜ける
29 } else if (2 < hand) {
30 System.out.println("数値は0・1・2から選んで入力して下さい");
31 continue; // ループ先頭に戻り手の再入力
32 }
33
34 int com = cpu.getHand(); // cpuの手を取得
35
36 if (hand == com) {
37 System.out.println("引き分け");
38 continue;
39 } else if ((com == gu && hand == pa) ||
40 (com == tyoki && hand == gu) ||
41 (com == pa && hand == tyoki)) {
42 player.attack(cpu); // playerの勝ち playerがcpuに攻撃
43 } else {
44 cpu.attack(player); // cpuの勝ち cpuがplayerに攻撃
45 }
46
47 System.out.println();
48 System.out.println(player); // toString()をオーバ-ライド 名前 HP:現在値/Max値
49 System.out.println(cpu); // 同上
50 }
51
52 System.out.println("-----------------------------------------");
53 if (player.isAlive()) {
54 System.out.println("☆YOU WIN☆");
55 } else {
56 System.out.println("✖YOU LOSE✖");
57 }
58 }
59}
60
61abstract class Player {
62 // あまりstaticは使いたくないが、まあprotected finalならいいでしょう^^;
63 // Scannerに依存するのもどうなの?感ありw
64 protected static final Scanner scanner = new Scanner(System.in);
65 protected static final Random rand = new Random();
66
67 private final String name;
68 private final int maxHp;
69
70 private int hp;
71
72
73 Player(String tmpName, int hp) { // 呼びかけ用の仮名、初期hp
74 this.hp = maxHp = hp;
75
76 System.out.print(tmpName + "の名前を入力してください ▼ ");
77 name = scanner.nextLine();
78 System.out.println(name + "が入力されました");
79 }
80
81 String getName() { return name; } // 名前の取得
82
83 boolean isAlive() { return 0 < hp; } // 生きているかどうか
84
85 abstract int getHand(); // 手の番号取得 0:グー 1:チョキ 2:パー
86
87 // 相手に攻撃
88 // なぜ引数で相手を与えるかというと、両方のnameが欲しいから
89 void attack(Player other) {
90 int damage = rand.nextInt(3) + 1;
91 if (rand.nextInt(10) == 9) {
92 damage *= 5;
93 }
94 other.hp -= damage; // 相手のHpを減らす
95
96 System.out.println(name + "の勝ち");
97 System.out.println(other.name + "は" + damage + "のダメージを受けた");
98 }
99
100 @Override public String toString() { return name + " HP:" + hp + "/" + maxHp; }
101}
102
103class Human extends Player {
104 Human(String tmpName, int hp) {
105 super(tmpName, hp);
106 }
107
108 @Override int getHand() {
109 System.out.println("-----------------------------------------");
110 System.out.println("コマンド? 0:グー 1:チョキ 2:パー");
111 return scanner.nextInt();
112 }
113}
114
115class Cpu extends Player {
116 Cpu(String tmpName, int hp) {
117 super(tmpName, hp);
118 }
119
120 @Override int getHand() { return rand.nextInt(3); }
121}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。