Skip to content
11 changes: 11 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,14 @@

## 과제 제출 과정
* [과제 제출 방법](https://github.com/next-step/nextstep-docs/tree/master/ent-precourse)

## 구현할 기능 목록
- [X] 게임을 시작하면 1에서 9까지 서로 다른 임의의 수 3개가 생성된다.
- [X] 사용자에게 3개의 숫자를 입력 받는다.
- [X] 입력한 숫자와 임의의 숫자를 비교하여 결과를 출력한다.
- 숫자와 위치가 일치하는 경우: 스트라이크
- 숫자는 일치하지만 위치가 일치하지 않는 경우: 볼
- 스트라이크, 볼에 해당하는 숫자가 없는 경우: 낫싱
- 컴퓨터가 선택한 3개의 숫자와 사용자가 입력한 3개의 숫자가 일치하면 게임이 종료된다.
- [X] 게임이 종료된 후 1을 입력하면 게임을 다시 시작할 수 있다.
- [X] 게임이 종료된 후 2를 입력하면 프로그램을 완전히 종료할 수 있다.
65 changes: 65 additions & 0 deletions src/main/java/Baseball.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
import java.util.LinkedHashSet;
import java.util.Random;
import java.util.Scanner;
import java.util.Set;

public class Baseball {

private static Set<Integer> numbers = new LinkedHashSet<>();
private static Set<Integer> numbers2 = new LinkedHashSet<>();

public static void main(String[] args) {
while (true){
create3Number();
playGame();
int choice = endOrRestart();

if (choice == 1) continue;
if (choice == 2) break;
}
}

public static void playGame() {
String result = "";

while (!result.equals("3개의 숫자를 모두 맞히셨습니다! 게임 종료")){
insert3Number();
result = Result.getResult(numbers, numbers2);
System.out.println(result);
}
}

/* 게임을 시작하면 1에서 9까지 서로 다른 임의의 수 3개가 생성된다. */
public static void create3Number() {
numbers.clear();
Random random = new Random();

while (numbers.size() < 3) {
numbers.add(random.nextInt(9) + 1);
}
}

public static void insert3Number() {
numbers2.clear();
Scanner sc = new Scanner(System.in);
System.out.print("숫자를 입력해주세요 : ");
String number = sc.nextLine();

stringToSet(number);
}

public static void stringToSet(String number) {
for (int i = 0; i < number.length(); i++)
{
numbers2.add(number.charAt(i) - '0');
}
}

public static int endOrRestart() {
System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요.");
Scanner sc = new Scanner(System.in);
int choice = sc.nextInt();

return choice;
}
}
23 changes: 23 additions & 0 deletions src/main/java/CountBallStrike.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import java.util.Set;

public class CountBallStrike {
public static int countBall(Set<Integer> numbers, Set<Integer> numbers2) {
int ball = 0;

for (Integer number : numbers) {
if (numbers2.contains(number)) ball++;
}
return ball;
}

public static int countStrike(Integer[] nums, Integer[] nums2) {
int strike = 0;

for (int i = 0; i < 3; i++) {
if (nums[i] == nums2[i]) {
strike++;
}
}
return strike;
}
}
25 changes: 25 additions & 0 deletions src/main/java/Result.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import java.util.Set;

public class Result {

public static String getResult(Set<Integer> numbers, Set<Integer> numbers2) {
int ball = CountBallStrike.countBall(numbers, numbers2);
int strike = CountBallStrike.countStrike(numbers.toArray(new Integer[0]), numbers2.toArray(new Integer[0]));
ball = ball - strike;

if (strike == 3) {
return "3개의 숫자를 모두 맞히셨습니다! 게임 종료";
}
return getStringResult(ball, strike);
}

public static String getStringResult(int ball, int strike) {
if (strike > 0 && ball > 0 ) return strike + "스트라이크 " + ball + "볼";

if (strike > 0) return strike + "스트라이크";

if (ball > 0) return ball + "볼";

return "낫싱";
}
}
71 changes: 71 additions & 0 deletions src/test/java/BaseballTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import java.util.LinkedHashSet;
import java.util.Random;
import java.util.Scanner;
import java.util.Set;

import static org.assertj.core.api.Assertions.assertThat;

class BaseballTest {

private Set<Integer> numbers = new LinkedHashSet<>();
private Set<Integer> numbers2 = new LinkedHashSet<>();

void init() {
numbers = new LinkedHashSet<>();
numbers2 = new LinkedHashSet<>();
}
@BeforeEach
void setUp() {
init();
numbers.add(1);
numbers.add(2);
numbers.add(3);

numbers2.add(3);
numbers2.add(2);
numbers2.add(1);
}

@Test
@DisplayName("게임을 시작하면 1에서 9까지 서로 다른 임의의 수 3개가 생성된다.")
void create3Number() {
numbers.clear();
Random random = new Random();

while (numbers.size() < 3) {
numbers.add(random.nextInt(9) + 1);
}

assertThat(numbers.size()).isEqualTo(3);
}

@Test
@DisplayName("사용자에게 3개의 숫자를 입력 받는다.")
void insert3Number() {
numbers2.clear();
Scanner sc = TestUtil.getScanner("123");
String number = sc.nextLine();

stringToSet(number);

assertThat(numbers2.size()).isEqualTo(3);
}

void stringToSet(String number) {
for (int i = 0; i < number.length(); i++)
{
numbers2.add(number.charAt(i) - '0');
}
}

@Test
@DisplayName("입력한 숫자와 임의의 숫자를 비교한다.")
void getResult() {
String result = Result.getResult(numbers, numbers2);
assertThat(result).isEqualTo("1스트라이크 2볼");
}
}
13 changes: 13 additions & 0 deletions src/test/java/TestUtil.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.Scanner;

public class TestUtil {

public static Scanner getScanner(String input) {
InputStream in = new ByteArrayInputStream(input.getBytes());

return new Scanner(in);
}

}
44 changes: 44 additions & 0 deletions src/test/java/study/SetTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package study;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.junit.jupiter.params.provider.ValueSource;

import java.util.HashSet;
import java.util.Set;

import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals;

public class SetTest {
private Set<Integer> numbers;

@BeforeEach
void setUp() {
numbers = new HashSet<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
}

@Test
void size() {
int setSize = numbers.size();
assertThat(setSize).isEqualTo(3);
}

@ParameterizedTest
@ValueSource(ints = {1,2,3})
void contains(int number) {
assertThat(numbers.contains(number)).isTrue();
}

@ParameterizedTest
@CsvSource(value = {"1:True","2:True","3:True","4:False","5:False"}, delimiterString = ":")
void contains2(int number, boolean result) {
assertEquals(numbers.contains(number), result);
}

}
22 changes: 22 additions & 0 deletions src/test/java/study/StringTest.java
Original file line number Diff line number Diff line change
@@ -1,13 +1,35 @@
package study;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;

public class StringTest {
@Test
void replace() {
String actual = "abc".replace("b", "d");
assertThat(actual).isEqualTo("adc");
}

@Test
void split() {
String [] actual = "1,2".split(",");
assertThat(actual).containsExactly("1", "2");
}

@Test
void substring() {
String actual = "(1,2)".substring(1, 4);
assertThat(actual).isEqualTo("1,2");
}

@Test
@DisplayName("StringIndexOutOfBoundsException 테스트")
void charAt() {
assertThatThrownBy(() -> "abc".charAt(3))
.isInstanceOf(StringIndexOutOfBoundsException.class)
.hasMessageContaining("Index 3 out of bounds for length 3");
}
}