Skip to content
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
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)

## 구현할 기능 목록
* 게임을 진행할 메소드 정의
* 변수 초기화 하기
* 컴퓨터의 숫자 정하기
* 컴퓨터의 숫자 카운트하기(어떤 숫자가 등장했는지)
* 숫자 입력받기
* 결과 구하기
* 결과 출력하기
* 계속할지 여부 묻기
* 테스트 코드 작성하기
119 changes: 119 additions & 0 deletions src/main/java/NumberBaseball.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
import java.util.Arrays;

public class NumberBaseball {
final int NUMBER_COUNT = 3;
final int MAX_NUM = 9;
final int MIN_NUM = 1;
final int CONTINUE = 1;
final int END = 2;
int[] random_numbers = new int[NUMBER_COUNT];
boolean[] random_numbers_count = new boolean[MAX_NUM + 1];
int[] input_numbers = new int[NUMBER_COUNT];
int strike;
int ball;

public void initialize_parameter(){
Arrays.fill(random_numbers, 0);
Arrays.fill(random_numbers_count, false);
Arrays.fill(input_numbers, 0);
strike = 0;
ball = 0;
}

public void generate_random_numbers() {
Integer[] numbers = new Integer[MAX_NUM + 1];
Arrays.setAll(numbers, i -> i + 1);
List<Integer> numberList = Arrays.asList(numbers);
Collections.shuffle(numberList);
for(int i = 0; i < NUMBER_COUNT; ++i){
random_numbers[i] = numberList.get(i);
}
}

public void get_input_numbers() {
System.out.print("숫자를 입력해주세요 : ");
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
for(int i = 0; i < NUMBER_COUNT; ++i){
input_numbers[i] = input.charAt(i) - '0';
}
}

public void get_random_numbers_count() {
for(int i = 0; i < NUMBER_COUNT; ++i){
random_numbers_count[random_numbers[i]] = true;
}
}

public void count_strike_or_ball(int idx) {
if(random_numbers[idx] == input_numbers[idx]){
++strike;
return;
}
if(random_numbers_count[input_numbers[idx]]){
++ball;
}
}

public void get_game_result() {
strike = 0;
ball = 0;
for(int i = 0; i < NUMBER_COUNT; ++i) {
count_strike_or_ball(i);
}
}

public void print_game_result() {
if(strike > 0){
System.out.print(strike + " 스트라이크 ");
}
if(ball > 0){
System.out.print(ball + "볼");
}
if(strike == 0 && ball == 0){
System.out.print("낫싱");
}
System.out.print("\n");
}

public boolean continue_or_end(int input){
if (input == CONTINUE){
return true;
}
if (input == END){
return false;
}
return false;
}

public boolean print_end_message(){
System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료");
System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요");
Scanner scanner = new Scanner(System.in);
int input = Integer.parseInt(scanner.nextLine());
return continue_or_end(input);
}

public boolean do_game() {
initialize_parameter();
generate_random_numbers();
get_random_numbers_count();
while(strike != NUMBER_COUNT) {
get_input_numbers();
get_game_result();
print_game_result();
}
return print_end_message();
}

public static void main(String[] args) {
NumberBaseball numberBaseball = new NumberBaseball();
boolean game_continue = true;
while(game_continue){
game_continue = numberBaseball.do_game();
}
}
}
103 changes: 103 additions & 0 deletions src/test/java/NumberBaseballTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;

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

