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

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

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

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

解決済

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

kumathi
kumathi

総合スコア7

Java

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

4回答

0グッド

0クリップ

712閲覧

投稿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); } } コード

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

2022/05/24 23:23

こちらの質問が他のユーザーから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました。

BeatStar

2022/05/24 23:23

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

2022/05/24 23:32

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

2022/05/25 05:43

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

回答4

1

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

総合スコア8080

kumathi👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

1

私ならまずは 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

総合スコア10741

kumathi👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

kumathi

2022/05/28 10:32

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

1

ベストアンサー

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

総合スコア17053

kumathi👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

kumathi

2022/05/28 10:29

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

1

これをクラス分割してたら逆にコードが長くなったり、追いづらくなるだけなのでお勧めしません。
それよりもむしろ「共通動作を何度も書いている」ほうが気になります。
勝敗判定の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

総合スコア20613

jimbe👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

kumathi

2022/05/28 10:31

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

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Java

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