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

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

ただいまの
回答率

90.00%

java hit&blow

解決済

回答 3

投稿

  • 評価
  • クリップ 2
  • VIEW 8,581

KentaroIde

score 11

はじめまして、javaの初心者です。
ただいま、hit&blowのプログラムを1. 4桁の乱数を作成しなさい。その際、先頭の桁が0にならないよう(3桁にならないように)、また他の数字と同じにならないようにする。
2. 乱数は1文字ずつ配列に格納しなさい。
3. プレイヤーの文字入力は1文字ずつではなく4桁一気に受け取れるようにしなさい。
4. プレイヤーの入力した文字数が4桁以上の場合「桁が多すぎます」と表示し再入力させ、4桁以下の場合は「桁が少ないです」と表示し再入力させなさい。
5. 数字以外のものを受け取った場合は例外処理を行いなさい。
6. 受け取った4桁の値をそれぞれ1文字ずつ配列に格納し、入力した配列の中に同じ数字がないかチェックしなさい。
7. 乱数の配列と照らし合わせて、数字と桁が一致した数を「○Hit」と表示するようにしなさい。
8. 乱数と入力した数字を比べて桁は異なるが同じ数字を含んでいる場合は「○Blow」と表示しなさい。
9. 正解するまでループするようにしなさい。
10. 正解したら「正解です」と表示しなさい。
■PU LS
レベル1:入力回数をカウントし、正解時に出力しなさい。
レベル2:桁数を増やし難易度をあげなさい
レベル3:入力回数制限を10回に指定しなさい。
レベル4:自分が作ったプログラムに勝利しなさい。作成しているのですが、いじっていくうちにどんどんおかしくなり入力ができなくなりました。
プログラムの全体的な改善策を教えていただきたいです。

package round3.test3_7_1;
import java.util.Scanner;
public class CopyOfHi_Low {

    /**
     * @param args
     */
    public static void main(String[] args) {
        try{
        int num = 4;

        Scanner scan = new Scanner(System.in);
        int[] answer = new int[num];
        int[] user = new int[num];
        //桁ごとに数が被らないように、array配列からランダムに一つずつ代入する。

        //乱数作成
        //0~9までの数字
        int []array = {0,1,2,3,4,5,6,7,8,9};


        //arrをシャッフルする
        for(int i=0;i<array.length;i++){
            //0~9までの乱数
            int ran = (int)(Math.random() * 10);
            int a = array[i];
            array[i] = array[ran];
            array[ran] = a;
        }

        //シャッフルした中身を表示
        for(int zz:array){
            System.out.print(zz);
        }
        System.out.println();


        //上でシャッフルした値の0~4番目の値を取得する
        for(int i=0;i<answer.length;i++){
            answer[i] = array[i];

            //もし頭が0だった場合は一番お尻の値を入れる
            if(answer[i] == 0){
                answer[i] = answer[answer.length-1];
            }
        }


        //答えを表示
        System.out.print(answer[0]);
        System.out.print(answer[1]);
        System.out.print(answer[2]);
        System.out.print(answer[3]);
        System.out.println();

        int count = 1;
        //ここから入力した値の検査。booleanで判定
        boolean flag = false;

        while(flag){
            System.out.println("4桁の数字を入力してください");

            String input = scan.nextLine();

            int length = input.length();

            if(text(length,num)){

                flag = false;
            }else{
                flag = true;
            }



                for(int i = 0;i < num;i++){
                    for(int j = i+1;j < num;j++){
                        if(input.charAt(i) == input.charAt(j)){
                            flag = true;

                        }
                    }

                }if(flag == true){
                    System.out.println("入力エラーです");

                    System.out.println("0から9までの数値を4桁で重複しないように入力してください。");

                    System.out.println();

                    continue;
                }


                for(int i = 0; i < num;i++){

                    user[i] = Integer.parseInt(input.substring(i,(i+1)));
                }

                int hit = 0;
                for(int i = 0;i < num;i++){
                    if(user[i] == answer[i]){

                        hit++;
                    }
                }
                int blow = 0;

                for(int i = 0;i < num;i++){
                    for(int j = 0;j < num;j++){
                        if(user[i] == answer[j]){

                            blow++;
                        }
                    }
                }
                //入力が10回めで表示
                if(count == 11){

                    System.out.println();

                    System.out.println(count+"回目です。終了します。");

                    flag = false;
                    
                //hitが要素数と合致したら表示
                }else if(hit == num){

                    System.out.println();

                    System.out.println("正解!!" + count +"回目で成功。");

                    flag = false;
                //ヒットとブローの数を表示
                }else{
                    System.out.println(hit +"Hit"+ (blow - hit)+ "Blow");

                    System.out.println();

                    count++;

                }
        }

        }catch(NumberFormatException o){
            System.out.println("数字以外のものが入力されています");
        }
        }
    public static boolean text(int length,int num){

        boolean a = true;

        if(length > num){

            System.out.println("桁が多すぎます。");

            a = true;

        }else if(length < num){

            System.out.println("桁が少なすぎます。");

            a = true;

        }

        return a;
    }
    /*public static int hit(int[]user,int[]answer,int num){
        int count = 0;
        for(int i = 0;i < num;i++){
            if(user[i] == answer[i]){

                count++;
    }
            return count;
        }
        public static int blow(int[]user,int[]answer,int num){
            int count = 0;

            for(int i = 0;i < num;i++){
                for(int j = 0;j < num;j++){
                    if(user[i] == answer[j]){

                        count++;
        }
                    return count;
    }*/
            
        }

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+2

とりあえずtextという関数が必ずtrueを返していますよね。

改善案ですが、ざっくりと言うと、必要な機能を関数として独立させるべきです。
例えば、

1. string/int 乱数の生成(int 桁数)
2. boolean 正しい入力か(string 入力)
3. int Hitの数を数える(...)
4. int Blowの数を数える(...)

として, それぞれの関数が正しく作成できているか 調べながら実装していきましょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

google で "github java hit&blow" を検索すると、作成例がいくつも見つかりますね。

それらを 読んでみてはいかがでしょう?
これらを丸写ししてもよいかもしれませんが、それは正しく動作するかはわかりません。
自分なりに変更を加えたり、動作チェックをしたりする事が必要です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

check解決した方法

0

メソッドに細かく分けて分析したら、解決しました。
ありがとうございました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.00%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

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