public class NumberBaseballTest {
NumberBaseball numberBaseball = new NumberBaseball();

void set_random_numbers() {
numberBaseball.random_numbers[0] = 7;
numberBaseball.random_numbers[1] = 1;
numberBaseball.random_numbers[2] = 3;
}

void set_random_numbers_count() {
numberBaseball.random_numbers_count[1] = true;
numberBaseball.random_numbers_count[3] = true;
numberBaseball.random_numbers_count[7] = true;
}


void set_input_numbers_same() {
numberBaseball.input_numbers[0] = 7;
numberBaseball.input_numbers[1] = 1;
numberBaseball.input_numbers[2] = 3;
}

@Test
void initialize_parameter_test() {
numberBaseball.initialize_parameter();
assertThat(numberBaseball.random_numbers).containsOnly(0, 0, 0);
assertThat(numberBaseball.random_numbers_count).contains(false);
assertThat(numberBaseball.input_numbers).containsOnly(0, 0, 0);
assertThat(numberBaseball.strike).isEqualTo(0);
assertThat(numberBaseball.ball).isEqualTo(0);
}

@ParameterizedTest
@ValueSource(ints = {0, 1, 2})
void generate_random_numbers_test(int idx) {
numberBaseball.generate_random_numbers();
assertThat(numberBaseball.random_numbers[idx]).
isGreaterThanOrEqualTo(numberBaseball.MIN_NUM);
assertThat(numberBaseball.random_numbers[idx]).
isLessThanOrEqualTo(numberBaseball.MAX_NUM);
}


@Test
void get_random_numbers_count() {
set_random_numbers();
numberBaseball.get_random_numbers_count();
assertThat(numberBaseball.random_numbers_count[1]).isEqualTo(true);
assertThat(numberBaseball.random_numbers_count[3]).isEqualTo(true);
assertThat(numberBaseball.random_numbers_count[7]).isEqualTo(true);
}

@Test
void count_strike_test() {
set_random_numbers();
set_random_numbers_count();
numberBaseball.input_numbers[0] = 7;
numberBaseball.count_strike_or_ball(0);
assertThat(numberBaseball.strike).isEqualTo(1);
assertThat(numberBaseball.ball).isEqualTo(0);
}

@Test
void count_ball_test() {
set_random_numbers();
set_random_numbers_count();
numberBaseball.input_numbers[0] = 1;
numberBaseball.count_strike_or_ball(0);
assertThat(numberBaseball.strike).isEqualTo(0);
assertThat(numberBaseball.ball).isEqualTo(1);
}

@Test
void count_nothing_test() {
set_random_numbers();
set_random_numbers_count();
numberBaseball.input_numbers[0] = 2;
numberBaseball.count_strike_or_ball(0);
assertThat(numberBaseball.strike).isEqualTo(0);
assertThat(numberBaseball.ball).isEqualTo(0);
}

@Test
void get_game_result_test() {
set_random_numbers();
set_input_numbers_same();
numberBaseball.get_game_result();
assertThat(numberBaseball.strike).isEqualTo(3);
assertThat(numberBaseball.ball).isEqualTo(0);
}

@Test
void continue_or_end_test() {
assertThat(numberBaseball.continue_or_end(1)).isEqualTo(true);
assertThat(numberBaseball.continue_or_end(2)).isEqualTo(false);
}
}
41 changes: 41 additions & 0 deletions src/test/java/study/SetTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
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;

public class SetTest {
private Set<Integer> numbers;

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

@Test
void test1() {
assertThat(numbers.size()).isEqualTo(3);
}

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

@ParameterizedTest
@CsvSource(value = {"1:true", "2:true", "3:true", "4:false", "5:false"}, delimiter = ':')
void test3(String number, String expected){
assertThat(numbers.contains(Integer.parseInt(number))).isEqualTo(expected.equals("true"));
}
}
33 changes: 33 additions & 0 deletions src/test/java/study/StringTest.java
Original file line number Diff line number Diff line change
@@ -1,13 +1,46 @@
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.assertThatIndexOutOfBoundsException;

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

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

String[] split_test2 = "1".split(",");
assertThat(split_test2).containsExactly("1");
}

@Test
void test2() {
String test = "(1,2)";
String substring_test = test.substring(1, test.length()-1);
assertThat(substring_test).isEqualTo("1,2");
}

@Test
void test3_1() {
String test = "abc";
assertThat(test.charAt(1)).isEqualTo('b');
}

@Test
@DisplayName("Test string charAt exception")
void test3_2() {
String test = "abc";
assertThatIndexOutOfBoundsException().isThrownBy(() ->{
test.charAt(4);
}).withFailMessage("Index: \\d+");
}
}