今までの知識を生かして、HitAndBlow ゲームを作ってみよう!

Q
何桁で出題するかを入力する。その桁数で重複のない数値の並びをランダムに生成する。例えば5桁なら

02815

この際先頭に0がきても良い。

そのランダムに生成された数字が何かを当てるゲームだ。

プレイヤーはその数字が何かを予測し、入力する。

01234

この場合0は数字も位置も同じこの場合Hitとする。

1は数字は一致しているが位置が違うこれはBlowだ。

同様に2も数字が一致していて位置が違う。

結果この入力に対しては

Hit=1/Blow=2

と表示される。

これを繰り返し正解までの試行回数を競う。

詳しくは実行例を参照のこと。

[Hint]

String str="982";
int n=Character.getNumericValue(str.charAt(0))

とした場合、nに9が代入される。(CharAt()で指定した文字を数値に変換する)

[実行例]

要素数(10以下):4
4桁の数字を入力せよ>1234
Hit=0/Blow=1
4桁の数字を入力せよ>5678
Hit=0/Blow=1
4桁の数字を入力せよ>2345
Hit=0/Blow=1
4桁の数字を入力せよ>3456
Hit=0/Blow=1
略
4桁の数字を入力せよ>3790
Hit=0/Blow=4
4桁の数字を入力せよ>0973
Hit=2/Blow=2
4桁の数字を入力せよ>0793
Hit=1/Blow=3
4桁の数字を入力せよ>7903
Hit=4/Blow=0
Nice Hit!!
正解=7903
Count:14

import java.util.Random;
import java.util.Scanner;
public class HitAndBlow {
	public static void main(String[] args) {
		Scanner scan=new Scanner(System.in);
		Random rand=new Random();
		final int[] nums=new int[10];
		for(int i=0;i<nums.length;i++){
			nums[i]=i;
		}
		System.out.print("要素数(10以下):");
		int ansLength=scan.nextInt();
		int[] answer=new int[ansLength];
		int[] userAns=new int[ansLength];
		//問題生成
		for(int i=0;i<answer.length;i++){
			int index=rand.nextInt(nums.length-i);
			answer[i]=nums[index];
			int temp=nums[index];
			nums[index]=nums[nums.length-1-i];
			nums[nums.length-1-i]=temp;
		}
		int count=0;
		while(true){
			System.out.printf("%d桁の数字を入力せよ>",ansLength);
			String input=scan.next();
			if(input.length() != ansLength){
				continue;
			}
			count++;
			for(int i=0;i<input.length();i++){
				userAns[i]=Character.getNumericValue(input.charAt(i));
			}
			//判定
			int hit=0,blow=0;
			for(int i=0;i<userAns.length;i++){
				if(userAns[i]==answer[i]){
					hit++;
				}else{
					for(int j=0;j<answer.length;j++){
						if(userAns[i]==answer[j]){
							blow++;
						}
					}
				}
			}
			System.out.printf("Hit=%d/Blow=%d%n",hit,blow);
			if(hit==answer.length){
				System.out.println("Nice Hit!!");
				System.out.println("正解="+input);
				System.out.println("Count:"+count);
				break;
			}	
		}
		scan.close();
	}
}