質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

4回答

958閲覧

メインクラスをクラス分けしたい

kumathi

総合スコア7

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2022/05/24 21:42

java初心者です。三勝で終了するグリコゲームを作ってみました。最終結果としてポイントで勝敗が決まります。それでなのですがメソッドなどを別のクラスに分けてメインメソッドをすっきりさせたいのですが自分なりに試行錯誤してみたとこをうまくいきません。今後もっと複雑なコードを書くとなると必要であると感じ質問させていただきました。心優しいどなたかご教授いただけないでしょうか。

package mygame; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Random; import java.util.Scanner; public class RspGame { public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); String[] rsp = {"Rock", "Scissors", "Paper"}; System.out.print("Please enter your Name:"); String playerName = reader.readLine(); String cpuName = "Computer"; int points1 = 0; int points2 = 0; int win = 0; int lose = 0; String result = ""; // save the result while (win < 3 && lose < 3) { int user = getUser(); int pc = getPc(); if(user==0 && pc==1) { System.out.println(playerName + ":" + rsp[user] + " || " + cpuName + ":"+ rsp[pc]); System.out.println("Win"); win++; points1 += 3; } else if(user==1 && pc==2) { System.out.println(playerName + ":" + rsp[user] + " || " + cpuName + ":"+ rsp[pc]); System.out.println("Win"); win++; points1 += 6; } else if(user==2 && pc==0) { System.out.println(playerName + ":" + rsp[user] + " || " + cpuName + ":"+ rsp[pc]); System.out.println("Win"); win++; points1 += 6; } else if(user==0 && pc==2) { System.out.println(playerName + ":" + rsp[user] + " || " + cpuName + ":"+ rsp[pc]); System.out.println("Lose"); lose++; points2 += 6; } else if(user==1 && pc==0) { System.out.println(playerName + ":" + rsp[user] + " || " + cpuName + ":"+ rsp[pc]); System.out.println("Lose"); lose++; points2 += 3; } else if(user==2 && pc==1) { System.out.println(playerName + ":" + rsp[user] + " || " + cpuName + ":"+ rsp[pc]); System.out.println("Lose"); lose++; points2 += 6; } else if( (user==0 && pc==0) || (user==1 && pc==1) || (user==2 && pc==2) ) { System.out.println(playerName + ":" + rsp[user] + " || " + cpuName + ":"+ rsp[pc]); System.out.println("Drew"); } System.out.println("<RESULT> " + "WIN:" + win + " LOSE:" + lose + " <SCORE> " + playerName + ":" + points1 + " || " + cpuName + ":" + points2 ); } System.out.println("Finish!!!"); System.out.println("Let's Judge.........."); if( points1 < points2 ) { System.out.println("You Lose..." + " <SCORE> " + playerName + ":" + points1 + " || " + cpuName + ":" + points2 ); } else if( points2 < points1) { System.out.println("Congratulations!! You Win!!" + " <SCORE> " + playerName + ":" + points1 + " || " + cpuName + ":" + points2 ); } else if( points1 == points2 ) { System.out.println("Wow... You Drew..." + " <SCORE> " + playerName + ":" + points1 + " || " + cpuName + ":" + points2 ); } } public static int getUser() { Scanner stdin = new Scanner(System.in); while(true) { //outpu massages System.out.println("\nPlease enter your choice"); System.out.print("(ROCK:0,SCISSORS:1、PAPER:2) --> "); if(stdin.hasNextInt()) { int number = stdin.nextInt(); if(number<=-1 || number >=3) { System.out.println("【ERROR】You can choose only 0, 1 or 2"); } else {return number;} } else {System.out.println("【ERROR】You can enter only the number 0, 1 or 2"); stdin.next(); } } } public static int getPc() { // ready for judge Random rand = new Random(); // get a value random return rand.nextInt(3); } } コード

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BeatStar

2022/05/24 23:23

グリコゲームとは? ルールも書いていないので誰もわからないと思うんですが。
dodox86

2022/05/24 23:32

> メインメソッドをすっきりさせたいのですが自分なりに試行錯誤してみたとこをうまくいきません。 うまくいかないところを具体的に提示しないとダメでしょう。初心者を自認するなら尚更。
jimbe

2022/05/25 05:43

どのようなクラスに分けるつもりなのでしょうか。
guest

回答4

0

Random オブジェクト(乱数発生器) は 1個だけ作って、
nextInt を何度も呼び出して、乱数を得るものです。
System.in に対して Scannerオブジェクトは 1個だけ作って、
nextInt や nextLine を何度も呼び出して、入力値を得るものです。
System.in に対して InputStreamReader と Scanner を new するのもよくありません。
標準入力がキーボードだからたまたま上手く行っているだけです。
標準入力をファイルに切り替えるとおかしなことになります。

同じことを何度も書かないコードにしてみました。

Java

