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

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

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

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

Q&A

2回答

1040閲覧

java 数字当てゲーム 評価

koko122102

総合スコア39

Java

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

0グッド

0クリップ

投稿2022/04/13 08:34

投稿失礼いたします。javaを学習している初学者です。
javaで作成した数字当てゲームの評価をお願い申し上げます。
もっとこうした方が良い、この使い方は間違っている、こうした方がメモリを消費せずに済むなど、上級者の皆さんが考える意見をお伺いしたいです。

java

1package sample; 2 3public class Baseball { 4 5 6 public static void main(String[] args) { 7 // TODO 自動生成されたメソッド・スタブ 8 9 BaseballJudge bbjg = new BaseballJudge(); 10// ランダムな3ケタの数字を作成する 11 while(bbjg.getListSize() < 3) { 12 13 bbjg.createRandomNum(); 14 15 } 16 17 System.out.println(bbjg.getList()); 18 19// 数字が当たるまでユーザーに数字を入力させる 20 while(bbjg.getStrike() < 3) { 21 System.out.print("重複しない3ケタの数字を入力してください>> "); 22 23// 入力された数字を1文字ずつlistに入れる 24 bbjg.createGivenNumList(); 25 26// 入力された数字に重複がないか調べる 27 if(bbjg.checkDuplicate(bbjg.getList1())) { 28 System.out.println("数字が重複しています"); 29 continue; 30 }else if(bbjg.getList1().size() > 3) { 31 System.out.println("3桁の数字を入力してください"); 32 continue; 33 } 34 35 36 37// 数字も場所も合っていればstrikeを++する 38 bbjg.strikePlus(); 39 40// strikeが3以下の時に、場所は合っていないが数字は合っていればballを++する 41 if(bbjg.getStrike() < 3) { 42 for(int j = 0; j < bbjg.getListSize();j++) { 43 if(bbjg.checkBallPlus(j,bbjg.getList(),bbjg.getList1())){ 44 bbjg.ballPlus(); 45 } 46 } 47 } 48 49 System.out.println(bbjg.getStrike()+"イート"+bbjg.getBall()+"バイトです"); 50 51 52// 完全正解の時の出力 53 if(bbjg.getStrike() == 3) { 54 System.out.println("あたりです"); 55 56 }else { 57 bbjg.resetField(); 58 } 59 60 61 } 62 63 64 65 66 67 68 } 69 70 71 }

java

1package sample; 2 3import java.util.ArrayList; 4import java.util.Arrays; 5import java.util.List; 6import java.util.Random; 7import java.util.Scanner; 8 9public class BaseballJudge { 10 11 private int strike; 12 private int ball; 13 private int machiNum; 14 private List<String> list1; 15 16 BaseballJudge(){ 17 this.strike = 0; 18 this.ball = 0; 19 this.machiNum = 0; 20 } 21 22 Scanner sc = new Scanner(System.in); 23 Random rdm = new Random(); 24 25 List<String> list = new ArrayList<String>(); 26 { 27 28 29} 30// ランダムな3ケタの数字を作成する 31 public void createRandomNum() { 32 int num = rdm.nextInt(10); 33 String num1 = Integer.toString(num); 34 if(list.contains(num1) == false) { 35 list.add(num1); 36 } 37 38 } 39 40// 数字も場所も合っているか確認する 41 public boolean matchNumberAndPlace(int i,List<String> list,List<String>list1) { 42 boolean b = list.get(i).equals(list1.get(i)); 43 return b; 44 } 45 46// 数字も場所も合っていればstrikeを++する 47 public void strikePlus() { 48 for(int i = 0; i < list.size(); i++) { 49 if(matchNumberAndPlace(i,list,list1)) { 50 strike++; 51 machiNum = i; 52 list.set(machiNum, "undefined"); 53 } 54 } 55 56 } 57// 場所は合っていないが数字は合っているか確認 58 public boolean checkBallPlus(int j, List<String> list,List<String> list1) { 59 boolean a = list.contains(list1.get(j)); 60 return a; 61 } 62 63// 場所は合っていないが数字は合っていればballを++する 64 public void ballPlus() { 65 ball++; 66 } 67 68// 入力された数字に重複がないか調べる 69 public boolean checkDuplicate(List<String> list1) { 70 return list1.size() != list1.stream().distinct().count(); 71 } 72 73 74 public void createGivenNumList() { 75 int givenNum = sc.nextInt(); 76 String str = Integer.toString(givenNum); 77 String[] arr = str.split(""); 78 list1 = new ArrayList<>(Arrays.asList(arr)); 79 80 } 81 82 public int getListSize() { 83 return list.size(); 84 } 85 86 public List<String> getList(){ 87 return list; 88 } 89 90 public List<String> getList1(){ 91 return list1; 92 } 93 94 public int getStrike() { 95 return this.strike; 96 } 97 98 public int getBall() { 99 return this.ball; 100 } 101 102// フィールドをリセットする 103 public void resetField() { 104 this.strike = 0; 105 this.ball = 0; 106 } 107 } 108 109コード

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

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

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

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

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

jimbe

2022/04/13 08:44

teratail は問題を解決するための場所です。 作成されたコードで何が問題となっているのか、それを解決するためにどのようなことをされ、どうなったのか等をご提示ください。 1-1. teratailはサポートセンターではなく、思考するエンジニアの為のQ&Aコミュニティです https://teratail.com/help/question-tips#questionTips11
m.ts10806

2022/04/13 08:47

要件通り動いていて不具合がなければ基本それで問題なしです。 完全コードレビューは要件を知らない赤の他人にはできませんし、「数字当てゲーム」というタイトルなのに即したようなパッケージやクラス名になってない時点でレビューする気をなくします。
Zuishin

2022/04/13 10:18 編集

キリがないので、上級者は最初から作り直すと思います。 とりあえずはインデントを揃えるところと、命名をもう少し考えるところから始めたら良いのではないでしょうか。 2 メートル先にボールが届かない人に「俺のピッチングどう?」って言われたら、正直な人以外は困るでしょう?
guest

回答2

0

メモリ消費が少ないと思われるコードを書いてみました。

java

1import java.util.Scanner; 2import java.util.Random; 3 4class Main { 5 public static void main(String[] args) { 6 int[] a = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 7 int[] b = new int[3], c = new int[3]; 8 int i, j, n = 10; 9 10 Scanner sc = new Scanner(System.in); 11 Random rd = new Random(); 12 for (i = 0; i < 3; i++) { 13 j = rd.nextInt(n); b[i] = a[j]; a[j] = a[--n]; 14 } 15 System.out.println("[" + b[0] + ", " + b[1] + ", " + b[2] + "]"); 16 17 while (true) { 18 System.out.print("重複しない3ケタの数字を入力してください>> "); 19 String s = sc.next(); 20 if (s.length() != 3) { 21 System.out.println("3文字ではありません"); 22 continue; 23 } 24 for (i = 0; i < 3; i++) { 25 c[i] = s.charAt(i) - '0'; 26 if (c[i] < 0 || c[i] > 9) break; 27 } 28 if (i < 3) { 29 System.out.println("数字でない文字があります"); 30 continue; 31 } 32 if (c[0] == c[1] || c[1] == c[2] || c[2] == c[0]) { 33 System.out.println("数字が重複しています"); 34 continue; 35 } 36 int eat = 0, bite = 0; 37 for (i = 0; i < 3; i++) 38 for (j = 0; j < 3; j++) 39 if (b[i] == c[j]) 40 if (i == j) eat++; else bite++; 41 System.out.println(eat + "イート " + bite + "バイトです"); 42 if (eat == 3) { 43 System.out.println("あたりです"); 44 break; 45 } 46 } 47 } 48}

投稿2022/04/13 17:11

kazuma-s

総合スコア8224

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

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

0

上級者かどうか、ご提示のコードに比べて何が良いかは分かりませんが、こんな風にも書けると思います。

EatAndBite.java

java

1import java.util.*; 2 3public class EatAndBite { 4 private static class IllegalInputException extends Exception { 5 IllegalInputException(String message) { 6 super(message); 7 } 8 } 9 private static int LENGTH = 3; 10 11 public static void main(String[] args) { 12 Scanner sc = new Scanner(System.in); 13 14 EatAndBite judge = new EatAndBite(LENGTH); 15 //System.out.println(judge.getList()); 16 17 //数字が当たるまでユーザーに数字を入力させる 18 do { 19 System.out.print("重複しない"+LENGTH+"ケタの数字を入力してください>> "); 20 String input = sc.next(); 21 try { 22 judge.count(input); 23 System.out.println(judge.getEat() + "イート" + judge.getBite() + "バイトです"); 24 } catch(IllegalInputException e) { 25 System.out.println(e.getMessage()); 26 } 27 } while(!judge.isAllEats()); 28 29 //完全正解の時の出力 30 System.out.println("あたりです"); 31 } 32 33 private int length; 34 private String target; 35 private int eat; 36 private int bite; 37 38 EatAndBite(int length) { 39 this.length = length; 40 createRandomNum(length); 41 } 42 43 private void createRandomNum(int length) { 44 List<String> list = new ArrayList<>(); 45 for(int i=0; i<10; i++) list.add(""+i); 46 Collections.shuffle(list); 47 target = ""; 48 for(int i=0; i<length; i++) target += list.get(i); 49 } 50 51 void count(String input) throws IllegalInputException { 52 if(input.length() != length) throw new IllegalInputException(length + "桁の数字を入力してください"); 53 checkDuplicate(input); 54 55 eat = 0; 56 bite = 0; 57 for(int i=0; i<input.length(); i++) { 58 if(input.charAt(i) == target.charAt(i)) eat ++; 59 else if(input.contains(target.substring(i,i+1))) bite ++; 60 } 61 } 62 //入力された文字に重複がないか調べる 63 private void checkDuplicate(String input) throws IllegalInputException { 64 for(int i=0; i<input.length()-1; i++) { 65 if(input.substring(i+1).contains(input.substring(i,i+1))) throw new IllegalInputException("数字が重複しています"); 66 } 67 } 68 69 boolean isAllEats() { 70 return eat == length; 71 } 72 73 int getEat() { 74 return eat; 75 } 76 77 int getBite() { 78 return bite; 79 } 80}

投稿2022/04/13 11:00

編集2022/04/13 11:34
jimbe

総合スコア12646

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問