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

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

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

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

Q&A

解決済

3回答

14477閲覧

java hit&blow

KentaroIde

総合スコア12

Java

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

0グッド

2クリップ

投稿2015/02/18 08:28

はじめまして、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; }*/ }

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

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

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

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

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

guest

回答3

0

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

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

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

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

投稿2015/02/18 17:10

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

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

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

投稿2015/02/21 15:10

katoy

総合スコア22324

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

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

0

自己解決

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

投稿2015/02/24 01:27

KentaroIde

総合スコア12

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問