Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[숫자 야구 게임] 인수빈 과제 제출합니다. #6

Open
wants to merge 4 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 50 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -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만 존재하면 볼 또는 스트라이크만 출력함.
104 changes: 103 additions & 1 deletion src/main/java/baseball/Application.java
Original file line number Diff line number Diff line change
@@ -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) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

자바 컬렉션 List<> 에 contains라는 함수를 이용해보세요~~

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;
}
}