1import java.util.Random; 2import java.util.Scanner; 3 4class Data { 5 String judge; 6 int win, lose, points1, points2; 7 8 Data(String s, int w, int l, int p1, int p2) { 9 judge = s; win = w; lose = l; points1 = p1; points2 = p2; 10 } 11} 12 13class RspGame { 14 String[] rsp = {"Rock", "Scissors", "Paper"}; 15 Scanner stdin = new Scanner(System.in); 16 Random rand = new Random(); 17 Data[][] data = { 18 { 19 new Data("Draw", 0, 0, 0, 0), 20 new Data("Win", 1, 0, 3, 0), 21 new Data("Lose", 0, 1, 0, 6) 22 }, { 23 new Data("Lose", 0, 1, 0, 3), 24 new Data("Draw", 0, 0, 0, 0), 25 new Data("Win", 1, 0, 3, 0) 26 }, { 27 new Data("Win", 1, 0, 3, 0), 28 new Data("Lose", 0, 1, 0, 6), 29 new Data("Draw", 0, 0, 0, 0) 30 } 31 }; 32 33 void play() { 34 System.out.print("Please enter your Name:"); 35 String playerName = stdin.nextLine(); 36 String cpuName = "Computer"; 37 38 int points1 = 0; 39 int points2 = 0; 40 int win = 0; 41 int lose = 0; 42 43 while (win < 3 && lose < 3) { 44 int user = getUser(); 45 int pc = getPc(); 46 Data d = data[user][pc]; 47 System.out.println(playerName + ":" + rsp[user] 48 + " || " + cpuName + ":"+ rsp[pc]); 49 System.out.println(d.judge); 50 win += d.win; 51 lose += d.lose; 52 points1 += d.points1; 53 points2 += d.points2; 54 55 System.out.println("<RESULT> " + "WIN:" + win + " LOSE:" + lose 56 + " <SCORE> " + playerName + ":" + points1 57 + " || " + cpuName + ":" + points2 ); 58 } 59 System.out.println("Finish!!!"); 60 System.out.println("Let's Judge.........."); 61 if (points1 == points2) System.out.print("Wow... You Drew..."); 62 else if (points1 < points2) System.out.print("You Lose..."); 63 else System.out.print("Congratulations!! You Win!!"); 64 System.out.println(" <SCORE> " + playerName + ":" + points1 65 + " || " + cpuName + ":" + points2); 66 } 67 68 int getUser() { 69 while (true) { 70 System.out.println("\nPlease enter your choice"); 71 System.out.print("(ROCK:0,SCISSORS:1、PAPER:2) --> "); 72 if (stdin.hasNextInt()) { 73 int number = stdin.nextInt(); 74 if (number >= 0 && number <= 2) return number; 75 } 76 System.out.println("【ERROR】You can choose only 0, 1 or 2"); 77 stdin.nextLine(); 78 } 79 } 80 81 int getPc() { return rand.nextInt(3); } 82} 83 84class Main { 85 public static void main(String[] args) { 86 RspGame rg = new RspGame(); 87 rg.play(); 88 } 89}

投稿2022/05/25 10:20

kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

私ならまずは rsp 配列を enum にし、判定やポイントを持たせます。

java

1 enum Rsp { 2 Rock(3), Scissors(6), Paper(6); 3 4 static Rsp valueOf(int i) { 5 if(i < 0 || values().length <= i) return null; 6 return values()[i]; 7 } 8 9 final int winPoint; 10 Rsp(int winPoint) { 11 this.winPoint = winPoint; 12 } 13 14 boolean drawsWith(Rsp other) { 15 return ordinal() == other.ordinal(); 16 } 17 boolean isWinBy(Rsp other) { 18 return (ordinal() + 1) % values().length == other.ordinal(); 19 } 20 }

投稿2022/05/25 06:12

編集2022/05/25 07:33
jimbe

総合スコア12659

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kumathi

2022/05/28 10:32

なるほど。参考にさせていただきます。ご親切にご教授いただき感謝します。
guest

0

ベストアンサー

main()をすっきりさせる目的でしたら、main() のローカル変数をRspGameクラスのメンバ変数にして、

java

1public static void main(String[] args) ... { 2 RspGame game = new RspGame(); 3 while (game.shouldMatch()) { 4 game.match(); 5 } 6 game.showResult(); 7}

こういう構成にするのはいかがでしょう。

投稿2022/05/24 23:44

int32_t

総合スコア20914

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kumathi

2022/05/28 10:29

大変参考になります。ご親切にありがとうございます。こちらのコードで実践してみようと思います。
guest

0

これをクラス分割してたら逆にコードが長くなったり、追いづらくなるだけなのでお勧めしません。
それよりもむしろ「共通動作を何度も書いている」ほうが気になります。
勝敗判定の1行目は全部同じなのに、すべての場合において同じ文言を書いています。
ゲーム終了時の結果表示も、後半が全く同じです。
また、勝敗判定の判定ロジックを変えれば、7つも場合分けが必要ありません。
あとresultという変数をどこでも使っていません。

例えば勝敗判定。グーで勝ちで3点、それ以外の勝ちで6点という2択なのでこの書き方にしましたが、種類が増えた場合は手と同様配列にするとよいでしょう。

java

1 while (win < 3 && lose < 3) { 2 3 int user = getUser(); 4 int pc = getPc(); 5 System.out.println(playerName + ":" + rsp[user] + " || " + cpuName + ":"+ rsp[pc]); 6 7 if(pc==(user+1)%3) { 8 System.out.println("Win"); 9 win++; 10 points1 += (user == 0) ? 3 : 6; 11 } else if(pc == (user+1)%3) { 12 System.out.println("Lose"); 13 lose++; 14 points2 += (pc == 0) ? 3 : 6; 15 } else { 16 System.out.println("Draw"); //綴り間違ってた 17 } 18 19 System.out.println("<RESULT> " + "WIN:" + win + " LOSE:" + lose + " <SCORE> " 20 + playerName + ":" + points1 + " || " + cpuName + ":" + points2 ); 21 }

まあ、このプログラムには入力周りで問題があるようですが…

投稿2022/05/24 23:30

swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kumathi

2022/05/28 10:31

仰る通りでした。今後気を付けたいと思います。ご教授感謝します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問