-
자바 콘솔 -bulls and cows 게임미니 2023. 3. 10. 13:57
class Number_exceed_Exception extends Exception { String msg; Number_exceed_Exception(int a, int b) { this.msg = "Error: it's not possible to generate a code with " + "a length of " + a + " with " + b + " unique symbols."; } Number_exceed_Exception() { } } class Maxinum_number_Exception extends Number_exceed_Exception { Maxinum_number_Exception() { super.msg = "Error: maximum number of possible symbols in the code is 36 (0-9, a-z)."; } } class InPut_miss_Exception extends Number_exceed_Exception { InPut_miss_Exception(String val) { super.msg = String.format("Error: \"%s\" isn't a valid number.", val); } } public class Main { static int try_counter = 0; public static void main(String[] args) { String random_number = createnumber(); System.out.println("Okay, let's start a game!"); while (true) { System.out.println("Turn " + (++try_counter) + ":"); String input2 = new Scanner((System.in)).next(); if (!grade(input2, random_number)) { continue; } System.out.println("Congratulations! You guessed the secret code."); break; } } private static String createnumber() { int[] inputval = makeinput(); System.out.println(printmaker(inputval[0], inputval[1])); StringBuilder result = new StringBuilder(inputval[0]); char create_num; Random random_num; while (result.length() != inputval[0]) { random_num = new Random(System.nanoTime()); create_num = (char) (random_num.nextInt(inputval[1])); if (create_num >= 0 && create_num <= 9) create_num += '0'; else create_num = (char) ((int) create_num - 10 + (int) 'a'); if (result.length() == 0) { if (create_num != '0') { result.append(create_num); } else continue; } if (result.indexOf("" + create_num) >= 0) continue; else result.append(create_num); } return result.toString(); } private static int[] makeinput() { int[] inputval = new int[2]; try { Scanner s = new Scanner(System.in); System.out.println("Input the length og the secret code"); String pre_int = s.nextLine(); if (isalpha(pre_int)) throw new InPut_miss_Exception(pre_int); inputval[0] = Integer.parseInt(pre_int); System.out.println("Input the number of possible symbols in the code"); inputval[1] = s.nextInt(); if (inputval[0] <= 0) throw new InPut_miss_Exception(inputval + ""); if (inputval[0] > inputval[1]) throw new Number_exceed_Exception(inputval[0], inputval[1]); if (inputval[1] > 36) throw new Maxinum_number_Exception(); } catch (InPut_miss_Exception e1) { System.out.println(e1.msg); System.exit(-1); } catch (Maxinum_number_Exception e2) { System.out.println(e2.msg); System.exit(-1); } catch (Number_exceed_Exception e3) { System.out.println(e3.msg); System.exit(-1); } return inputval; } private static boolean isalpha(String preInt) { for (int i = 0; i < preInt.length(); i++) { if (preInt.charAt(i) >= 'a' && preInt.charAt(i) <= 'z' || preInt.charAt(i) >= 'A' && preInt.charAt(i) <= 'Z') return true; } return false; } private static String printmaker(int input, int possibleNum) { String result = "the secret is prepared: "; for (byte i = 0; i < input; i++) result += "*"; if (possibleNum < 11) result += " (0-" + (possibleNum - 1) + ")."; else { result += " (0-9, a-" + (char) ((possibleNum - 11) + 'a') + ")."; } return result; } private static boolean grade(String input, String preDifined) { int bulls = 0; int cows = 0; String result = ""; for (int i = 0; i < preDifined.length(); i++) { // if (input.charAt(i) == preDifined.charAt(i)) bulls++; else if (preDifined.contains("" + input.charAt(i))) cows++; if (i > 0 && input.charAt(i - 1) == input.charAt(i)) { cows = preDifined.contains("" + input.charAt(i - 1)) ? cows - 1 : cows; } } if (cows == 0 && bulls == 0) { result = "Grade: None."; } else if (cows > 0 && bulls > 0) { result += bulls == 1 ? bulls + " bull and " : bulls + " bulls and "; result += cows == 1 ? cows + " cow." : cows + " cows."; } else if (bulls == 0 || cows == 0) { result += (bulls == 0) ? "" : bulls == 1 ? bulls + " bull." : bulls + " bulls."; result += (cows == 0) ? "" : cows == 1 ? cows + " cow." : cows + " cows."; } System.out.println(result); System.out.println(); if (bulls == input.length()) return true; return false; } }
간단한 콘솔 bulls and cows게임을 만들어 보았다.
게임규칙은 간단하다
1. 원하는 secret code의 길이를 입력하고, 조합될 숫자를 입력한다
(코드 길이 및 조합 가능 숫자는 36이 최대이다. 0~9 + a~z)
* secret code길이 입력시 숫자가 아닌 입력 -> 예외발생
* 조합 가능 숫자 36초과 시 >예외발생
* secret code > 조합가능 숫자 > 예외발생
->난수는 겹치는 숫자가 없으므로, 난수 조합가능 숫자와 코드길이는 같거나 코드길이가 더 작아야한다.
2. 원하는 입력에 따라 난수를 생성한다.
> 난수는 겹치는 수가 없다.
3. 난수를 맞춰본다. 자리와 숫자가 모두 맞으면 bull이고 숫자만 맞으면, cow이다.
4. 모든 숫자를 맞추면 실행을 종료한다.
연습한것
-예외처리 + 유효성검사 (커피머신 만들기에서 부족했던 점...) 연습
-난수 만들기
부족한 점
-코드를 더 깔끔하게 정리할 수 있을 것같다.
추후 개선사항
-> 나중에 클래스로 만드는 작업을 해보자. ->코드 깔끔하게 정리하기
-> 재입력 입력취소 등등도 고려해 볼만하다.
'미니' 카테고리의 다른 글
Naver Maps openAPI (2) - Geocoding ,Static Map API (0) 2023.06.23 Naver Maps openAPI (1) -JSON (0) 2023.06.23 자바 - BattleShip Game (0) 2023.05.14 자바 콘솔 -커피머신 (0) 2023.03.09