diff --git a/docs/README.md b/docs/README.md index e69de29bb2..479e70f3ad 100644 --- a/docs/README.md +++ b/docs/README.md @@ -0,0 +1,50 @@ +기능 구현 목록 + +1. public static void startGame() +야구 게임을 실행하는 함수. + +do-while문을 통해 게임을 1번은 무조건 실행하며, 이후에는 restartGame의 결과에 따라 새로운 게임을 진행할지, 게임을 종료할지를 결정 +do-while문 내부에서는 while문을 이용하여 사용자가 정답을 맞출때까지 게임을 진행함. + +게임 처리 방식은 다음과 같음. + +-사용자가 입력한 숫자가 형식에 맞으면 check3Strike를 통해 정답인지 확인. +-정답이라면 현재 게임을 종료하고 restartGame을 통해 게임을 다시 시작할지, 종료할지를 결정. +-정답이 아니라면 checkState를 이용하여 strike에 해당하는 숫자가 있다면 boolean 배열인 check에 해당 위치를 true로 변경하고 checkStrike를 이용하여 strike 개수를 구함. +-checkBall을 이용하여 스트라이크에 해당하는 숫자의 위치를 제외한 나머지 숫자를 비교하여 ball을 구함. +-nothing의 개수는 3-(strike+ball)로 계산 +-printResult를 이용하여 사용자가 입력한 숫자에 대한 결과를 출력 +-맞출때까지 게임 진행 + +2. public static boolean restartGame() +사용자가 정답을 맞추면 게임 재시작 안내 문구를 출력하고 응답 결과를 boolean으로 반환하는 함수. + +3. public staic String setComputer() +컴퓨터가 3자리의 숫자를 랜덤으로 생성하게 하는 함수. +1부터 9까지의 숫자를 Random으로 3번 생성해서 빈 문자열에 차례대로 더하는 방식. +3자리 숫자는 String 타입으로 나타냄. + +4. public static String setUser() +'숫자를 입력해주세요'라는 메세지를 출력하고 사용자로부터 3자리 숫자를 입력받는 함수. +사용자가 입력한 문자의 길이가 3자리를 만족하지 않거나, 숫자 외의 값을 입력한 경우 IllegalArgumentException을 발생시킴. + +5. public static boolean check3Strike(String computer, String user) +computer의 숫자와 user가 입력한 숫자가 동일한지를 확인하는 함수. +정답을 맞춘 경우 '3스트라이크', '3개의 숫자를 모두 맞히셨습니다! 게임 종료'라는 메세지를 출력하고 true를 반환함. +정답을 맞추지 못한 경우 false를 반환함. + +6. public static boolean[] checkState(String computer, String user) +사용자가 입력한 3자리 중 스트라이크에 해당하는 숫자의 위치를 true로 변경하는 함수. +ball을 계산할 때 strike처리가 된 숫자는 계산에 포함되지 않도록 하기 위한 기능. + +7. public static int checkStrike(String computer, String user) +사용자가 입력한 3자리 중 스트라이크에 해당하는 숫자의 개수를 세고 반환하는 함수. + +8. public static int checkBall(String computer, string user, boolean[] check) +사용자가 입력한 3자리 중 스트라이크에 포함되지 않은 숫자를 컴퓨터 숫자와 비교하며 ball의 개수를 세고 반환하는 함수. + +9. public static void printResult(int strike, int ball, int nothing) +사용자가 입력한 3자리 숫자의 결과를 알려주는 함수. +nothing이 3개이면 '낫싱'을 출력함. +ball과 strike가 둘다 존재하면 볼, 스트라이크로 출력함. +ball만 존재하거나 strike만 존재하면 볼 또는 스트라이크만 출력함. diff --git a/src/main/java/baseball/Application.java b/src/main/java/baseball/Application.java index dd95a34214..47ccdd88e4 100644 --- a/src/main/java/baseball/Application.java +++ b/src/main/java/baseball/Application.java @@ -1,7 +1,109 @@ package baseball; +import camp.nextstep.edu.missionutils.Randoms; +import camp.nextstep.edu.missionutils.Console; + public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 + //TODO: 숫자 야구 게임 구현 + System.out.println("숫자 야구 게임을 시작합니다."); + startGame(); + } + public static void printResult(int strike, int ball, int nothing){ + if (nothing == 3) { + System.out.println("낫싱"); + } else if (ball != 0 && strike != 0) { + System.out.println(ball + "볼 " + strike + "스트라이크"); + } else if (ball == 0) { + System.out.println(strike + "스트라이크"); + } else { + System.out.println(ball + "볼"); + } + } + public static boolean[] checkState(String computer, String user){ + boolean[] check = new boolean[]{false, false, false}; + for (int i = 0; i < 3; i++) { + if (computer.charAt(i) == user.charAt(i)) { + check[i] = true; + } + } + return check; + } + public static int checkStrike(String computer, String user){ + int strike = 0; + for (int i = 0; i < 3; i++) { + if (computer.charAt(i) == user.charAt(i)) { + strike++; + } + } + return strike; + } + public static int checkBall(String computer, String user, boolean[] check){ + int ball = 0; + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 3; j++) { + if (check[i]) { + break; //스트라이크 처리가 된 숫자이면 넘기기 + } + if (computer.charAt(j) == user.charAt(i) && i != j) { + ball++; + continue; + } + } + } + return ball; + } + public static void startGame(){ + String computer, user; + int strike, ball, nothing; + boolean[] check = new boolean[3]; + do{ + computer = setComputer(); + strike=0; ball=0; nothing=0; + while(true){ + user = setUser(); + if(check3Strike(computer, user)){ //정답을 맞힌 경우 + break; + } + else{ //정답이 아닌 경우 + check = checkState(computer, user); + strike = checkStrike(computer, user); + ball = checkBall(computer, user, check); + nothing = 3-(strike+ball); + printResult(strike, ball, nothing); + } + } + + }while(restartGame()); + } + public static boolean restartGame(){ + System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."); + String game = Console.readLine(); + if(game.equals("2")) return false; + return true; + } + public static boolean check3Strike(String computer, String user){ + if (computer.equals(user)) { + System.out.println("3 스트라이크"); + System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료"); + return true; + } + return false; + } + public static String setComputer(){ + String computer=""; + for(int i=0;i<3;i++) { + int num = Randoms.pickNumberInRange(1, 9); + computer += num; + } + return computer; + } + public static String setUser(){ + System.out.print("숫자를 입력해주세요 : "); + String user = Console.readLine(); + if(user.length()!=3 || !(user.chars().allMatch(Character::isDigit))){ //사용자 입력 답변의 길이가 다르거나 숫자가 아니면 + throw new IllegalArgumentException(); + } + return user; } }