Skip to content
Closed
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
14 changes: 13 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,13 @@
# java-baseball-precourse
# java-baseball-precourse

### 카카오 테크 캠퍼스

## 구현 기능 목록
- 랜덤숫자 생성하는 기능
- 입력을 통해 정답인지 판별하는 기능
- 반복적으로 입력을 받고 처리하는 기능

## 테스트 기능 목록
- 정상적인 값 입력
- 3자리가 아닌 수 입력 ( IllegalArgumentException Throw )
- 숫자가 아닌 값 입력 ( IllegalArgumentException 발생 )
78 changes: 78 additions & 0 deletions src/main/java/Application.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
import java.util.*;

public class Application {
public static Scanner sc = new Scanner(System.in);

public static void main(String[] args) {
do {
String number = start();
System.out.println(number);
boolean canNext = game(number);
if (!canNext) return;
} while (sc.nextLine().equals("1"));
}

public static String start() {
Random random = new Random();
StringBuilder num = new StringBuilder();
int[] numberArr = new int[10];
while (num.length() < 3) {
int numberValue = random.nextInt(9) + 1;
if (numberArr[numberValue] > 0) continue;
num.append(numberValue);
numberArr[numberValue] = numberArr[numberValue] + 1;
}
return num.toString();
}

public static boolean game(String number) {
while (true) {
System.out.print("숫자를 입력해 주세요 : ");
String str = sc.nextLine();
boolean result = isFinish(str, number);
if (result) break;
}
return true;
}

public static boolean isFinish(String input, String number) {
if (input.length() != 3) throw new IllegalArgumentException("세자리 숫자를 입력해야 합니다.");
int[] currNumber = new int[10];
try {
for (int i = 0; i < 3; i++) {
int value = Integer.parseInt(String.valueOf(number.charAt(i)));
currNumber[value] = currNumber[value] + 1;
}
} catch (IllegalArgumentException exception) {
System.out.println("잘못된 입력으로 인해 게임이 종료되었습니다.");
return false;
}
int strikeCount = 0;
int ballCount = 0;
for (int i = 0; i < 3; i++) {
if (number.charAt(i) == input.charAt(i)) {
strikeCount++;
continue;
}
if (currNumber[Integer.parseInt(String.valueOf(input.charAt(i)))] > 0) {
ballCount++;
}
}
if (ballCount > 0) {
System.out.print(ballCount + "볼 ");
}
if (strikeCount > 0) {
System.out.print(strikeCount + "스트라이크 ");
}
if (ballCount == 0 && strikeCount == 0) {
System.out.print("낫싱");
}
System.out.println();
if (strikeCount == 3) {
System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임종료");
System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요.");
return true;
}
return false;
}
}
24 changes: 24 additions & 0 deletions src/test/java/ApplicationTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

class ApplicationTest {
@Test
@DisplayName("정상적인 값이 입력되었을때")
void normalInput() {
Assertions.assertThat(Application.isFinish("123", "321")).isFalse();
Assertions.assertThat(Application.isFinish("321", "321")).isTrue();
}

@Test
@DisplayName("영어가 입력되는 등 잘못된 값이 입력되었을때")
void englishInput() {
Assertions.assertThatThrownBy(() -> Application.isFinish("abc", "321")).isInstanceOf(IllegalArgumentException.class);
}

@Test
@DisplayName("길이가 3을 초과하는 잘못된 값이 입력되었을때")
void longInput() {
Assertions.assertThatThrownBy(() -> Application.isFinish("abc", "321")).isInstanceOf(IllegalArgumentException.class);
}
}