前提・実現したいこと
こんばんは、Javaについての質問です。
課題にてHit&Blowをjavaを用いて作成しております。
あともう一歩で完成という段階まできたのですが、問題の条件の一部である、
「4桁の数字の先頭を0から始めてはならない」
「入力値は重複させないようにすること。(0blowと表示)」
という部分がどうしてもできず、困っております。
どなたかご教授願えませんでしょうか。
よろしくお願いいたします。
問題文
javaを用いてHit&Blowを作成しなさい。また、以下の条件を踏まえることとする。
条件:
4桁の数字を探すゲームであること。
4桁の数字が正解するまで再入力させること。
答えの数は乱数を用いること。
4桁の数字の先頭を0から始めてはならない。
3366など、入力値は重複させないようにすること。( 0blowと表示させること )
作成途中のソースコード
Java
1import java.io.IOException; 2import java.util.Arrays; 3import java.util.LinkedList; 4import java.util.List; 5import java.util.Scanner; 6 7public class Tokubetsu5 { 8 9 public static final String[] NUM_ARRAY = {"0","1", "2", "3", "4", "5", "6", "7", "8", "9"}; 10 11 public static final int MAX_LENGTH = 4; 12 13 public static void main(String[] args) throws IOException{ 14 Tokubetsu5 hb = new Tokubetsu5(); 15 hb.execute(); 16 } 17 18 private void execute() throws IOException{ 19 20 String[] cpuNumArray = CpuNumArray(); 21 22 boolean clear = false; 23 try(Scanner sc = new Scanner(System.in)){ 24 25 //攻略できるまでループ 26 while(!clear){ 27 28 String[] playerNumArray = PlayerNum(sc); 29 30 clear = checkHitAndBlow(cpuNumArray, playerNumArray); 31 32 } 33 } 34 35 System.out.println("終了します"); 36 37 } 38 39 40 private String[] CpuNumArray(){ 41 //数字の列を作成 42 List<String> tempList = new LinkedList<String>(Arrays.asList(NUM_ARRAY)); 43 44 String[] CpuNum = new String[4]; 45 46 //4回繰り返し、数字をランダムで取得 47 for(int i = 0; i < 4; i++){ 48 int num = (int)(Math.floor(Math.random() * (10-i))); 49 //一度使用した数字はリストから削除 50 51 CpuNum[i] = tempList.remove(num); 52 } 53 54 return CpuNum; 55 56 } 57 58 private String[] PlayerNum(Scanner sc) throws IOException{ 59 60 boolean Check = false; 61 String line = null; 62 63 //入力OKになるまで繰り返し 64 check: 65 while(!Check){ 66 67 System.out.println("4桁の数字を入力してください。"); 68 line = sc.nextLine(); 69 70 //文字数チェック 71 if(line.length() > MAX_LENGTH){ 72 System.out.println("入力した桁数が多いです"); 73 continue; 74 }else if(line.length() < MAX_LENGTH){ 75 System.out.println("入力した桁数が少ないです"); 76 continue; 77 } 78 79 80 Check = true; 81 82 } 83 84 return line.split(""); 85 } 86 87 88 private boolean checkHitAndBlow(String[] cpuNumArray, String[] playerNumArray){ 89 90 int hitCount = 0; 91 int blowCount = 0; 92 93 //数字のチェック 94 for(int i = 0; i < MAX_LENGTH; i++){ 95 for(int j = 0; j < MAX_LENGTH; j++){ 96 if(playerNumArray[i].equals(cpuNumArray[j])){ 97 blowCount++; 98 } 99 } 100 } 101 102 for(int i = 0; i < MAX_LENGTH; i++){ 103 if(playerNumArray[i].equals(cpuNumArray[i])){ 104 blowCount--; 105 hitCount++; 106 } 107 } 108 109 System.out.println(hitCount + " Hit " + blowCount + "Blow"); 110 111 if(hitCount == MAX_LENGTH){ 112 return true; 113 } 114 return false; 115 } 116} 117 118
作成途中のソースコード(追記 2018.6.21)
Java
1 2import java.io.IOException; 3import java.util.Arrays; 4import java.util.LinkedList; 5import java.util.List; 6import java.util.Scanner; 7 8public class Tokubetsu5 { 9 10 public static final String[] NUM_ARRAY = {"0","1", "2", "3", "4", "5", "6", "7", "8", "9"}; 11 12 public static final int MAX_LENGTH = 4; 13 14 public static void main(String[] args) throws IOException{ 15 Tokubetsu5 hb = new Tokubetsu5(); 16 hb.execute(); 17 } 18 19 private void execute() throws IOException{ 20 21 String[] cpuNumArray = CpuNumArray(); 22 23 boolean clear = false; 24 try(Scanner sc = new Scanner(System.in)){ 25 26 //攻略できるまでループ 27 while(!clear){ 28 29 String[] playerNumArray = PlayerNum(sc); 30 31 clear = checkHitAndBlow(cpuNumArray, playerNumArray); 32 33 } 34 } 35 System.out.println("正解です"); 36 System.out.println("終了します"); 37 38 } 39 40 41 private String[] CpuNumArray(){ 42 //数字の列を作成 43 List<String> tempList = new LinkedList<String>(Arrays.asList(NUM_ARRAY)); 44 45 String[] CpuNum = new String[4]; 46 47 //1回繰り返し、数字をランダムで取得 48 for(int i = 1; i < 2; i++){ 49 int num = (int)(Math.floor(Math.random() * (10-i))); 50 //一度使用した数字はリストから削除 51 52 CpuNum[i] = tempList.remove(num); 53 54 //解答確認用 55 System.out.println(CpuNum[i]); 56 57 //3回繰り返し、数字をランダムで取得 58 for(int j = 1; j < 4; j++){ 59 int num2 = (int)(Math.floor(Math.random() * (10-j))); 60 //一度使用した数字はリストから削除 61 62 CpuNum[j] = tempList.remove(num2); 63 64 //解答確認用 65 System.out.println(CpuNum[j]); 66 } 67 } 68 69 return CpuNum; 70 71 } 72 73 private String[] PlayerNum(Scanner sc) throws IOException{ 74 75 boolean Check = false; 76 String line = null; 77 78 //入力OKになるまで繰り返し 79 check: 80 while(!Check){ 81 82 System.out.println("4桁の数字を入力してください。"); 83 line = sc.nextLine(); 84 85 //文字数チェック 86 if(line.length() > MAX_LENGTH){ 87 System.out.println("入力した桁数が多いです"); 88 continue; 89 }else if(line.length() < MAX_LENGTH){ 90 System.out.println("入力した桁数が少ないです"); 91 continue; 92 } 93 94 Check = true; 95 96 } 97 98 return line.split(""); 99 } 100 101 private boolean checkHitAndBlow(String[] cpuNumArray, String[] playerNumArray){ 102 103 int hitCount = 0; 104 int blowCount = 0; 105 106 //数字のチェック 107 for(int i = 0; i < MAX_LENGTH; i++){ 108 for(int j = 0; j < MAX_LENGTH; j++){ 109 if(playerNumArray[i].equals(cpuNumArray[j])){ 110 blowCount++; 111 112 } 113 114 } 115 break; 116 } 117 118 for(int i = 0; i < MAX_LENGTH; i++){ 119 if(playerNumArray[i].equals(cpuNumArray[i])){ 120 blowCount--; 121 hitCount++; 122 123 } 124 } 125 126 System.out.println(hitCount + " Hit " + blowCount + "Blow"); 127 128 if(hitCount == MAX_LENGTH){ 129 return true; 130 } 131 return false; 132 } 133} 134 135
やりたいこと
現状のコードでHit&Blowはプレイすることが可能ではありますが、
入力した4桁の数値が重複した場合、
4桁の数字を入力してください。
3333
1 Hit 3Blow
といった表示になってしまいます。理想としては、
3333
1Hit 0Blow
という表示をさせたいのですが、自力では閃かず、お力をお借りしたく思います。
また、現状では先頭0始まり( 例: 0123 )の表示も通ってしまうため、
0始まりにならない方法もご教授願いたく思います。
お手数おかけしますが、何卒よろしくお願いいたします。
補足情報(FW/ツールのバージョンなど)
Java
java version "1.8.0_161"
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/06/20 16:17
退会済みユーザー
2018/06/24 16:08